changeset 10192:1f525fa5fca8 draft

(svn r14405) -Fix [FS#2289]: Correct handling of selling free wagons while the following vehicle is an engine (i.e. a new train is created).
author frosch <frosch@openttd.org>
date Fri, 26 Sep 2008 19:25:49 +0000
parents 078112d3e7d9
children 5498150a3b12
files src/train_cmd.cpp
diffstat 1 files changed, 30 insertions(+), 19 deletions(-) [+]
line wrap: on
line diff
--- a/src/train_cmd.cpp
+++ b/src/train_cmd.cpp
@@ -1422,32 +1422,43 @@
 				}
 			}
 
-			/* 2. We are selling the first engine, some special action might be required
+			/* 2. We are selling the front vehicle, some special action might be required
 			 * here, so take attention */
-			if ((flags & DC_EXEC) && v == first) {
+			if (v == first) {
 				Vehicle *new_f = GetNextVehicle(first);
 
 				/* 2.2 If there are wagons present after the deleted front engine, check
 				 * if the second wagon (which will be first) is an engine. If it is one,
 				 * promote it as a new train, retaining the unitnumber, orders */
 				if (new_f != NULL && IsTrainEngine(new_f)) {
-					switch_engine = true;
-
-					/* Make sure the group counts stay correct. */
-					new_f->group_id        = first->group_id;
-					first->group_id        = DEFAULT_GROUP;
-
-					/* Copy orders (by sharing) */
-					new_f->orders          = first->orders;
-					new_f->num_orders      = first->num_orders;
-					new_f->AddToShared(first);
-					DeleteVehicleOrders(first);
-
-					/* Copy other important data from the front engine */
-					new_f->CopyVehicleConfigAndStatistics(first);
-
-					/* If we deleted a window then open a new one for the 'new' train */
-					if (IsLocalPlayer() && w != NULL) ShowVehicleViewWindow(new_f);
+					if (IsTrainEngine(first)) {
+						/* Let the new front engine take over the setup of the old engine */
+						switch_engine = true;
+
+						if (flags & DC_EXEC) {
+							/* Make sure the group counts stay correct. */
+							new_f->group_id        = first->group_id;
+							first->group_id        = DEFAULT_GROUP;
+
+							/* Copy orders (by sharing) */
+							new_f->orders          = first->orders;
+							new_f->num_orders      = first->num_orders;
+							new_f->AddToShared(first);
+							DeleteVehicleOrders(first);
+
+							/* Copy other important data from the front engine */
+							new_f->CopyVehicleConfigAndStatistics(first);
+
+							/* If we deleted a window then open a new one for the 'new' train */
+							if (IsLocalPlayer() && w != NULL) ShowVehicleViewWindow(new_f);
+						}
+					} else {
+						/* We are selling a free wagon, and construct a new train at the same time.
+						 * This needs lots of extra checks (e.g. train limit), which are done by first moving
+						 * the remaining vehicles to a new row */
+						cost.AddCost(DoCommand(0, new_f->index | INVALID_VEHICLE << 16, 1, flags, CMD_MOVE_RAIL_VEHICLE));
+						if (cost.Failed()) return cost;
+					}
 				}
 			}