From 52cbaf2db2f7d2dd398c1c32e7064e5494fa80d3 Mon Sep 17 00:00:00 2001 From: rubidium Date: Sun, 13 Dec 2009 17:13:20 +0000 Subject: [PATCH] (svn r18484) -Codechange: simplify the Is(Stopped)InDepot functions for trains --- src/train.h | 5 ++--- src/train_cmd.cpp | 32 +++++++++++++------------------- 2 files changed, 15 insertions(+), 22 deletions(-) diff --git a/src/train.h b/src/train.h index ed27ad8115..be0239d8ef 100644 --- a/src/train.h +++ b/src/train.h @@ -49,7 +49,6 @@ void CcBuildWagon(bool success, TileIndex tile, uint32 p1, uint32 p2); byte FreightWagonMult(CargoID cargo); -int CheckTrainInDepot(const Train *v, bool needs_to_be_stopped); void UpdateTrainAcceleration(Train *v); void CheckTrainsLengths(); @@ -131,8 +130,8 @@ struct Train : public SpecializedVehicle { 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); diff --git a/src/train_cmd.cpp b/src/train_cmd.cpp index 5ae13df14b..3f9d81dacb 100644 --- a/src/train_cmd.cpp +++ b/src/train_cmd.cpp @@ -954,30 +954,24 @@ CommandCost CmdBuildRailVehicle(TileIndex tile, DoCommandFlag flags, uint32 p1, } -/* 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; + /* Is the front engine stationary in the depot? */ + if (!IsRailDepotTile(this->tile) || this->cur_speed != 0) return false; - /* 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; + /* 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 true; +} - return count; +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)