Changeset - r2844:bf9c95654254
[Not reviewed]
master
0 1 0
peter1138 - 19 years ago 2006-01-08 16:56:41
peter1138@openttd.org
(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.
1 file changed with 17 insertions and 2 deletions:
0 comments (0 inline, 0 general)
train_cmd.c
Show inline comments
 
@@ -804,13 +804,16 @@ int CheckTrainStoppedInDepot(const Vehic
 
		_error_message = STR_881A_TRAINS_CAN_ONLY_BE_ALTERED;
 
		return -1;
 
	}
 

	
 
	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;
 
			return -1;
 
		}
 
	}
 
@@ -995,13 +998,25 @@ int32 CmdMoveRailVehicle(int x, int y, u
 
		int r, num = 0;
 

	
 
		r = CheckTrainStoppedInDepot(src_head);
 
		/* 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) {
 
			r = CheckTrainStoppedInDepot(dst_head);
 
			if (r < 0) return CMD_ERROR;
 

	
0 comments (0 inline, 0 general)