(svn r5668) - Backport from trunk (r5454): 0.4
authorDarkvater
Mon, 31 Jul 2006 11:29:18 +0000
branch0.4
changeset 10064 c63f74223041
parent 10063 4207bb54e7c8
child 10065 fc91a7eca19e
(svn r5668) - Backport from trunk (r5454):
Helicopters stopping in depot after autorenew/autoreplace
aircraft_cmd.c
--- a/aircraft_cmd.c	Sun Jul 30 23:43:47 2006 +0000
+++ b/aircraft_cmd.c	Mon Jul 31 11:29:18 2006 +0000
@@ -386,8 +386,8 @@
  * @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
+ * - p2 (bit 16) - aircraft will try to goto a depot, but not stop there (eg autorenew or autoreplace)
+ * - p2 (bit 17) - aircraft will try to goto a depot at the airport specified by low word of p2 XXX - Not Used
  */
 int32 CmdSendAircraftToHangar(int x, int y, uint32 flags, uint32 p1, uint32 p2)
 {
@@ -408,11 +408,11 @@
 		}
 	} else {
 		bool next_airport_has_hangar = true;
+		/* If bit 17 is set, next airport is specified by low word of p2, otherwise it's the target airport */
 		/* 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 the station is not a valid airport or if it has no hangars */
 		if (!IsValidStation(st) || st->airport_tile == 0 || GetAirport(st->airport_type)->nof_depots == 0) {
 			StationID station;
 
@@ -1440,12 +1440,14 @@
 	AircraftNextAirportPos_and_Order(v);
 
 	// check if the aircraft needs to be replaced or renewed and send it to a hangar if needed
+	// unless it is due for renewal but the engine is no longer available
 	if (v->owner == _local_player && (
 				EngineHasReplacementForPlayer(p, v->engine_type) ||
-				(p->engine_renew && v->age - v->max_age > p->engine_renew_months * 30)
+				((p->engine_renew && v->age - v->max_age > p->engine_renew_months * 30) &&
+				HASBIT(GetEngine(v->engine_type)->player_avail, _local_player))
 			)) {
 		_current_player = _local_player;
-		DoCommandP(v->tile, v->index, 1, NULL, CMD_SEND_AIRCRAFT_TO_HANGAR | CMD_SHOW_NO_ERROR);
+		DoCommandP(v->tile, v->index, 1 << 16, NULL, CMD_SEND_AIRCRAFT_TO_HANGAR | CMD_SHOW_NO_ERROR);
 		_current_player = OWNER_NONE;
 	}
 }