(svn r7073) -Feature: Add cargo refit support to both AIs for road vehicles
This commit is contained in:
		@@ -177,14 +177,18 @@ static EngineID AiChooseRoadVehToBuild(CargoID cargo, int32 money, TileIndex til
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		/* Skip vehicles which can't take our cargo type */
 | 
			
		||||
		if (rvi->cargo_type != cargo) continue;
 | 
			
		||||
		if (rvi->cargo_type != cargo && !CanRefitTo(i, cargo)) continue;
 | 
			
		||||
 | 
			
		||||
		/* Rate and compare the engine by speed & capacity */
 | 
			
		||||
		rating = rvi->max_speed * rvi->capacity;
 | 
			
		||||
		if (rating <= best_veh_rating) continue;
 | 
			
		||||
 | 
			
		||||
		ret = DoCommand(tile, i, 0, 0, CMD_BUILD_ROAD_VEH);
 | 
			
		||||
		if (CmdFailed(ret) || ret > money) continue;
 | 
			
		||||
		if (CmdFailed(ret)) continue;
 | 
			
		||||
 | 
			
		||||
		/* Add the cost of refitting */
 | 
			
		||||
		if (rvi->cargo_type != cargo) ret += GetRefitCost(i);
 | 
			
		||||
		if (ret > money) continue;
 | 
			
		||||
 | 
			
		||||
		best_veh_rating = rating;
 | 
			
		||||
		best_veh_index = i;
 | 
			
		||||
@@ -3184,6 +3188,15 @@ static void AiStateBuildRoadVehicles(Player *p)
 | 
			
		||||
 | 
			
		||||
	loco_id = _new_vehicle_id;
 | 
			
		||||
 | 
			
		||||
	if (GetVehicle(loco_id)->cargo_type != p->ai.cargo_type) {
 | 
			
		||||
		/* Cargo type doesn't match, so refit it */
 | 
			
		||||
		if (CmdFailed(DoCommand(tile, loco_id, p->ai.cargo_type, DC_EXEC, CMD_REFIT_ROAD_VEH))) {
 | 
			
		||||
			/* Refit failed... sell the vehicle */
 | 
			
		||||
			DoCommand(tile, loco_id, 0, DC_EXEC, CMD_SELL_ROAD_VEH);
 | 
			
		||||
			return;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for (i = 0; p->ai.order_list_blocks[i] != 0xFF; i++) {
 | 
			
		||||
		const AiBuildRec* aib = &p->ai.src + p->ai.order_list_blocks[i];
 | 
			
		||||
		bool is_pass = (
 | 
			
		||||
 
 | 
			
		||||
@@ -246,7 +246,7 @@ EngineID AiNew_PickVehicle(Player *p)
 | 
			
		||||
			int32 ret;
 | 
			
		||||
 | 
			
		||||
			/* Skip vehicles which can't take our cargo type */
 | 
			
		||||
			if (rvi->cargo_type != p->ainew.cargo) continue;
 | 
			
		||||
			if (rvi->cargo_type != p->ainew.cargo && !CanRefitTo(i, p->ainew.cargo)) continue;
 | 
			
		||||
 | 
			
		||||
			// Is it availiable?
 | 
			
		||||
			// Also, check if the reliability of the vehicle is above the AI_VEHICLE_MIN_RELIABILTY
 | 
			
		||||
@@ -276,6 +276,17 @@ void CcAI(bool success, TileIndex tile, uint32 p1, uint32 p2)
 | 
			
		||||
	if (success) {
 | 
			
		||||
		p->ainew.state = AI_STATE_GIVE_ORDERS;
 | 
			
		||||
		p->ainew.veh_id = _new_vehicle_id;
 | 
			
		||||
 | 
			
		||||
		if (GetVehicle(p->ainew.veh_id)->cargo_type != p->ainew.cargo) {
 | 
			
		||||
			/* Cargo type doesn't match, so refit it */
 | 
			
		||||
			debug("doing refit");
 | 
			
		||||
			if (CmdFailed(DoCommand(tile, p->ainew.veh_id, p->ainew.cargo, DC_EXEC, CMD_REFIT_ROAD_VEH))) {
 | 
			
		||||
				debug("refit failed, selling");
 | 
			
		||||
				/* Refit failed, so sell the vehicle */
 | 
			
		||||
				DoCommand(tile, p->ainew.veh_id, 0, DC_EXEC, CMD_SELL_ROAD_VEH);
 | 
			
		||||
				p->ainew.state = AI_STATE_NOTHING;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	} else {
 | 
			
		||||
		/* XXX this should be handled more gracefully */
 | 
			
		||||
		p->ainew.state = AI_STATE_NOTHING;
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user