From 7b92d9efe4efbc69b4a2b4563f2fc7645bc8938d Mon Sep 17 00:00:00 2001 From: frosch Date: Sun, 19 Jul 2009 19:17:41 +0000 Subject: (svn r16884) -Codechange: Add Train::GetFirstEnginePart() and use it. --- src/depot_gui.cpp | 5 +---- src/train.h | 22 ++++++++++++++++++++++ src/train_cmd.cpp | 6 +++--- 3 files changed, 26 insertions(+), 7 deletions(-) (limited to 'src') diff --git a/src/depot_gui.cpp b/src/depot_gui.cpp index 91df5b642..a311ebd75 100644 --- a/src/depot_gui.cpp +++ b/src/depot_gui.cpp @@ -453,10 +453,7 @@ struct DepotWindow : Window { if (x < 0) break; } - /* if an articulated part was selected, find its parent */ - while (v != NULL && v->IsArticulatedPart()) v = v->Previous(); - - d->wagon = v; + d->wagon = (v != NULL ? v->GetFirstEnginePart() : NULL); return MODE_DRAG_VEHICLE; } diff --git a/src/train.h b/src/train.h index 5dc3c1cfa..965d45baf 100644 --- a/src/train.h +++ b/src/train.h @@ -273,6 +273,28 @@ struct Train : public SpecializedVehicle { return this->Next(); } + /** + * Get the first part of a multi-part engine. + * @return First part of the engine. + */ + FORCEINLINE Train *GetFirstEnginePart() + { + Train *v = this; + while (v->IsArticulatedPart()) v = v->Previous(); + return v; + } + + /** + * Get the first part of a multi-part engine. + * @return First part of the engine. + */ + FORCEINLINE const Train *GetFirstEnginePart() const + { + const Train *v = this; + while (v->IsArticulatedPart()) v = v->Previous(); + return v; + } + /** * Get the last part of a multi-part engine. * @return Last part of the engine. diff --git a/src/train_cmd.cpp b/src/train_cmd.cpp index 2f1e81658..19a8cd84f 100644 --- a/src/train_cmd.cpp +++ b/src/train_cmd.cpp @@ -1105,9 +1105,9 @@ CommandCost CmdMoveRailVehicle(TileIndex tile, DoCommandFlag flags, uint32 p1, u } /* if an articulated part is being handled, deal with its parent vehicle */ - while (src->IsArticulatedPart()) src = src->Previous(); + src = src->GetFirstEnginePart(); if (dst != NULL) { - while (dst->IsArticulatedPart()) dst = dst->Previous(); + dst = dst->GetFirstEnginePart(); } /* don't move the same vehicle.. */ @@ -1445,7 +1445,7 @@ CommandCost CmdSellRailWagon(TileIndex tile, DoCommandFlag flags, uint32 p1, uin if (v->vehstatus & VS_CRASHED) return_cmd_error(STR_CAN_T_SELL_DESTROYED_VEHICLE); - while (v->IsArticulatedPart()) v = v->Previous(); + v = v->GetFirstEnginePart(); Train *first = v->First(); /* make sure the vehicle is stopped in the depot */ -- cgit v1.2.3-54-g00ecf