Changeset - r1713:410310936d0e
[Not reviewed]
master
0 5 0
Darkvater - 20 years ago 2005-04-20 22:30:40
darkvater@openttd.org
(svn r2217) - Fix: [ 1184201 ] AI orders its vehicles to a competitor's truck stop. Added a CmdFailed() check to all command returns of the AI instead of the simple == / != CMD_ERROR check. This should fix the problem.
5 files changed with 150 insertions and 158 deletions:
0 comments (0 inline, 0 general)
ai.c
Show inline comments
 
@@ -121,7 +121,7 @@ static int AiChooseTrainToBuild(byte rai
 
{
 
	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 rai
 
		    || !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 c
 
{
 
	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 c
 
		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
 
{
 
	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
 
			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(Vehic
 
	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 
 
		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(Playe
 
		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(Play
 
		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(TileIn
 

	
 
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(T
 
		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 AiCheckBuildRailBridg
 
		}
 

	
 
		// 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 AiCheckBuildRailTunne
 
	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(AiRailF
 
		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 
 
		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(Pla
 
	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(Pla
 

	
 
			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(Pla
 
	}
 

	
 
	// 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 *
 
		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(Ti
 

	
 
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(T
 
					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,
 
		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 AiCheckBuildRoadBridg
 
		}
 

	
 
		// 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 AiCheckBuildRoadTunne
 
	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(Pla
 
	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(Pla
 
		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 *
 

	
 
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
 
	const AiDefaultBlockData *ptr;
 
	uint tile;
 
	int veh;
 
	int32 cost;
 
	int i;
 
	uint loco_id;
 

	
 
@@ -3503,9 +3494,7 @@ static void AiStateBuildAircraftVehicles
 
		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++) {
ai_build.c
Show inline comments
 
@@ -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, ui
 
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 t
 
	// 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_
 
     		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_
 
     		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_
 
	     		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_
 
     		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_
 
     		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_
 
	     			// 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 
 
	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;
 
}
ai_new.c
Show inline comments
 
@@ -994,7 +994,7 @@ static void AiNew_State_BuildPath(Player
 
        	// 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
 
            		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
 

	
 
			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))
 
			}
 
		}
 
	}
ai_pathfinder.c
Show inline comments
 
@@ -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_FoundEnd
 
// 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_GetNeigh
 
       			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_GetNeigh
 
       				}
 
       				// 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_GetNeigh
 
    	    	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_GetNeigh
 
    		(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;
command.h
Show inline comments
 
@@ -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
0 comments (0 inline, 0 general)