src/train_cmd.cpp
changeset 6648 fe5626842ec1
parent 6642 2e690e6fdc03
child 6660 da97dfc6ef5f
--- a/src/train_cmd.cpp	Sun Mar 18 10:37:22 2007 +0000
+++ b/src/train_cmd.cpp	Sun Mar 18 15:32:42 2007 +0000
@@ -1334,30 +1334,37 @@
 				for (Vehicle *tmp = first; tmp != NULL; tmp = tmp->next) tmp->first = NULL;
 
 				/* 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) {
-					if (IsTrainEngine(new_f)) {
-						switch_engine = true;
-						/* Copy important data from the front engine */
-						new_f->unitnumber = first->unitnumber;
-						new_f->current_order = first->current_order;
-						new_f->cur_order_index = first->cur_order_index;
-						new_f->orders = first->orders;
-						if (first->prev_shared != NULL) {
-							first->prev_shared->next_shared = new_f;
-							new_f->prev_shared = first->prev_shared;
-						}
-
-						if (first->next_shared != NULL) {
-							first->next_shared->prev_shared = new_f;
-							new_f->next_shared = first->next_shared;
-						}
-
-						new_f->num_orders = first->num_orders;
-						first->orders = NULL; // XXX - to not to delete the orders */
-						if (IsLocalPlayer()) ShowTrainViewWindow(new_f);
+				 * 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;
+					/* Copy important data from the front engine */
+					new_f->unitnumber      = first->unitnumber;
+					new_f->current_order   = first->current_order;
+					new_f->cur_order_index = first->cur_order_index;
+					new_f->orders          = first->orders;
+					new_f->num_orders      = first->num_orders;
+
+					if (first->prev_shared != NULL) {
+						first->prev_shared->next_shared = new_f;
+						new_f->prev_shared = first->prev_shared;
 					}
+
+					if (first->next_shared != NULL) {
+						first->next_shared->prev_shared = new_f;
+						new_f->next_shared = first->next_shared;
+					}
+
+					/*
+					 * Remove all order information from the front train, to
+					 * prevent the order and the shared order list to be
+					 * destroyed by Destroy/DeleteVehicle.
+					 */
+					first->orders      = NULL;
+					first->prev_shared = NULL;
+					first->next_shared = NULL;
+
+					if (IsLocalPlayer()) ShowTrainViewWindow(new_f);
 				}
 			}