changeset 2844:d72f60a73332 draft

(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.
author peter1138 <peter1138@openttd.org>
date Sun, 08 Jan 2006 16:56:41 +0000
parents bbc15daeb0c2
children f251dd80096a
files train_cmd.c
diffstat 1 files changed, 17 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/train_cmd.c
+++ b/train_cmd.c
@@ -807,7 +807,10 @@
 
 	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 @@
 		/* 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) {