Mercurial > hg > openttd
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; + } } }