diff --git a/src/train.h b/src/train.h index 36c99c7b95..6f6c9a4861 100644 --- a/src/train.h +++ b/src/train.h @@ -66,6 +66,7 @@ int GetTrainStopLocation(StationID station_id, TileIndex tile, const Train *v, i void GetTrainSpriteSize(EngineID engine, uint &width, uint &height, int &xoffs, int &yoffs, EngineImageType image_type); bool TrainOnCrossing(TileIndex tile); +void NormalizeTrainVehInDepot(const Train *u); /** Variables that are cached to improve performance and such */ struct TrainCache { diff --git a/src/train_cmd.cpp b/src/train_cmd.cpp index 6a0243d26c..0a8fe12b7e 100644 --- a/src/train_cmd.cpp +++ b/src/train_cmd.cpp @@ -686,7 +686,7 @@ static CommandCost CmdBuildRailWagon(DoCommandFlag flags, TileIndex tile, const } /** Move all free vehicles in the depot to the train */ -static void NormalizeTrainVehInDepot(const Train *u) +void NormalizeTrainVehInDepot(const Train *u) { for (const Train *v : Train::Iterate()) { if (v->IsFreeWagon() && v->tile == u->tile && @@ -737,11 +737,10 @@ static void AddRearEngineToMultiheadedTrain(Train *v) * @param flags type of operation. * @param tile tile of the depot where rail-vehicle is built. * @param e the engine to build. - * @param free_cars add any free cars to the train. * @param[out] ret the vehicle that has been built. * @return the cost of this operation or an error. */ -CommandCost CmdBuildRailVehicle(DoCommandFlag flags, TileIndex tile, const Engine *e, bool free_cars, Vehicle **ret) +CommandCost CmdBuildRailVehicle(DoCommandFlag flags, TileIndex tile, const Engine *e, Vehicle **ret) { const RailVehicleInfo *rvi = &e->u.rail; @@ -807,10 +806,6 @@ CommandCost CmdBuildRailVehicle(DoCommandFlag flags, TileIndex tile, const Engin v->ConsistChanged(CCF_ARRANGE); UpdateTrainGroupID(v); - if (free_cars && !(flags & DC_AUTOREPLACE)) { // check if the cars should be added to the new vehicle - NormalizeTrainVehInDepot(v); - } - CheckConsistencyOfArticulatedVehicle(v); } diff --git a/src/train_cmd.h b/src/train_cmd.h index 3d224717a5..bf365a851c 100644 --- a/src/train_cmd.h +++ b/src/train_cmd.h @@ -14,7 +14,7 @@ #include "engine_type.h" #include "vehicle_type.h" -CommandCost CmdBuildRailVehicle(DoCommandFlag flags, TileIndex tile, const Engine *e, bool free_cars, Vehicle **ret); +CommandCost CmdBuildRailVehicle(DoCommandFlag flags, TileIndex tile, const Engine *e, Vehicle **ret); CommandCost CmdSellRailWagon(DoCommandFlag flags, Vehicle *t, bool sell_chain, bool backup_order, ClientID user); CommandCost CmdMoveRailVehicle(DoCommandFlag flags, VehicleID src_veh, VehicleID dest_veh, bool move_chain); diff --git a/src/vehicle_cmd.cpp b/src/vehicle_cmd.cpp index 7f8ac804a9..c23445aa9c 100644 --- a/src/vehicle_cmd.cpp +++ b/src/vehicle_cmd.cpp @@ -135,7 +135,7 @@ std::tuple CmdBuildVehicle(DoC Vehicle *v = nullptr; switch (type) { - case VEH_TRAIN: value.AddCost(CmdBuildRailVehicle(subflags, tile, e, use_free_vehicles, &v)); break; + case VEH_TRAIN: value.AddCost(CmdBuildRailVehicle(subflags, tile, e, &v)); break; case VEH_ROAD: value.AddCost(CmdBuildRoadVehicle(subflags, tile, e, &v)); break; case VEH_SHIP: value.AddCost(CmdBuildShip (subflags, tile, e, &v)); break; case VEH_AIRCRAFT: value.AddCost(CmdBuildAircraft (subflags, tile, e, &v)); break; @@ -172,6 +172,11 @@ std::tuple CmdBuildVehicle(DoC } if (flags & DC_EXEC) { + if (type == VEH_TRAIN && use_free_vehicles && !(flags & DC_AUTOREPLACE)) { + /* Move any free wagons to the new vehicle. */ + NormalizeTrainVehInDepot(Train::From(v)); + } + InvalidateWindowData(WC_VEHICLE_DEPOT, v->tile); InvalidateWindowClassesData(GetWindowClassForVehicleType(type), 0); SetWindowDirty(WC_COMPANY, _current_company);