changeset 13948:1a7862d4528d draft

(svn r18484) -Codechange: simplify the Is(Stopped)InDepot functions for trains
author rubidium <rubidium@openttd.org>
date Sun, 13 Dec 2009 17:13:20 +0000
parents 4f086751330d
children 351e4bacb2e1
files src/train.h src/train_cmd.cpp
diffstat 2 files changed, 17 insertions(+), 24 deletions(-) [+]
line wrap: on
line diff
--- a/src/train.h
+++ b/src/train.h
@@ -49,7 +49,6 @@
 
 byte FreightWagonMult(CargoID cargo);
 
-int CheckTrainInDepot(const Train *v, bool needs_to_be_stopped);
 void UpdateTrainAcceleration(Train *v);
 void CheckTrainsLengths();
 
@@ -131,8 +130,8 @@
 	int GetDisplayMaxSpeed() const { return this->tcache.cached_max_speed; }
 	Money GetRunningCost() const;
 	int GetDisplayImageWidth(Point *offset = NULL) const;
-	bool IsInDepot() const { return CheckTrainInDepot(this, false) != -1; }
-	bool IsStoppedInDepot() const { return CheckTrainInDepot(this, true) != -1; }
+	bool IsInDepot() const;
+	bool IsStoppedInDepot() const;
 	bool Tick();
 	void OnNewDay();
 	uint Crash(bool flooded = false);
--- a/src/train_cmd.cpp
+++ b/src/train_cmd.cpp
@@ -954,30 +954,24 @@
 }
 
 
-/* Check if all the wagons of the given train are in a depot, returns the
- * number of cars (including loco) then. If not it returns -1 */
-int CheckTrainInDepot(const Train *v, bool needs_to_be_stopped)
+bool Train::IsInDepot() const
 {
-	TileIndex tile = v->tile;
-
-	/* check if stopped in a depot */
-	if (!IsRailDepotTile(tile) || v->cur_speed != 0 ||
-			(needs_to_be_stopped && v->IsFrontEngine() && !(v->vehstatus & VS_STOPPED))) {
-		return -1;
+	/* Is the front engine stationary in the depot? */
+	if (!IsRailDepotTile(this->tile) || this->cur_speed != 0) return false;
+
+	/* Check whether the rest is also already trying to enter the depot. */
+	for (const Train *v = this; v != NULL; v = v->Next()) {
+		if (v->track != TRACK_BIT_DEPOT || v->tile != this->tile) return false;
 	}
 
-	int count = 0;
-	for (; v != NULL; v = v->Next()) {
-		/* This count is used by the depot code to determine the number of engines
-		 * in the consist. Exclude articulated parts so that autoreplacing to
-		 * engines with more articulated parts than before works correctly.
-		 *
-		 * Also skip counting rear ends of multiheaded engines */
-		if (!v->IsArticulatedPart() && !v->IsRearDualheaded()) count++;
-		if (v->track != TRACK_BIT_DEPOT || v->tile != tile) return -1;
-	}
-
-	return count;
+	return true;
+}
+
+bool Train::IsStoppedInDepot() const
+{
+	/* Are we stopped? Ofcourse wagons don't really care... */
+	if (this->IsFrontEngine() && !(this->vehstatus & VS_STOPPED)) return false;
+	return this->IsInDepot();
 }
 
 static Train *FindGoodVehiclePos(const Train *src)