--- 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)