src/ai/api/ai_vehicle.cpp
branchnoai
changeset 9672 18c71ca987e4
parent 9662 67a558a1aeb8
child 9684 623970482fb2
--- a/src/ai/api/ai_vehicle.cpp	Wed Jul 18 09:23:35 2007 +0000
+++ b/src/ai/api/ai_vehicle.cpp	Wed Jul 18 10:53:58 2007 +0000
@@ -21,57 +21,77 @@
 	return ::IsValidVehicleID(vehicle_id) && ::GetVehicle(vehicle_id)->owner == _current_player;
 }
 
-EngineID AIVehicle::FindBestVehicle(CargoID cargo, uint8 min_reliability, VehicleType veh_type)
+EngineID AIVehicle::FindBestVehicle(CargoID cargo, uint8 min_reliability, VehicleType veh_type, uint max_cost)
 {
 	if (!AICargo::IsValidCargo(cargo) || min_reliability > 100) return INVALID_ENGINE;
 
 	EngineID best_engine = INVALID_ENGINE;
 	EngineID engine_id;
 	uint best_cargo = 0;
+	uint best_speed = 0;
 
 	FOR_ALL_ENGINEIDS_OF_TYPE(engine_id, veh_type) {
 		/* Is the vehicle available for this player */
 		if (IsEngineBuildable(engine_id, veh_type, _current_player) &&
 				GetEngine(engine_id)->reliability * 100 >= min_reliability << 16) {
+			uint cspeed, ccargo;
+			/* Can this vehicle handle the cargo requested? */
 			switch (veh_type) {
-				case VEH_ROAD: if (RoadVehInfo(engine_id)->cargo_type != cargo && !CanRefitTo(engine_id, cargo)) continue; break;
-				case VEH_TRAIN: if (RailVehInfo(engine_id)->cargo_type != cargo && !CanRefitTo(engine_id, cargo)) continue; break;
-				case VEH_SHIP: if (ShipVehInfo(engine_id)->cargo_type != cargo && !CanRefitTo(engine_id, cargo)) continue; break;
-				case VEH_AIRCRAFT: if (cargo != CT_PASSENGERS && !CanRefitTo(engine_id, cargo)) continue; break;
+				case VEH_ROAD: {
+					const RoadVehicleInfo *vi = RoadVehInfo(engine_id);
+					if (vi->cargo_type != cargo && !CanRefitTo(engine_id, cargo)) continue;
+					if ((_price.roadveh_base >> 3) * vi->base_cost >> 5 > max_cost) continue;
+					ccargo = vi->capacity;
+					cspeed = vi->max_speed;
+				} break;
+
+				case VEH_TRAIN: {
+					const RailVehicleInfo *vi = RailVehInfo(engine_id);
+					if (vi->cargo_type != cargo && !CanRefitTo(engine_id, cargo)) continue;
+					if ((_price.build_railvehicle >> 3) * vi->base_cost >> 5 > max_cost) continue;
+					ccargo = vi->capacity;
+					cspeed = vi->max_speed;
+				} break;
+
+				case VEH_SHIP: {
+					const ShipVehicleInfo *vi = ShipVehInfo(engine_id);
+					if (vi->cargo_type != cargo && !CanRefitTo(engine_id, cargo)) continue;
+					if ((_price.ship_base >> 3) * vi->base_cost >> 5 > max_cost) continue;
+					ccargo = vi->capacity;
+					cspeed = vi->max_speed;
+				} break;
+
+				case VEH_AIRCRAFT: {
+					const AircraftVehicleInfo *vi = AircraftVehInfo(engine_id);
+					if (CT_PASSENGERS != cargo && CT_MAIL != cargo && !CanRefitTo(engine_id, cargo)) continue;
+					if ((_price.aircraft_base >> 3) * vi->base_cost >> 5 > max_cost) continue;
+					ccargo = vi->passenger_capacity;
+					cspeed = vi->max_speed;
+				} break;
+
 				default: NOT_REACHED();
 			}
-			switch (veh_type) {
-				case VEH_ROAD:
-				case VEH_TRAIN:
-				case VEH_SHIP:
-					best_engine = engine_id;
-					break;
-				case VEH_AIRCRAFT:
-					if (cargo != CT_MAIL && best_cargo < AircraftVehInfo(engine_id)->passenger_capacity) {
-						best_engine = engine_id;
-						best_cargo = AircraftVehInfo(engine_id)->passenger_capacity;
-					}
-					if (cargo == CT_MAIL && best_cargo < AircraftVehInfo(engine_id)->mail_capacity) {
-						best_engine = engine_id;
-						best_cargo = AircraftVehInfo(engine_id)->mail_capacity;
-					}
-					break;
-				default: NOT_REACHED();
-			}
+
+			/* Sort on speed, than on cargo, than on order of engine-array */
+			if (best_speed > cspeed) continue;
+			if (best_cargo > ccargo) continue;
+			best_engine = engine_id;
+			best_speed = cspeed;
+			best_cargo = ccargo;
 		}
 	}
 
 	return best_engine;
 }
 
-EngineID AIVehicle::FindBestRoadVehicle(CargoID cargo, uint8 min_reliability)
+EngineID AIVehicle::FindBestRoadVehicle(CargoID cargo, uint8 min_reliability, uint max_cost)
 {
-	return this->FindBestVehicle(cargo, min_reliability, VEH_ROAD);
+	return this->FindBestVehicle(cargo, min_reliability, VEH_ROAD, max_cost);
 }
 
-EngineID AIVehicle::FindBestAircraftVehicle(CargoID cargo, uint8 min_reliability)
+EngineID AIVehicle::FindBestAircraftVehicle(CargoID cargo, uint8 min_reliability, uint max_cost)
 {
-	return this->FindBestVehicle(cargo, min_reliability, VEH_AIRCRAFT);
+	return this->FindBestVehicle(cargo, min_reliability, VEH_AIRCRAFT, max_cost);
 }
 
 VehicleID AIVehicle::BuildVehicle(TileIndex depot, EngineID engine_id)