diff --git a/src/depot_gui.cpp b/src/depot_gui.cpp index 91df5b642b..a311ebd754 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 5dc3c1cfab..965d45baf0 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 2f1e81658b..19a8cd84fd 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 */