summaryrefslogtreecommitdiff
path: root/train_cmd.c
diff options
context:
space:
mode:
authorpeter1138 <peter1138@openttd.org>2006-01-08 16:56:41 +0000
committerpeter1138 <peter1138@openttd.org>2006-01-08 16:56:41 +0000
commit7c5a58bbadea60cb4e5987039ece0436340cd7a4 (patch)
tree57176d6adbeb29758a3d9f3a7557d6a21ece91f9 /train_cmd.c
parent019e79423415f2bd0c43481ca78dcdb091eac74d (diff)
downloadopenttd-7c5a58bbadea60cb4e5987039ece0436340cd7a4.tar.xz
(svn r3392) Train depot fixes:
- Only count the parts from the source train that will be moved, not the whole train. - Don't count articulated parts of an engine. This alleviates issues with autoreplacing very long trains.
Diffstat (limited to 'train_cmd.c')
-rw-r--r--train_cmd.c19
1 files changed, 17 insertions, 2 deletions
diff --git a/train_cmd.c b/train_cmd.c
index 67b181212..115bc5b73 100644
--- a/train_cmd.c
+++ b/train_cmd.c
@@ -807,7 +807,10 @@ int CheckTrainStoppedInDepot(const Vehicle *v)
count = 0;
for (; v != NULL; v = v->next) {
- count++;
+ /* 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 that before works correctly. */
+ if (!IsArticulatedPart(v)) count++;
if (v->u.rail.track != 0x80 || v->tile != tile ||
(IsFrontEngine(v) && !(v->vehstatus & VS_STOPPED))) {
_error_message = STR_881A_TRAINS_CAN_ONLY_BE_ALTERED;
@@ -998,7 +1001,19 @@ int32 CmdMoveRailVehicle(int x, int y, uint32 flags, uint32 p1, uint32 p2)
/* check if all vehicles in the source train are stopped inside a depot */
if (r < 0) return CMD_ERROR;
- num += r;
+ if (HASBIT(p2, 0)) {
+ /* If moving the rest of the train, exclude wagons before the
+ * selected one. */
+
+ Vehicle *u;
+ for (u = src_head; u != src && u != NULL; u = GetNextVehicle(u))
+ r--;
+
+ num += r;
+ } else {
+ // If moving only one vehicle, just count that.
+ num++;
+ }
/* check if all the vehicles in the dest train are stopped */
if (dst_head != NULL) {