summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/depot_gui.cpp5
-rw-r--r--src/train.h22
-rw-r--r--src/train_cmd.cpp6
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 */