diff options
-rw-r--r-- | ai.c | 143 | ||||
-rw-r--r-- | ai_build.c | 79 | ||||
-rw-r--r-- | ai_new.c | 32 | ||||
-rw-r--r-- | ai_pathfinder.c | 49 | ||||
-rw-r--r-- | command.h | 5 |
5 files changed, 150 insertions, 158 deletions
@@ -121,7 +121,7 @@ static int AiChooseTrainToBuild(byte railtype, int32 money, byte flag, TileIndex { int best_veh_index = -1; byte best_veh_score = 0; - int32 r; + int32 ret; int i; for (i = 0; i < NUM_TRAIN_ENGINES; i++) { @@ -132,10 +132,8 @@ static int AiChooseTrainToBuild(byte railtype, int32 money, byte flag, TileIndex || !HASBIT(e->player_avail, _current_player) || e->reliability < 0x8A3D) continue; - r = DoCommandByTile(tile, i, 0, 0, CMD_BUILD_RAIL_VEHICLE); - if (r != CMD_ERROR && - (!(_cmd_build_rail_veh_var1&1) || !(flag&1)) && - r <= money && + ret = DoCommandByTile(tile, i, 0, 0, CMD_BUILD_RAIL_VEHICLE); + if (!CmdFailed(ret) && (!(_cmd_build_rail_veh_var1&1) || !(flag&1)) && ret <= money && _cmd_build_rail_veh_score >= best_veh_score) { best_veh_score = _cmd_build_rail_veh_score; best_veh_index = i; @@ -149,7 +147,7 @@ static int AiChooseRoadVehToBuild(byte cargo, int32 money, TileIndex tile) { int best_veh_index = -1; int32 best_veh_cost = 0; - int32 r; + int32 ret; int i = _cargoc.ai_roadveh_start[cargo]; int end = i + _cargoc.ai_roadveh_count[cargo]; @@ -158,9 +156,9 @@ static int AiChooseRoadVehToBuild(byte cargo, int32 money, TileIndex tile) if (!HASBIT(e->player_avail, _current_player) || e->reliability < 0x8A3D) continue; - r = DoCommandByTile(tile, i, 0, 0, CMD_BUILD_ROAD_VEH); - if (r != CMD_ERROR && r <= money && r >= best_veh_cost) { - best_veh_cost = r; + ret = DoCommandByTile(tile, i, 0, 0, CMD_BUILD_ROAD_VEH); + if (!CmdFailed(ret) && ret <= money && ret >= best_veh_cost) { + best_veh_cost = ret; best_veh_index = i; } } while (++e, ++i != end); @@ -172,7 +170,7 @@ static int AiChooseAircraftToBuild(int32 money, byte flag) { int best_veh_index = -1; int32 best_veh_cost = 0; - int32 r; + int32 ret; int i = AIRCRAFT_ENGINES_INDEX; int end = i + NUM_AIRCRAFT_ENGINES; @@ -187,9 +185,9 @@ static int AiChooseAircraftToBuild(int32 money, byte flag) if (i>=253) continue; } - r = DoCommandByTile(0, i, 0, 0, CMD_BUILD_AIRCRAFT); - if (r != CMD_ERROR && r <= money && r >= best_veh_cost) { - best_veh_cost = r; + ret = DoCommandByTile(0, i, 0, 0, CMD_BUILD_AIRCRAFT); + if (!CmdFailed(ret) && ret <= money && ret >= best_veh_cost) { + best_veh_cost = ret; best_veh_index = i; } } while (++e, ++i != end); @@ -272,7 +270,7 @@ static void AiRestoreVehicleOrders(Vehicle *v, BackuppedOrders *bak) int i; for (i = 0; bak->order[i].type != OT_NOTHING; i++) - if (!DoCommandP(0, v->index + (i << 16), PackOrder(&bak->order[i]), NULL, CMD_INSERT_ORDER | CMD_NO_TEST_IF_IN_NETWORK)) + if (CmdFailed(DoCommandP(0, v->index + (i << 16), PackOrder(&bak->order[i]), NULL, CMD_INSERT_ORDER | CMD_NO_TEST_IF_IN_NETWORK))) break; } @@ -294,8 +292,8 @@ static void AiHandleReplaceTrain(Player *p) BackupVehicleOrders(v, orderbak); tile = v->tile; - if (DoCommandByTile(0, v->index, 2, DC_EXEC, CMD_SELL_RAIL_WAGON) != CMD_ERROR && - DoCommandByTile(tile, veh, 0, DC_EXEC, CMD_BUILD_RAIL_VEHICLE) != CMD_ERROR) { + if (!CmdFailed(DoCommandByTile(0, v->index, 2, DC_EXEC, CMD_SELL_RAIL_WAGON)) && + !CmdFailed(DoCommandByTile(tile, veh, 0, DC_EXEC, CMD_BUILD_RAIL_VEHICLE)) ) { veh = _new_train_id; AiRestoreVehicleOrders(GetVehicle(veh), orderbak); DoCommandByTile(0, veh, 0, DC_EXEC, CMD_START_STOP_TRAIN); @@ -322,8 +320,8 @@ static void AiHandleReplaceRoadVeh(Player *p) BackupVehicleOrders(v, orderbak); tile = v->tile; - if (DoCommandByTile(0, v->index, 0, DC_EXEC, CMD_SELL_ROAD_VEH) != CMD_ERROR && - DoCommandByTile(tile, veh, 0, DC_EXEC, CMD_BUILD_ROAD_VEH) != CMD_ERROR) { + if (!CmdFailed(DoCommandByTile(0, v->index, 0, DC_EXEC, CMD_SELL_ROAD_VEH)) && + !CmdFailed(DoCommandByTile(tile, veh, 0, DC_EXEC, CMD_BUILD_ROAD_VEH)) ) { veh = _new_roadveh_id; AiRestoreVehicleOrders(GetVehicle(veh), orderbak); DoCommandByTile(0, veh, 0, DC_EXEC, CMD_START_STOP_ROADVEH); @@ -350,8 +348,8 @@ static void AiHandleReplaceAircraft(Player *p) BackupVehicleOrders(v, orderbak); tile = v->tile; - if (DoCommandByTile(0, v->index, 0, DC_EXEC, CMD_SELL_AIRCRAFT) != CMD_ERROR && - DoCommandByTile(tile, veh, 0, DC_EXEC, CMD_BUILD_AIRCRAFT) != CMD_ERROR) { + if (!CmdFailed(DoCommandByTile(0, v->index, 0, DC_EXEC, CMD_SELL_AIRCRAFT)) && + !CmdFailed(DoCommandByTile(tile, veh, 0, DC_EXEC, CMD_BUILD_AIRCRAFT)) ) { veh = _new_aircraft_id; AiRestoreVehicleOrders(GetVehicle(veh), orderbak); DoCommandByTile(0, veh, 0, DC_EXEC, CMD_START_STOP_AIRCRAFT); @@ -1567,7 +1565,7 @@ static bool AiCheckTrackResources(TileIndex tile, const AiDefaultBlockData *p, b static int32 AiDoBuildDefaultRailTrack(TileIndex tile, const AiDefaultBlockData *p, byte flag) { - int32 r; + int32 ret; int32 total_cost = 0; Town *t = NULL; int rating = 0; @@ -1582,14 +1580,14 @@ static int32 AiDoBuildDefaultRailTrack(TileIndex tile, const AiDefaultBlockData if (p->mode < 2) { if (p->mode == 0) { // Depot - r = DoCommandByTile(c, _cur_ai_player->ai.railtype_to_use, p->attr, flag | DC_AUTO | DC_NO_WATER | DC_AI_BUILDING, CMD_BUILD_TRAIN_DEPOT); + ret = DoCommandByTile(c, _cur_ai_player->ai.railtype_to_use, p->attr, flag | DC_AUTO | DC_NO_WATER | DC_AI_BUILDING, CMD_BUILD_TRAIN_DEPOT); } else { // Station - r = DoCommandByTile(c, (p->attr&1) | (p->attr>>4)<<8 | (p->attr>>1&7)<<16, _cur_ai_player->ai.railtype_to_use, flag | DC_AUTO | DC_NO_WATER | DC_AI_BUILDING, CMD_BUILD_RAILROAD_STATION); + ret = DoCommandByTile(c, (p->attr&1) | (p->attr>>4)<<8 | (p->attr>>1&7)<<16, _cur_ai_player->ai.railtype_to_use, flag | DC_AUTO | DC_NO_WATER | DC_AI_BUILDING, CMD_BUILD_RAILROAD_STATION); } - if (r == CMD_ERROR) return CMD_ERROR; - total_cost += r; + if (CmdFailed(ret)) return CMD_ERROR; + total_cost += ret; clear_town_stuff:; if (_cleared_town != NULL) { @@ -1610,36 +1608,35 @@ clear_town_stuff:; for(i=0; i!=6; i++,j>>=1) { if (j&1) { k = i; - r = DoCommandByTile(c, _cur_ai_player->ai.railtype_to_use, i, flag | DC_AUTO | DC_NO_WATER, CMD_BUILD_SINGLE_RAIL); - if (r == CMD_ERROR) return CMD_ERROR; - total_cost += r; + ret = DoCommandByTile(c, _cur_ai_player->ai.railtype_to_use, i, flag | DC_AUTO | DC_NO_WATER, CMD_BUILD_SINGLE_RAIL); + if (CmdFailed(ret)) return CMD_ERROR; + total_cost += ret; } } /* signals too? */ if (j&3) { // Can't build signals on a road. - if (IsTileType(c, MP_STREET)) - return CMD_ERROR; + if (IsTileType(c, MP_STREET)) return CMD_ERROR; if (flag & DC_EXEC) { j = 4 - j; do { - r = DoCommandByTile(c, k, 0, flag, CMD_BUILD_SIGNALS); + ret = DoCommandByTile(c, k, 0, flag, CMD_BUILD_SIGNALS); } while (--j); } else { - r = _price.build_signals; + ret = _price.build_signals; } - if (r == CMD_ERROR) return CMD_ERROR; - total_cost += r; + if (CmdFailed(ret)) return CMD_ERROR; + total_cost += ret; } } else if (p->mode == 3) { //Clear stuff and then build single rail. if (GetTileSlope(c,NULL) != 0) return CMD_ERROR; - r = DoCommandByTile(c, 0, 0, flag | DC_AUTO | DC_NO_WATER | DC_AI_BUILDING, CMD_LANDSCAPE_CLEAR); - if (r == CMD_ERROR) return CMD_ERROR; - total_cost += r + _price.build_rail; + ret = DoCommandByTile(c, 0, 0, flag | DC_AUTO | DC_NO_WATER | DC_AI_BUILDING, CMD_LANDSCAPE_CLEAR); + if (CmdFailed(ret)) return CMD_ERROR; + total_cost += ret + _price.build_rail; if (flag & DC_EXEC) { DoCommandByTile(c, _cur_ai_player->ai.railtype_to_use, p->attr&1, flag | DC_AUTO | DC_NO_WATER | DC_AI_BUILDING, CMD_BUILD_SINGLE_RAIL); @@ -1976,8 +1973,8 @@ static inline void AiCheckBuildRailBridgeHere(AiRailFinder *arf, TileIndex tile, } // Is building a (rail)bridge possible at this place (type doesn't matter)? - if (DoCommandByTile(tile_new, tile, 0 | arf->player->ai.railtype_to_use << 8, - DC_AUTO, CMD_BUILD_BRIDGE) == CMD_ERROR) + if (CmdFailed(DoCommandByTile(tile_new, tile, 0 | arf->player->ai.railtype_to_use << 8, + DC_AUTO, CMD_BUILD_BRIDGE)) ) return; AiBuildRailRecursive(arf, tile_new, dir2); @@ -1996,7 +1993,7 @@ static inline void AiCheckBuildRailTunnelHere(AiRailFinder *arf, TileIndex tile, if (arf->ti.tileh == _dir_table_2[p[0]&3] && arf->ti.z!=0) { int32 cost = DoCommandByTile(tile, arf->player->ai.railtype_to_use, 0, DC_AUTO, CMD_BUILD_TUNNEL); - if (cost != CMD_ERROR && cost <= (arf->player->player_money>>4)) { + if (!CmdFailed(cost) && cost <= (arf->player->player_money>>4)) { AiBuildRailRecursive(arf, _build_tunnel_endtile, p[0]&3); if (arf->depth == 1) { AiCheckRailPathBetter(arf, p); @@ -2054,7 +2051,7 @@ static void AiBuildRailRecursive(AiRailFinder *arf, TileIndex tile, int dir) do { // Make sure the tile is not in the list of banned tiles and that a rail can be built here. if (!AiIsTileBanned(arf->player, tile, p[0]) && - DoCommandByTile(tile, arf->player->ai.railtype_to_use, p[0], DC_AUTO | DC_NO_WATER | DC_NO_RAIL_OVERLAP, CMD_BUILD_SINGLE_RAIL) != CMD_ERROR) { + !CmdFailed(DoCommandByTile(tile, arf->player->ai.railtype_to_use, p[0], DC_AUTO | DC_NO_WATER | DC_NO_RAIL_OVERLAP, CMD_BUILD_SINGLE_RAIL))) { AiBuildRailRecursive(arf, tile, p[1]); } @@ -2142,7 +2139,7 @@ static void AiBuildRailConstruct(Player *p) for (i = MAX_BRIDGES - 1; i != 0; i--) { if (CheckBridge_Stuff(i, bridge_len)) { int32 cost = DoCommandByTile(arf.bridge_end_tile, p->ai.cur_tile_a, i | (p->ai.railtype_to_use << 8), DC_AUTO, CMD_BUILD_BRIDGE); - if (cost != CMD_ERROR && cost < (p->player_money >> 5)) + if (!CmdFailed(cost) && cost < (p->player_money >> 5)) break; } } @@ -2183,7 +2180,7 @@ static bool AiRemoveTileAndGoForward(Player *p) if (IsTileType(tile, MP_TUNNELBRIDGE)) { if (!(_map5[tile] & 0x80)) { // Clear the tunnel and continue at the other side of it. - if (DoCommandByTile(tile, 0, 0, DC_EXEC, CMD_LANDSCAPE_CLEAR) == CMD_ERROR) + if (CmdFailed(DoCommandByTile(tile, 0, 0, DC_EXEC, CMD_LANDSCAPE_CLEAR)) ) return false; p->ai.cur_tile_a = TILE_MASK(_build_tunnel_endtile - TileOffsByDir(p->ai.cur_dir_a)); return true; @@ -2204,7 +2201,7 @@ static bool AiRemoveTileAndGoForward(Player *p) tilenew = TILE_MASK(tile - offs); // And clear the bridge. - if (DoCommandByTile(tile, 0, 0, DC_EXEC, CMD_LANDSCAPE_CLEAR) == CMD_ERROR) + if (CmdFailed(DoCommandByTile(tile, 0, 0, DC_EXEC, CMD_LANDSCAPE_CLEAR)) ) return false; p->ai.cur_tile_a = tilenew; return true; @@ -2226,7 +2223,7 @@ static bool AiRemoveTileAndGoForward(Player *p) } // And also remove the rail. - if (DoCommandByTile(tile, 0, bit, DC_EXEC, CMD_REMOVE_SINGLE_RAIL) == CMD_ERROR) + if (CmdFailed(DoCommandByTile(tile, 0, bit, DC_EXEC, CMD_REMOVE_SINGLE_RAIL)) ) return false; // Find the direction at the other edge of the rail. @@ -2382,7 +2379,7 @@ static void AiStateBuildRailVeh(Player *p) if (p->ai.wagon_list[i] == INVALID_VEHICLE) { veh = _cargoc.ai_railwagon[p->ai.railtype_to_use][cargo]; cost = DoCommandByTile(tile, veh, 0, DC_EXEC, CMD_BUILD_RAIL_VEHICLE); - if (cost == CMD_ERROR) goto handle_nocash; + if (CmdFailed(cost)) goto handle_nocash; p->ai.wagon_list[i] = _new_wagon_id; p->ai.wagon_list[i+1] = INVALID_VEHICLE; return; @@ -2401,7 +2398,7 @@ handle_nocash: if (++p->ai.state_counter == 1000) { for(i=0; p->ai.wagon_list[i] != INVALID_VEHICLE; i++) { cost = DoCommandByTile(tile, p->ai.wagon_list[i], 0, DC_EXEC, CMD_SELL_RAIL_WAGON); - assert(cost != CMD_ERROR); + assert(!CmdFailed(cost)); } p->ai.state = AIS_0; } @@ -2410,7 +2407,7 @@ handle_nocash: // Try to build the locomotive cost = DoCommandByTile(tile, veh, 0, DC_EXEC, CMD_BUILD_RAIL_VEHICLE); - assert(cost != CMD_ERROR); + assert(!CmdFailed(cost)); loco_id = _new_train_id; // Sell a vehicle if the train is double headed. @@ -2531,7 +2528,7 @@ static int AiFindBestDefaultRoadBlock(TileIndex tile, byte direction, byte cargo static int32 AiDoBuildDefaultRoadBlock(TileIndex tile, const AiDefaultBlockData *p, byte flag) { - int32 r; + int32 ret; int32 total_cost = 0; Town *t = NULL; int rating = 0; @@ -2553,30 +2550,29 @@ static int32 AiDoBuildDefaultRoadBlock(TileIndex tile, const AiDefaultBlockData continue; } - r = DoCommandByTile(c, p->attr, 0, flag | DC_AUTO | DC_NO_WATER, CMD_BUILD_ROAD); - if (r == CMD_ERROR) - return CMD_ERROR; - total_cost += r; + ret = DoCommandByTile(c, p->attr, 0, flag | DC_AUTO | DC_NO_WATER, CMD_BUILD_ROAD); + if (CmdFailed(ret)) return CMD_ERROR; + total_cost += ret; continue; } if (p->mode == 0) { // Depot - r = DoCommandByTile(c, p->attr, 0, flag | DC_AUTO | DC_NO_WATER | DC_AI_BUILDING, CMD_BUILD_ROAD_DEPOT); + ret = DoCommandByTile(c, p->attr, 0, flag | DC_AUTO | DC_NO_WATER | DC_AI_BUILDING, CMD_BUILD_ROAD_DEPOT); goto clear_town_stuff; } else if (p->mode == 1) { if (_want_road_truck_station) { // Truck station - r = DoCommandByTile(c, p->attr, RS_TRUCK, flag | DC_AUTO | DC_NO_WATER | DC_AI_BUILDING, CMD_BUILD_ROAD_STOP); + ret = DoCommandByTile(c, p->attr, RS_TRUCK, flag | DC_AUTO | DC_NO_WATER | DC_AI_BUILDING, CMD_BUILD_ROAD_STOP); } else { // Bus station - r = DoCommandByTile(c, p->attr, RS_BUS, flag | DC_AUTO | DC_NO_WATER | DC_AI_BUILDING, CMD_BUILD_ROAD_STOP); + ret = DoCommandByTile(c, p->attr, RS_BUS, flag | DC_AUTO | DC_NO_WATER | DC_AI_BUILDING, CMD_BUILD_ROAD_STOP); } clear_town_stuff:; - if (r == CMD_ERROR) return CMD_ERROR; - total_cost += r; + if (CmdFailed(ret)) return CMD_ERROR; + total_cost += ret; if (_cleared_town != NULL) { if (t != NULL && t != _cleared_town) @@ -2592,8 +2588,8 @@ clear_town_stuff:; return CMD_ERROR; if (!(IsTileType(c, MP_STREET) && (_map5[c] & 0xF0) == 0)) { - r = DoCommandByTile(c, 0, 0, flag | DC_AUTO | DC_NO_WATER | DC_AI_BUILDING, CMD_LANDSCAPE_CLEAR); - if (r == CMD_ERROR) return CMD_ERROR; + ret = DoCommandByTile(c, 0, 0, flag | DC_AUTO | DC_NO_WATER | DC_AI_BUILDING, CMD_LANDSCAPE_CLEAR); + if (CmdFailed(ret)) return CMD_ERROR; } } @@ -2836,7 +2832,7 @@ static bool AiBuildRoadHelper(uint tile, int flags, int type) 1+2, 8+4, }; - return DoCommandByTile(tile, _road_bits[type], 0, flags, CMD_BUILD_ROAD) != CMD_ERROR; + return !CmdFailed(DoCommandByTile(tile, _road_bits[type], 0, flags, CMD_BUILD_ROAD)); } static inline void AiCheckBuildRoadBridgeHere(AiRoadFinder *arf, TileIndex tile, const byte *p) @@ -2867,7 +2863,7 @@ static inline void AiCheckBuildRoadBridgeHere(AiRoadFinder *arf, TileIndex tile, } // Is building a (rail)bridge possible at this place (type doesn't matter)? - if (DoCommandByTile(tile_new, tile, 0x8000, DC_AUTO, CMD_BUILD_BRIDGE) == CMD_ERROR) + if (CmdFailed(DoCommandByTile(tile_new, tile, 0x8000, DC_AUTO, CMD_BUILD_BRIDGE))) return; AiBuildRoadRecursive(arf, tile_new, dir2); @@ -2886,7 +2882,7 @@ static inline void AiCheckBuildRoadTunnelHere(AiRoadFinder *arf, TileIndex tile, if (arf->ti.tileh == _dir_table_2[p[0]&3] && arf->ti.z!=0) { int32 cost = DoCommandByTile(tile, 0x200, 0, DC_AUTO, CMD_BUILD_TUNNEL); - if (cost != CMD_ERROR && cost <= (arf->player->player_money>>4)) { + if (!CmdFailed(cost) && cost <= (arf->player->player_money>>4)) { AiBuildRoadRecursive(arf, _build_tunnel_endtile, p[0]&3); if (arf->depth == 1) { AiCheckRoadPathBetter(arf, p); @@ -3026,7 +3022,7 @@ do_some_terraform: for(i = 10; i != 0; i--) { if (CheckBridge_Stuff(i, bridge_len)) { int32 cost = DoCommandByTile(tile, p->ai.cur_tile_a, i + (0x80 << 8), DC_AUTO, CMD_BUILD_BRIDGE); - if (cost != CMD_ERROR && cost < (p->player_money >> 5)) + if (!CmdFailed(cost) && cost < (p->player_money >> 5)) break; } } @@ -3168,7 +3164,6 @@ static void AiStateBuildRoadVehicles(Player *p) const AiDefaultBlockData *ptr; uint tile,loco_id; int veh, i; - int32 cost; ptr = _road_default_block_data[p->ai.src.cur_building_rule]->data; for(;ptr->mode != 0;ptr++) {} @@ -3180,9 +3175,7 @@ static void AiStateBuildRoadVehicles(Player *p) return; } - cost = DoCommandByTile(tile, veh, 0, DC_EXEC, CMD_BUILD_ROAD_VEH); - if (cost == CMD_ERROR) - return; + if (CmdFailed(DoCommandByTile(tile, veh, 0, DC_EXEC, CMD_BUILD_ROAD_VEH))) return; loco_id = _new_roadveh_id; @@ -3336,15 +3329,14 @@ static void AiStateAirportStuff(Player *p) static int32 AiDoBuildDefaultAirportBlock(TileIndex tile, const AiDefaultBlockData *p, byte flag) { - int32 total_cost = 0, r; + int32 total_cost = 0, ret; for(;p->mode == 0;p++) { if (!HASBIT(_avail_aircraft, p->attr)) return CMD_ERROR; - r = DoCommandByTile(TILE_MASK(tile + ToTileIndexDiff(p->tileoffs)), p->attr,0,flag | DC_AUTO | DC_NO_WATER,CMD_BUILD_AIRPORT); - if (r == CMD_ERROR) - return CMD_ERROR; - total_cost += r; + ret = DoCommandByTile(TILE_MASK(tile + ToTileIndexDiff(p->tileoffs)), p->attr,0,flag | DC_AUTO | DC_NO_WATER,CMD_BUILD_AIRPORT); + if (CmdFailed(ret)) return CMD_ERROR; + total_cost += ret; } return total_cost; @@ -3489,7 +3481,6 @@ static void AiStateBuildAircraftVehicles(Player *p) const AiDefaultBlockData *ptr; uint tile; int veh; - int32 cost; int i; uint loco_id; @@ -3503,9 +3494,7 @@ static void AiStateBuildAircraftVehicles(Player *p) return; } - cost = DoCommandByTile(tile, veh, 0, DC_EXEC, CMD_BUILD_AIRCRAFT); - if (cost == CMD_ERROR) - return; + if (CmdFailed(DoCommandByTile(tile, veh, 0, DC_EXEC, CMD_BUILD_AIRCRAFT))) return; loco_id = _new_aircraft_id; for(i=0; p->ai.order_list_blocks[i] != 0xFF; i++) { diff --git a/ai_build.c b/ai_build.c index 55fab3fbc..1328bd535 100644 --- a/ai_build.c +++ b/ai_build.c @@ -12,7 +12,7 @@ // Params: // tile : tile where HQ is going to be build bool AiNew_Build_CompanyHQ(Player *p, uint tile) { - if (DoCommandByTile(tile, 0, 0, DC_AUTO | DC_NO_WATER, CMD_BUILD_COMPANY_HQ) == CMD_ERROR) + if (CmdFailed(DoCommandByTile(tile, 0, 0, DC_AUTO | DC_NO_WATER, CMD_BUILD_COMPANY_HQ))) return false; DoCommandByTile(tile, 0, 0, DC_EXEC | DC_AUTO | DC_NO_WATER, CMD_BUILD_COMPANY_HQ); return true; @@ -29,10 +29,11 @@ bool AiNew_Build_CompanyHQ(Player *p, uint tile) { int AiNew_Build_Station(Player *p, byte type, uint tile, byte length, byte numtracks, byte direction, byte flag) { if (type == AI_TRAIN) return DoCommandByTile(tile, direction + (numtracks << 8) + (length << 16), 0, flag | DC_AUTO | DC_NO_WATER, CMD_BUILD_RAILROAD_STATION); - else if (type == AI_BUS) + + if (type == AI_BUS) return DoCommandByTile(tile, direction, RS_BUS, flag | DC_AUTO | DC_NO_WATER, CMD_BUILD_ROAD_STOP); - else - return DoCommandByTile(tile, direction, RS_TRUCK, flag | DC_AUTO | DC_NO_WATER, CMD_BUILD_ROAD_STOP); + + return DoCommandByTile(tile, direction, RS_TRUCK, flag | DC_AUTO | DC_NO_WATER, CMD_BUILD_ROAD_STOP); } // Builds a brdige. The second best out of the ones available for this player @@ -61,8 +62,8 @@ int AiNew_Build_Bridge(Player *p, uint tile_a, uint tile_b, byte flag) { // Now, simply, build the bridge! if (p->ainew.tbt == AI_TRAIN) return DoCommandByTile(tile_a, tile_b, (0<<8) + type2, flag | DC_AUTO, CMD_BUILD_BRIDGE); - else - return DoCommandByTile(tile_a, tile_b, (0x80 << 8) + type2, flag | DC_AUTO, CMD_BUILD_BRIDGE); + + return DoCommandByTile(tile_a, tile_b, (0x80 << 8) + type2, flag | DC_AUTO, CMD_BUILD_BRIDGE); } @@ -97,7 +98,7 @@ int AiNew_Build_RoutePart(Player *p, Ai_PathFinderInfo *PathFinderInfo, byte fla cost += DoCommandByTile(route[part], 0, 0, flag, CMD_BUILD_TUNNEL); PathFinderInfo->position++; // TODO: problems! - if (cost == CMD_ERROR) { + if (CmdFailed(cost)) { DEBUG(ai,0)("[AiNew - BuildPath] We have a serious problem: tunnel could not be build!"); return 0; } @@ -108,7 +109,7 @@ int AiNew_Build_RoutePart(Player *p, Ai_PathFinderInfo *PathFinderInfo, byte fla cost += AiNew_Build_Bridge(p, route[part], route[part-1], flag); PathFinderInfo->position++; // TODO: problems! - if (cost == CMD_ERROR) { + if (CmdFailed(cost)) { DEBUG(ai,0)("[AiNew - BuildPath] We have a serious problem: bridge could not be build!"); return 0; } @@ -126,7 +127,7 @@ int AiNew_Build_RoutePart(Player *p, Ai_PathFinderInfo *PathFinderInfo, byte fla old_dir = dir; // Build the tile res = DoCommandByTile(route[part], 0, dir, flag, CMD_BUILD_SINGLE_RAIL); - if (res == CMD_ERROR) { + if (CmdFailed(res)) { // Problem.. let's just abort it all! p->ainew.state = AI_STATE_NOTHING; return 0; @@ -147,7 +148,7 @@ int AiNew_Build_RoutePart(Player *p, Ai_PathFinderInfo *PathFinderInfo, byte fla cost += DoCommandByTile(route[part], 0x200, 0, flag, CMD_BUILD_TUNNEL); PathFinderInfo->position++; // TODO: problems! - if (cost == CMD_ERROR) { + if (CmdFailed(cost)) { DEBUG(ai,0)("[AiNew - BuildPath] We have a serious problem: tunnel could not be build!"); return 0; } @@ -158,7 +159,7 @@ int AiNew_Build_RoutePart(Player *p, Ai_PathFinderInfo *PathFinderInfo, byte fla cost += AiNew_Build_Bridge(p, route[part], route[part+1], flag); PathFinderInfo->position++; // TODO: problems! - if (cost == CMD_ERROR) { + if (CmdFailed(cost)) { DEBUG(ai,0)("[AiNew - BuildPath] We have a serious problem: bridge could not be build!"); return 0; } @@ -181,15 +182,14 @@ int AiNew_Build_RoutePart(Player *p, Ai_PathFinderInfo *PathFinderInfo, byte fla // Build the tile res = DoCommandByTile(route[part], dir, 0, flag | DC_NO_WATER, CMD_BUILD_ROAD); // Currently, we ignore CMD_ERRORs! - if (res == CMD_ERROR && flag == DC_EXEC && !IsTileType(route[part], MP_STREET) && !EnsureNoVehicle(route[part])) { - // Problem.. let's just abort it all! - DEBUG(ai,0)("Darn, the route could not be builded.. aborting!"); - p->ainew.state = AI_STATE_NOTHING; - return 0; - } else { - if (res != CMD_ERROR) - cost += res; - } + if (CmdFailed(res) && flag == DC_EXEC && !IsTileType(route[part], MP_STREET) && !EnsureNoVehicle(route[part])) { + // Problem.. let's just abort it all! + DEBUG(ai,0)("Darn, the route could not be builded.. aborting!"); + p->ainew.state = AI_STATE_NOTHING; + return 0; + } + + if (!CmdFailed(res)) cost += res; } // Go to the next tile part++; @@ -213,7 +213,7 @@ int AiNew_PickVehicle(Player *p) { // Not supported yet return -1; } else { - int start, count, i, r = CMD_ERROR; + int start, count, i, ret = CMD_ERROR; start = _cargoc.ai_roadveh_start[p->ainew.cargo]; count = _cargoc.ai_roadveh_count[p->ainew.cargo]; @@ -223,11 +223,11 @@ int AiNew_PickVehicle(Player *p) { // Also, check if the reliability of the vehicle is above the AI_VEHICLE_MIN_RELIABILTY if (!HASBIT(_engines[i].player_avail, _current_player) || _engines[i].reliability * 100 < AI_VEHICLE_MIN_RELIABILTY << 16) continue; // Can we build it? - r = DoCommandByTile(0, i, 0, DC_QUERY_COST, CMD_BUILD_ROAD_VEH); - if (r != CMD_ERROR) break; + ret = DoCommandByTile(0, i, 0, DC_QUERY_COST, CMD_BUILD_ROAD_VEH); + if (!CmdFailed(ret)) break; } // We did not find a vehicle :( - if (r == CMD_ERROR) { return -1; } + if (CmdFailed(ret)) { return -1; } return i; } } @@ -237,25 +237,24 @@ int AiNew_Build_Vehicle(Player *p, uint tile, byte flag) { int i = AiNew_PickVehicle(p); if (i == -1) return CMD_ERROR; - if (p->ainew.tbt == AI_TRAIN) { + if (p->ainew.tbt == AI_TRAIN) return CMD_ERROR; - } else { - return DoCommandByTile(tile, i, 0, flag, CMD_BUILD_ROAD_VEH); - } + + return DoCommandByTile(tile, i, 0, flag, CMD_BUILD_ROAD_VEH); } -int AiNew_Build_Depot(Player *p, uint tile, byte direction, byte flag) { +int AiNew_Build_Depot(Player *p, uint tile, byte direction, byte flag) +{ static const byte _roadbits_by_dir[4] = {2,1,8,4}; - int r, r2; - if (p->ainew.tbt == AI_TRAIN) { + int ret, ret2; + if (p->ainew.tbt == AI_TRAIN) return DoCommandByTile(tile, 0, direction, flag | DC_AUTO | DC_NO_WATER, CMD_BUILD_TRAIN_DEPOT); - } else { - r = DoCommandByTile(tile, direction, 0, flag | DC_AUTO | DC_NO_WATER, CMD_BUILD_ROAD_DEPOT); - if (r == CMD_ERROR) return r; - // Try to build the road from the depot - r2 = DoCommandByTile(tile + TileOffsByDir(direction), _roadbits_by_dir[direction], 0, flag | DC_AUTO | DC_NO_WATER, CMD_BUILD_ROAD); - // If it fails, ignore it.. - if (r2 == CMD_ERROR) return r; - return r + r2; - } + + ret = DoCommandByTile(tile, direction, 0, flag | DC_AUTO | DC_NO_WATER, CMD_BUILD_ROAD_DEPOT); + if (CmdFailed(ret)) return ret; + // Try to build the road from the depot + ret2 = DoCommandByTile(tile + TileOffsByDir(direction), _roadbits_by_dir[direction], 0, flag | DC_AUTO | DC_NO_WATER, CMD_BUILD_ROAD); + // If it fails, ignore it.. + if (CmdFailed(ret2)) return ret; + return ret + ret2; } @@ -994,7 +994,7 @@ static void AiNew_State_BuildPath(Player *p) { // We don't want that, so try building some road left or right of the station int dir1, dir2, dir3; TileIndex tile; - int i, r; + int i, ret; for (i=0;i<2;i++) { if (i == 0) { tile = p->ainew.from_tile + TileOffsByDir(p->ainew.from_direction); @@ -1012,36 +1012,36 @@ static void AiNew_State_BuildPath(Player *p) { dir3 = p->ainew.to_direction; } - r = DoCommandByTile(tile, _roadbits_by_dir[dir1], 0, DC_EXEC | DC_NO_WATER, CMD_BUILD_ROAD); - if (r != CMD_ERROR) { + ret = DoCommandByTile(tile, _roadbits_by_dir[dir1], 0, DC_EXEC | DC_NO_WATER, CMD_BUILD_ROAD); + if (!CmdFailed(ret)) { dir1 = TileOffsByDir(dir1); if (IsTileType(tile + dir1, MP_CLEAR) || IsTileType(tile + dir1, MP_TREES)) { - r = DoCommandByTile(tile+dir1, AiNew_GetRoadDirection(tile, tile+dir1, tile+dir1+dir1), 0, DC_EXEC | DC_NO_WATER, CMD_BUILD_ROAD); - if (r != CMD_ERROR) { + ret = DoCommandByTile(tile+dir1, AiNew_GetRoadDirection(tile, tile+dir1, tile+dir1+dir1), 0, DC_EXEC | DC_NO_WATER, CMD_BUILD_ROAD); + if (!CmdFailed(ret)) { if (IsTileType(tile + dir1 + dir1, MP_CLEAR) || IsTileType(tile + dir1 + dir1, MP_TREES)) DoCommandByTile(tile+dir1+dir1, AiNew_GetRoadDirection(tile+dir1, tile+dir1+dir1, tile+dir1+dir1+dir1), 0, DC_EXEC | DC_NO_WATER, CMD_BUILD_ROAD); } } } - r = DoCommandByTile(tile, _roadbits_by_dir[dir2], 0, DC_EXEC | DC_NO_WATER, CMD_BUILD_ROAD); - if (r != CMD_ERROR) { + ret = DoCommandByTile(tile, _roadbits_by_dir[dir2], 0, DC_EXEC | DC_NO_WATER, CMD_BUILD_ROAD); + if (!CmdFailed(ret)) { dir2 = TileOffsByDir(dir2); if (IsTileType(tile + dir2, MP_CLEAR) || IsTileType(tile + dir2, MP_TREES)) { - r = DoCommandByTile(tile+dir2, AiNew_GetRoadDirection(tile, tile+dir2, tile+dir2+dir2), 0, DC_EXEC | DC_NO_WATER, CMD_BUILD_ROAD); - if (r != CMD_ERROR) { + ret = DoCommandByTile(tile+dir2, AiNew_GetRoadDirection(tile, tile+dir2, tile+dir2+dir2), 0, DC_EXEC | DC_NO_WATER, CMD_BUILD_ROAD); + if (!CmdFailed(ret)) { if (IsTileType(tile + dir2 + dir2, MP_CLEAR) || IsTileType(tile + dir2 + dir2, MP_TREES)) DoCommandByTile(tile+dir2+dir2, AiNew_GetRoadDirection(tile+dir2, tile+dir2+dir2, tile+dir2+dir2+dir2), 0, DC_EXEC | DC_NO_WATER, CMD_BUILD_ROAD); } } } - r = DoCommandByTile(tile, _roadbits_by_dir[dir3^2], 0, DC_EXEC | DC_NO_WATER, CMD_BUILD_ROAD); - if (r != CMD_ERROR) { + ret = DoCommandByTile(tile, _roadbits_by_dir[dir3^2], 0, DC_EXEC | DC_NO_WATER, CMD_BUILD_ROAD); + if (!CmdFailed(ret)) { dir3 = TileOffsByDir(dir3); if (IsTileType(tile + dir3, MP_CLEAR) || IsTileType(tile + dir3, MP_TREES)) { - r = DoCommandByTile(tile+dir3, AiNew_GetRoadDirection(tile, tile+dir3, tile+dir3+dir3), 0, DC_EXEC | DC_NO_WATER, CMD_BUILD_ROAD); - if (r != CMD_ERROR) { + ret = DoCommandByTile(tile+dir3, AiNew_GetRoadDirection(tile, tile+dir3, tile+dir3+dir3), 0, DC_EXEC | DC_NO_WATER, CMD_BUILD_ROAD); + if (!CmdFailed(ret)) { if (IsTileType(tile + dir3 + dir3, MP_CLEAR) || IsTileType(tile + dir3 + dir3, MP_TREES)) DoCommandByTile(tile+dir3+dir3, AiNew_GetRoadDirection(tile+dir3, tile+dir3+dir3, tile+dir3+dir3+dir3), 0, DC_EXEC | DC_NO_WATER, CMD_BUILD_ROAD); } @@ -1225,11 +1225,11 @@ static void AiNew_CheckVehicle(Player *p, Vehicle *v) { if (!AiNew_SetSpecialVehicleFlag(p, v, AI_VEHICLEFLAG_SELL)) return; { - int res = 0; + int ret = 0; if (v->type == VEH_Road) - res = DoCommandByTile(0, v->index, 0, DC_EXEC, CMD_SEND_ROADVEH_TO_DEPOT); + ret = DoCommandByTile(0, v->index, 0, DC_EXEC, CMD_SEND_ROADVEH_TO_DEPOT); // This means we can not find a depot :s -// if (res == CMD_ERROR) +// if (CmdFailed(ret)) } } } diff --git a/ai_pathfinder.c b/ai_pathfinder.c index 1d17017b6..4b6e15d20 100644 --- a/ai_pathfinder.c +++ b/ai_pathfinder.c @@ -13,22 +13,21 @@ // TODO: make it train compatible static bool TestCanBuildStationHere(uint tile, byte dir) { - Player *p = DEREF_PLAYER(_current_player); - if (dir == TEST_STATION_NO_DIR) { - // TODO: currently we only allow spots that can be access from al 4 directions... - // should be fixed!!! - for (dir=0;dir<4;dir++) { - int res = AiNew_Build_Station(p, p->ainew.tbt, tile, 1, 1, dir, DC_QUERY_COST); - if (res != CMD_ERROR) - return true; - } - return false; - } else { - int res = AiNew_Build_Station(p, p->ainew.tbt, tile, 1, 1, dir, DC_QUERY_COST); - if (res == CMD_ERROR) - return false; - } - return true; + Player *p = DEREF_PLAYER(_current_player); + + if (dir == TEST_STATION_NO_DIR) { + int32 ret; + // TODO: currently we only allow spots that can be access from al 4 directions... + // should be fixed!!! + for (dir=0;dir<4;dir++) { + ret = AiNew_Build_Station(p, p->ainew.tbt, tile, 1, 1, dir, DC_QUERY_COST); + if (!CmdFailed(ret)) return true; + } + return false; + } + + // return true if command succeeded, so the inverse of CmdFailed() + return !CmdFailed(AiNew_Build_Station(p, p->ainew.tbt, tile, 1, 1, dir, DC_QUERY_COST)); } @@ -191,7 +190,7 @@ static void AyStar_AiPathFinder_FoundEndNode(AyStar *aystar, OpenListNode *curre // What tiles are around us. static void AyStar_AiPathFinder_GetNeighbours(AyStar *aystar, OpenListNode *current) { uint i; - int r; + int ret; int dir; Ai_PathFinderInfo *PathFinderInfo = (Ai_PathFinderInfo*)aystar->user_target; @@ -248,8 +247,8 @@ static void AyStar_AiPathFinder_GetNeighbours(AyStar *aystar, OpenListNode *curr if (PathFinderInfo->rail_or_road) { // Rail check dir = AiNew_GetRailDirection(current->path.parent->node.tile, current->path.node.tile, current->path.node.tile + TileOffsByDir(i)); - r = DoCommandByTile(current->path.node.tile, 0, dir, DC_AUTO | DC_NO_WATER, CMD_BUILD_SINGLE_RAIL); - if (r == CMD_ERROR) continue; + ret = DoCommandByTile(current->path.node.tile, 0, dir, DC_AUTO | DC_NO_WATER, CMD_BUILD_SINGLE_RAIL); + if (CmdFailed(ret)) continue; #ifdef AI_PATHFINDER_NO_90DEGREES_TURN if (current->path.parent->parent != NULL) { // Check if we don't make a 90degree curve @@ -278,8 +277,8 @@ static void AyStar_AiPathFinder_GetNeighbours(AyStar *aystar, OpenListNode *curr } // Only destruct things if it is MP_CLEAR of MP_TREES if (dir != 0) { - r = DoCommandByTile(current->path.node.tile, dir, 0, DC_AUTO | DC_NO_WATER, CMD_BUILD_ROAD); - if (r == CMD_ERROR) continue; + ret = DoCommandByTile(current->path.node.tile, dir, 0, DC_AUTO | DC_NO_WATER, CMD_BUILD_ROAD); + if (CmdFailed(ret)) continue; } } @@ -320,8 +319,8 @@ static void AyStar_AiPathFinder_GetNeighbours(AyStar *aystar, OpenListNode *curr if (TILES_BETWEEN(new_tile,PathFinderInfo->end_tile_tl,PathFinderInfo->end_tile_br)) break; // Try building the bridge.. - r = DoCommandByTile(tile, new_tile, (0<<8) + (MAX_BRIDGES / 2), DC_AUTO, CMD_BUILD_BRIDGE); - if (r == CMD_ERROR) continue; + ret = DoCommandByTile(tile, new_tile, (0<<8) + (MAX_BRIDGES / 2), DC_AUTO, CMD_BUILD_BRIDGE); + if (CmdFailed(ret)) continue; // We can build a bridge here.. add him to the neighbours aystar->neighbours[aystar->num_neighbours].tile = new_tile; aystar->neighbours[aystar->num_neighbours].user_data[0] = AI_PATHFINDER_FLAG_BRIDGE + (dir << 8); @@ -339,9 +338,9 @@ static void AyStar_AiPathFinder_GetNeighbours(AyStar *aystar, OpenListNode *curr (dir == 2 && ti.tileh == 3) || (dir == 3 && ti.tileh == 9)) { // Now simply check if a tunnel can be build - r = DoCommandByTile(tile, (PathFinderInfo->rail_or_road?0:0x200), 0, DC_AUTO, CMD_BUILD_TUNNEL); + ret = DoCommandByTile(tile, (PathFinderInfo->rail_or_road?0:0x200), 0, DC_AUTO, CMD_BUILD_TUNNEL); FindLandscapeHeightByTile(&ti, _build_tunnel_endtile); - if (r != CMD_ERROR && (ti.tileh == 3 || ti.tileh == 6 || ti.tileh == 9 || ti.tileh == 12)) { + if (!CmdFailed(ret) && (ti.tileh == 3 || ti.tileh == 6 || ti.tileh == 9 || ti.tileh == 12)) { 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++].direction = 0; @@ -177,6 +177,11 @@ enum { //#define return_cmd_error(errcode) do { _error_message=(errcode); return CMD_ERROR; } while(0) #define return_cmd_error(errcode) do { return CMD_ERROR | (errcode); } while (0) +/** + * Check the return value of a DoCommand*() function + * @param res the resulting value from the command to be checked + * @return Return true if the command failed, false otherwise + */ static inline bool CmdFailed(int32 res) { // lower 16bits are the StringID of the possible error |