From 84d9f832c3e8ec66df7e40a484ee25880ef6fae9 Mon Sep 17 00:00:00 2001 From: rubidium Date: Sun, 18 Mar 2007 15:32:42 +0000 Subject: (svn r9277) -Fix [FS#685]: shared orders got messed up when the 'first' trains got removed in the depot. --- src/train_cmd.cpp | 51 +++++++++++++++++++++++++++++---------------------- 1 file changed, 29 insertions(+), 22 deletions(-) diff --git a/src/train_cmd.cpp b/src/train_cmd.cpp index 7f47d7f7c..955548264 100644 --- a/src/train_cmd.cpp +++ b/src/train_cmd.cpp @@ -1334,30 +1334,37 @@ int32 CmdSellRailWagon(TileIndex tile, uint32 flags, uint32 p1, uint32 p2) 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; - } + * 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; + } - new_f->num_orders = first->num_orders; - first->orders = NULL; // XXX - to not to delete the orders */ - if (IsLocalPlayer()) ShowTrainViewWindow(new_f); + 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); } } -- cgit v1.2.3-70-g09d2