diff options
author | peter1138 <peter1138@openttd.org> | 2006-01-08 16:56:41 +0000 |
---|---|---|
committer | peter1138 <peter1138@openttd.org> | 2006-01-08 16:56:41 +0000 |
commit | 9c17d0ec93de7827a89481707b2c9b1339b19ae5 (patch) | |
tree | 57176d6adbeb29758a3d9f3a7557d6a21ece91f9 | |
parent | 7ae5e344a2cd973ae449a7b9162bfb458186386a (diff) | |
download | openttd-9c17d0ec93de7827a89481707b2c9b1339b19ae5.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.
-rw-r--r-- | train_cmd.c | 19 |
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) { |