diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/depot_gui.cpp | 5 | ||||
-rw-r--r-- | src/train.h | 22 | ||||
-rw-r--r-- | src/train_cmd.cpp | 6 |
3 files changed, 26 insertions, 7 deletions
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 @@ -274,6 +274,28 @@ struct Train : public SpecializedVehicle<Train, VEH_TRAIN> { } /** + * 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 */ |