--- a/src/ai/api/ai_vehicle.cpp Fri Jul 13 19:54:59 2007 +0000
+++ b/src/ai/api/ai_vehicle.cpp Fri Jul 13 23:18:12 2007 +0000
@@ -20,18 +20,24 @@
return ::IsValidVehicleID(vehicle_id) && ::GetVehicle(vehicle_id)->owner == _current_player;
}
-EngineID AIVehicle::FindBestRoadVehicle(CargoID cargo, uint8 min_reliability)
+EngineID AIVehicle::FindBestVehicle(CargoID cargo, uint8 min_reliability, VehicleType veh_type)
{
if (!AICargo::IsValidCargo(cargo) || min_reliability > 100) return INVALID_ENGINE;
EngineID best_engine = INVALID_ENGINE;
EngineID engine_id;
- FOR_ALL_ENGINEIDS_OF_TYPE(engine_id, VEH_ROAD) {
+ FOR_ALL_ENGINEIDS_OF_TYPE(engine_id, veh_type) {
/* Is the vehicle available for this player */
- if (IsEngineBuildable(engine_id, VEH_ROAD, _current_player) &&
- GetEngine(engine_id)->reliability * 100 >= min_reliability << 16 &&
- (RoadVehInfo(engine_id)->cargo_type == cargo || CanRefitTo(engine_id, cargo))) {
+ if (IsEngineBuildable(engine_id, veh_type, _current_player) &&
+ GetEngine(engine_id)->reliability * 100 >= min_reliability << 16) {
+ 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;
+ default: NOT_REACHED();
+ }
best_engine = engine_id;
}
}
@@ -39,6 +45,16 @@
return best_engine;
}
+EngineID AIVehicle::FindBestRoadVehicle(CargoID cargo, uint8 min_reliability)
+{
+ return this->FindBestVehicle(cargo, min_reliability, VEH_ROAD);
+}
+
+EngineID AIVehicle::FindBestAircraftVehicle(CargoID cargo, uint8 min_reliability)
+{
+ return this->FindBestVehicle(cargo, min_reliability, VEH_AIRCRAFT);
+}
+
VehicleID AIVehicle::BuildVehicle(TileIndex depot, EngineID engine_id)
{
if (!this->IsValidEngine(engine_id)) return false;
@@ -49,7 +65,10 @@
bool ret;
switch (::GetEngine(engine_id)->type) {
case VEH_ROAD: ret = this->DoCommand(depot, engine_id, 0, CMD_BUILD_ROAD_VEH); break;
- default: NOT_REACHED(); return INVALID_VEHICLE; // TODO: implement trains, ships and aircraft
+ case VEH_TRAIN: ret = this->DoCommand(depot, engine_id, 0, CMD_BUILD_RAIL_VEHICLE); break;
+ case VEH_SHIP: ret = this->DoCommand(depot, engine_id, 0, CMD_BUILD_SHIP); break;
+ case VEH_AIRCRAFT: ret = this->DoCommand(depot, engine_id, 0, CMD_BUILD_AIRCRAFT); break;
+ default: NOT_REACHED(); return INVALID_VEHICLE;
}
return ret ? AIObject::GetNewVehicleID() : INVALID_VEHICLE;
@@ -62,12 +81,7 @@
/* Reset the internal NewVehicleID in case we are in TestMode */
AIObject::SetNewVehicleID(0);
- bool ret;
- switch (::GetVehicle(vehicle_id)->type) {
- case VEH_ROAD: ret = this->DoCommand(depot, vehicle_id, share_orders, CMD_CLONE_VEHICLE); break;
- default: return INVALID_VEHICLE; // TODO: implement trains, ships and aircraft
- }
-
+ bool ret = this->DoCommand(depot, vehicle_id, share_orders, CMD_CLONE_VEHICLE);
return ret ? AIObject::GetNewVehicleID() : INVALID_VEHICLE;
}
@@ -77,7 +91,10 @@
switch (::GetVehicle(vehicle_id)->type) {
case VEH_ROAD: return this->DoCommand(0, vehicle_id, cargo, CMD_REFIT_ROAD_VEH);
- default: return false; // TODO: implement trains, ships and aircraft
+ case VEH_TRAIN: return this->DoCommand(0, vehicle_id, cargo, CMD_REFIT_RAIL_VEHICLE);
+ case VEH_SHIP: return this->DoCommand(0, vehicle_id, cargo, CMD_REFIT_SHIP);
+ case VEH_AIRCRAFT: return this->DoCommand(0, vehicle_id, cargo, CMD_REFIT_AIRCRAFT);
+ default: return false;
}
}
@@ -88,7 +105,10 @@
switch (::GetVehicle(vehicle_id)->type) {
case VEH_ROAD: return this->DoCommand(0, vehicle_id, 0, CMD_SELL_ROAD_VEH);
- default: return false; // TODO: implement trains, ships and aircraft
+ case VEH_TRAIN: return this->DoCommand(0, vehicle_id, 0, CMD_SELL_RAIL_WAGON);
+ case VEH_SHIP: return this->DoCommand(0, vehicle_id, 0, CMD_SELL_SHIP);
+ case VEH_AIRCRAFT: return this->DoCommand(0, vehicle_id, 0, CMD_SELL_AIRCRAFT);
+ default: return false;
}
}
@@ -98,7 +118,10 @@
switch (::GetVehicle(vehicle_id)->type) {
case VEH_ROAD: return this->DoCommand(0, vehicle_id, 0, CMD_SEND_ROADVEH_TO_DEPOT);
- default: return false; // TODO: implement trains, ships and aircraft
+ case VEH_TRAIN: return this->DoCommand(0, vehicle_id, 0, CMD_SEND_TRAIN_TO_DEPOT);
+ case VEH_SHIP: return this->DoCommand(0, vehicle_id, 0, CMD_SEND_SHIP_TO_DEPOT);
+ case VEH_AIRCRAFT: return this->DoCommand(0, vehicle_id, 0, CMD_SEND_AIRCRAFT_TO_HANGAR);
+ default: return false;
}
}
@@ -108,7 +131,10 @@
switch (::GetVehicle(vehicle_id)->type) {
case VEH_ROAD: return this->DoCommand(0, vehicle_id, 0, CMD_START_STOP_ROADVEH);
- default: return false; // TODO: implement trains, ships and aircraft
+ case VEH_TRAIN: return this->DoCommand(0, vehicle_id, 0, CMD_START_STOP_TRAIN);
+ case VEH_SHIP: return this->DoCommand(0, vehicle_id, 0, CMD_START_STOP_SHIP);
+ case VEH_AIRCRAFT: return this->DoCommand(0, vehicle_id, 0, CMD_START_STOP_AIRCRAFT);
+ default: return false;
}
}