aircraft_cmd.c
changeset 1793 b9a37c98b468
parent 1790 47963a0cfca3
child 1802 da61740cc1e7
--- a/aircraft_cmd.c	Wed May 11 18:09:12 2005 +0000
+++ b/aircraft_cmd.c	Thu May 12 00:11:37 2005 +0000
@@ -41,11 +41,11 @@
  * INVALID_STATION is returned, if the player does not have any suitable
  * airports (like helipads only)
  */
-static uint16 FindNearestHangar(const Vehicle *v)
+static StationID FindNearestHangar(const Vehicle *v)
 {
 	const Station *st;
 	uint best = 0;
-	uint16 index = INVALID_STATION;
+	StationID index = INVALID_STATION;
 
 	FOR_ALL_STATIONS(st) {
 		if (st->owner == v->owner && st->facilities & FACIL_AIRPORT &&
@@ -153,13 +153,17 @@
 	return success;
 }
 
-int32 EstimateAircraftCost(uint16 engine_type)
+int32 EstimateAircraftCost(EngineID engine_type)
 {
 	return AircraftVehInfo(engine_type)->base_cost * (_price.aircraft_base>>3)>>5;
 }
 
 
-/* p1 = engine */
+/** Build an aircraft.
+ * @param x,y tile coordinates of depot where aircraft is built
+ * @param p1 aircraft type being built (engine)
+ * @param p2 unused
+ */
 int32 CmdBuildAircraft(int x, int y, uint32 flags, uint32 p1, uint32 p2)
 {
 	int32 value;
@@ -180,8 +184,7 @@
 
 	value = EstimateAircraftCost(p1);
 
-	if (flags & DC_QUERY_COST)
-		return value;
+	if (flags & DC_QUERY_COST) return value;
 
 	// allocate 2 or 3 vehicle structs, depending on type
 	if (!AllocateVehicles(vl, (avi->subtype & 1) == 0 ? 3 : 2) ||
@@ -299,7 +302,7 @@
 		VehiclePositionChanged(v);
 		VehiclePositionChanged(u);
 
-		// Aircraft with 3 vehicles?
+		// Aircraft with 3 vehicles (chopper)?
 		if (v->subtype == 0) {
 			w = vl[2];
 
@@ -323,10 +326,9 @@
 		InvalidateWindow(WC_VEHICLE_DEPOT, v->tile);
 		RebuildVehicleLists();
 		InvalidateWindow(WC_COMPANY, v->owner);
+		InvalidateWindow(WC_REPLACE_VEHICLE, VEH_Aircraft); //updates the replace Aircraft window
 	}
 
-	InvalidateWindow(WC_REPLACE_VEHICLE, VEH_Aircraft); //updates the replace Aircraft window
-
 	return value;
 }
 
@@ -381,16 +383,15 @@
 		// Invalidate depot
 		InvalidateWindow(WC_VEHICLE_DEPOT, v->tile);
 		DoDeleteAircraft(v);
+		InvalidateWindow(WC_REPLACE_VEHICLE, VEH_Aircraft); // updates the replace Aircraft window
 	}
 
-	InvalidateWindow(WC_REPLACE_VEHICLE, VEH_Aircraft); // updates the replace Aircraft window
-
 	return -(int32)v->value;
 }
 
 /** Start/Stop an aircraft.
  * @param x,y unused
- * @param p1 aircraft to start/stop
+ * @param p1 aircraft ID to start/stop
  * @param p2 unused
  */
 int32 CmdStartStopAircraft(int x, int y, uint32 flags, uint32 p1, uint32 p2)
@@ -417,20 +418,23 @@
 	return 0;
 }
 
-// p1 = vehicle
-// p2 = if set, the aircraft will try to goto a depot, but not stop
+/** Send an aircraft to the hangar.
+ * @param x,y unused
+ * @param p1 vehicle ID to send to the hangar
+ * @param p2 various bitmasked elements
+ * - p2 = 0      - aircraft goes to the depot and stays there (user command)
+ * - p2 non-zero - aircraft will try to goto a depot, but not stop there (eg forced servicing)
+ * - p2 (bit 17) - aircraft will try to goto a depot at the next airport
+ */
 int32 CmdSendAircraftToHangar(int x, int y, uint32 flags, uint32 p1, uint32 p2)
 {
 	Vehicle *v;
-	Station *st;
-	uint16 next_airport_index;
 
 	if (!IsVehicleIndex(p1)) return CMD_ERROR;
 
 	v = GetVehicle(p1);
 
-	if (v->type != VEH_Aircraft || !CheckOwnership(v->owner))
-		return CMD_ERROR;
+	if (v->type != VEH_Aircraft || !CheckOwnership(v->owner)) return CMD_ERROR;
 
 	if (v->current_order.type == OT_GOTO_DEPOT && p2 == 0) {
 		if (flags & DC_EXEC) {
@@ -441,23 +445,23 @@
 		}
 	} else {
 		bool next_airport_has_hangar = true;
-		next_airport_index = (HASBIT(p2, 17)) ? (int16)p2 : v->u.air.targetairport;
-		st = GetStation(next_airport_index);
+		/* XXX - I don't think p2 is any valid station cause all calls use either 0, 1, or 1<<16!!!!!!!!! */
+		StationID next_airport_index = (HASBIT(p2, 17)) ? (StationID)p2 : v->u.air.targetairport;
+		const Station *st = GetStation(next_airport_index);
 		// If an airport doesn't have terminals (so no landing space for airports),
 		// it surely doesn't have any hangars
-		if (st->xy == 0 || st->airport_tile == 0 ||
-				GetAirport(st->airport_type)->nof_depots == 0) {
-			if (p2 == 0) {
-				// the aircraft has to search for a hangar on its own
-				uint16 station = FindNearestHangar(v);
+		if (!IsValidStation(st) || st->airport_tile == 0 || GetAirport(st->airport_type)->nof_depots == 0) {
+			StationID station;
 
-				next_airport_has_hangar = false;
-				if (station == INVALID_STATION) return CMD_ERROR;
-				st = GetStation(station);
-				next_airport_index = station;
-			} else {
-				return CMD_ERROR;
-			}
+			if (p2 != 0) return CMD_ERROR;
+			// the aircraft has to search for a hangar on its own
+			station = FindNearestHangar(v);
+
+			next_airport_has_hangar = false;
+			if (station == INVALID_STATION) return CMD_ERROR;
+			st = GetStation(station);
+			next_airport_index = station;
+
 		}
 
 		if (flags & DC_EXEC) {
@@ -1594,7 +1598,7 @@
 		// only the vehicle owner needs to calculate the rest (locally)
 		if ((_autoreplace_array[v->engine_type] != v->engine_type) ||
 			(_patches.autorenew && v->age - v->max_age > (_patches.autorenew_months * 30))) {
-			// send the aircraft to the hangar at next airport
+			// send the aircraft to the hangar at next airport (bit 17 set)
 			_current_player = _local_player;
 			DoCommandP(v->tile, v->index, 1 << 16, NULL, CMD_SEND_AIRCRAFT_TO_HANGAR | CMD_SHOW_NO_ERROR);
 			_current_player = OWNER_NONE;