From 4c65a04a50660eaffd684efd05ab530ea5e3e3b8 Mon Sep 17 00:00:00 2001 From: rubidium Date: Sat, 12 Sep 2009 14:37:29 +0000 Subject: (svn r17509) -Fix [FS#3196]: if building a part fails during cloning, sell what was already cloned instead of leaving it 'for free' -Fix: make cloning multiheaded trains possible with with 'max - 1' vehicles existing --- src/vehicle_cmd.cpp | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) (limited to 'src/vehicle_cmd.cpp') diff --git a/src/vehicle_cmd.cpp b/src/vehicle_cmd.cpp index b51fd06ec..c757c2ae2 100644 --- a/src/vehicle_cmd.cpp +++ b/src/vehicle_cmd.cpp @@ -359,10 +359,23 @@ CommandCost CmdCloneVehicle(TileIndex tile, DoCommandFlag flags, uint32 p1, uint continue; } - CommandCost cost = DoCommand(tile, v->engine_type, build_argument, flags, GetCmdBuildVeh(v)); + /* In case we're building a multi headed vehicle and the maximum number of + * vehicles is almost reached (e.g. max trains - 1) not all vehicles would + * be cloned. When the non-primary engines were build they were seen as + * 'new' vehicles whereas they would immediately be joined with a primary + * engine. This caused the vehicle to be not build as 'the limit' had been + * reached, resulting in partially build vehicles and such. */ + DoCommandFlag build_flags = flags; + if ((flags & DC_EXEC) && !v->IsPrimaryVehicle()) build_flags |= DC_AUTOREPLACE; + + CommandCost cost = DoCommand(tile, v->engine_type, build_argument, build_flags, GetCmdBuildVeh(v)); build_argument = 3; // ensure that we only assign a number to the first engine - if (CmdFailed(cost)) return cost; + if (CmdFailed(cost)) { + /* Can't build a part, then sell the stuff we already made; clear up the mess */ + if (w_front != NULL) DoCommand(w_front->tile, w_front->index, 1, flags, GetCmdSellVeh(w_front)); + return cost; + } total_cost.AddCost(cost); -- cgit v1.2.3-54-g00ecf