src/ai/api/ai_vehicle.cpp
branchnoai
changeset 9654 b836eb5c521f
parent 9637 9f78a12a4f53
child 9662 67a558a1aeb8
--- 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;
 	}
 }