(svn r13017) [0.6] -Backport from trunk (r12629): 0.6
authorrubidium
Thu, 08 May 2008 17:30:02 +0000
branch0.6
changeset 10474 80c90b755053
parent 10367 94c008da45c4
child 10654 e511144c1b70
(svn r13017) [0.6] -Backport from trunk (r12629):
- Fix: Vehicles going twice to a depot when the automatic service interfered with the current order [FS#1985] (r12629)
src/aircraft_cmd.cpp
src/roadveh_cmd.cpp
src/ship_cmd.cpp
src/train_cmd.cpp
src/vehicle.cpp
src/vehicle_base.h
src/vehicle_func.h
--- a/src/aircraft_cmd.cpp	Sat Apr 26 21:34:30 2008 +0000
+++ b/src/aircraft_cmd.cpp	Thu May 08 17:30:02 2008 +0000
@@ -706,7 +706,7 @@
 
 static void CheckIfAircraftNeedsService(Vehicle *v)
 {
-	if (_patches.servint_aircraft == 0 || !VehicleNeedsService(v)) return;
+	if (_patches.servint_aircraft == 0 || !v->NeedsAutomaticServicing()) return;
 	if (v->IsInDepot()) {
 		VehicleServiceInDepot(v);
 		return;
@@ -1370,7 +1370,7 @@
 		case OT_GOTO_DEPOT:
 			if (!(v->current_order.flags & OFB_PART_OF_ORDERS)) return;
 			if (v->current_order.flags & OFB_SERVICE_IF_NEEDED &&
-					!VehicleNeedsService(v)) {
+					!v->NeedsServicing()) {
 				UpdateVehicleTimetable(v, true);
 				v->cur_order_index++;
 			}
--- a/src/roadveh_cmd.cpp	Sat Apr 26 21:34:30 2008 +0000
+++ b/src/roadveh_cmd.cpp	Thu May 08 17:30:02 2008 +0000
@@ -761,7 +761,7 @@
 			/* Let a depot order in the orderlist interrupt. */
 			if (!(v->current_order.flags & OFB_PART_OF_ORDERS)) return;
 			if (v->current_order.flags & OFB_SERVICE_IF_NEEDED &&
-					!VehicleNeedsService(v)) {
+					!v->NeedsServicing()) {
 				UpdateVehicleTimetable(v, true);
 				v->cur_order_index++;
 			}
@@ -1977,7 +1977,7 @@
 static void CheckIfRoadVehNeedsService(Vehicle *v)
 {
 	/* If we already got a slot at a stop, use that FIRST, and go to a depot later */
-	if (v->u.road.slot != NULL || _patches.servint_roadveh == 0 || !VehicleNeedsService(v)) return;
+	if (v->u.road.slot != NULL || _patches.servint_roadveh == 0 || !v->NeedsAutomaticServicing()) return;
 	if (v->IsInDepot()) {
 		VehicleServiceInDepot(v);
 		return;
--- a/src/ship_cmd.cpp	Sat Apr 26 21:34:30 2008 +0000
+++ b/src/ship_cmd.cpp	Thu May 08 17:30:02 2008 +0000
@@ -142,7 +142,7 @@
 
 static void CheckIfShipNeedsService(Vehicle *v)
 {
-	if (_patches.servint_ships == 0 || !VehicleNeedsService(v)) return;
+	if (_patches.servint_ships == 0 || !v->NeedsAutomaticServicing()) return;
 	if (v->IsInDepot()) {
 		VehicleServiceInDepot(v);
 		return;
@@ -248,7 +248,7 @@
 		case OT_GOTO_DEPOT:
 			if (!(v->current_order.flags & OFB_PART_OF_ORDERS)) return;
 			if (v->current_order.flags & OFB_SERVICE_IF_NEEDED &&
-					!VehicleNeedsService(v)) {
+					!v->NeedsServicing()) {
 				UpdateVehicleTimetable(v, true);
 				v->cur_order_index++;
 			}
--- a/src/train_cmd.cpp	Sat Apr 26 21:34:30 2008 +0000
+++ b/src/train_cmd.cpp	Thu May 08 17:30:02 2008 +0000
@@ -2634,7 +2634,7 @@
 		case OT_GOTO_DEPOT:
 			if (!(v->current_order.flags & OFB_PART_OF_ORDERS)) return false;
 			if ((v->current_order.flags & OFB_SERVICE_IF_NEEDED) &&
-					!VehicleNeedsService(v)) {
+					!v->NeedsServicing()) {
 				UpdateVehicleTimetable(v, true);
 				v->cur_order_index++;
 			}
@@ -3527,7 +3527,7 @@
 	TileIndex tile = v->tile + TileOffsByDiagDir(dir);
 
 	/* Determine the track status on the next tile */
-	TrackStatus ts = GetTileTrackStatus(tile, TRANSPORT_RAIL, 0, ReverseDiagDir(dir)) & _reachable_tracks[dir];
+;	TrackStatus ts = GetTileTrackStatus(tile, TRANSPORT_RAIL, 0, ReverseDiagDir(dir)) & _reachable_tracks[dir];
 	TrackdirBits trackdirbits = TrackStatusToTrackdirBits(ts);
 	TrackdirBits red_signals = TrackStatusToRedSignals(ts);
 
@@ -3665,7 +3665,7 @@
 
 static void CheckIfTrainNeedsService(Vehicle *v)
 {
-	if (_patches.servint_trains == 0 || !VehicleNeedsService(v)) return;
+	if (_patches.servint_trains == 0 || !v->NeedsAutomaticServicing()) return;
 	if (v->IsInDepot()) {
 		VehicleServiceInDepot(v);
 		return;
--- a/src/vehicle.cpp	Sat Apr 26 21:34:30 2008 +0000
+++ b/src/vehicle.cpp	Thu May 08 17:30:02 2008 +0000
@@ -119,22 +119,27 @@
 	InvalidateWindow(WC_VEHICLE_DETAILS, v->index); // ensure that last service date and reliability are updated
 }
 
-bool VehicleNeedsService(const Vehicle *v)
+bool Vehicle::NeedsServicing() const
 {
-	if (v->vehstatus & (VS_STOPPED | VS_CRASHED))       return false;
-	if (v->current_order.type != OT_GOTO_DEPOT || !(v->current_order.flags & OFB_PART_OF_ORDERS)) { // Don't interfere with a depot visit by the order list
-		if (_patches.gotodepot && VehicleHasDepotOrders(v)) return false;
-		if (v->current_order.type == OT_LOADING)            return false;
-		if (v->current_order.type == OT_GOTO_DEPOT && v->current_order.flags & OFB_HALT_IN_DEPOT) return false;
-	}
+	if (this->vehstatus & (VS_STOPPED | VS_CRASHED)) return false;
 
 	if (_patches.no_servicing_if_no_breakdowns && _opt.diff.vehicle_breakdowns == 0) {
-		return EngineHasReplacementForPlayer(GetPlayer(v->owner), v->engine_type, v->group_id);  /* Vehicles set for autoreplacing needs to go to a depot even if breakdowns are turned off */
+		/* Vehicles set for autoreplacing needs to go to a depot even if breakdowns are turned off.
+		 * Note: If servicing is enabled, we postpone replacement till next service. */
+		return EngineHasReplacementForPlayer(GetPlayer(this->owner), this->engine_type, this->group_id);
 	}
 
 	return _patches.servint_ispercent ?
-		(v->reliability < GetEngine(v->engine_type)->reliability * (100 - v->service_interval) / 100) :
-		(v->date_of_last_service + v->service_interval < _date);
+		(this->reliability < GetEngine(this->engine_type)->reliability * (100 - this->service_interval) / 100) :
+		(this->date_of_last_service + this->service_interval < _date);
+}
+
+bool Vehicle::NeedsAutomaticServicing() const
+{
+	if (_patches.gotodepot && VehicleHasDepotOrders(this)) return false;
+	if (this->current_order.type == OT_LOADING)            return false;
+	if (this->current_order.type == OT_GOTO_DEPOT && this->current_order.flags & OFB_HALT_IN_DEPOT) return false;
+	return NeedsServicing();
 }
 
 StringID VehicleInTheWayErrMsg(const Vehicle* v)
--- a/src/vehicle_base.h	Sat Apr 26 21:34:30 2008 +0000
+++ b/src/vehicle_base.h	Thu May 08 17:30:02 2008 +0000
@@ -486,6 +486,21 @@
 	inline bool IsOrderListShared() const { return this->next_shared != NULL || this->prev_shared != NULL; };
 
 	bool NeedsAutorenewing(const Player *p) const;
+
+	/**
+	 * Check if the vehicle needs to go to a depot in near future (if a opportunity presents itself) for service or replacement.
+	 *
+	 * @see NeedsAutomaticServicing()
+	 * @return true if the vehicle should go to a depot if a opportunity presents itself.
+	 */
+	bool NeedsServicing() const;
+
+	/**
+	 * Checks if the current order should be interupted for a service-in-depot-order.
+	 * @see NeedsServicing()
+	 * @return true if the current order should be interupted.
+	 */
+	bool NeedsAutomaticServicing() const;
 };
 
 /**
--- a/src/vehicle_func.h	Sat Apr 26 21:34:30 2008 +0000
+++ b/src/vehicle_func.h	Thu May 08 17:30:02 2008 +0000
@@ -67,8 +67,6 @@
 void TrainPowerChanged(Vehicle *v);
 Money GetTrainRunningCost(const Vehicle *v);
 
-bool VehicleNeedsService(const Vehicle *v);
-
 uint GenerateVehicleSortList(const Vehicle*** sort_list, uint16 *length_of_array, VehicleType type, PlayerID owner, uint32 index, uint16 window_type);
 void BuildDepotVehicleList(VehicleType type, TileIndex tile, Vehicle ***engine_list, uint16 *engine_list_length, uint16 *engine_count, Vehicle ***wagon_list, uint16 *wagon_list_length, uint16 *wagon_count);
 CommandCost SendAllVehiclesToDepot(VehicleType type, uint32 flags, bool service, PlayerID owner, uint16 vlw_flag, uint32 id);