Functions

# autoreplace_cmd.cpp File Reference

Deals with autoreplace execution but not the setup. More...

`#include "stdafx.h"`
`#include "company_func.h"`
`#include "train.h"`
`#include "command_func.h"`
`#include "engine_func.h"`
`#include "vehicle_func.h"`
`#include "autoreplace_func.h"`
`#include "autoreplace_gui.h"`
`#include "articulated_vehicles.h"`
`#include "core/random_func.hpp"`
`#include "table/strings.h"`

Go to the source code of this file.

## Functions
void | ChangeVehicleViewports (VehicleID from_index, VehicleID to_index)
| Switches viewports following vehicles, which get autoreplaced.
void | ChangeVehicleNews (VehicleID from_index, VehicleID to_index)
| Report a change in vehicle IDs (due to autoreplace) to affected vehicle news.
void | ChangeVehicleViewWindow (VehicleID from_index, VehicleID to_index)
| Report a change in vehicle IDs (due to autoreplace) to affected vehicle windows.
static bool | EnginesHaveCargoInCommon (EngineID engine_a, EngineID engine_b)
| Figure out if two engines got at least one type of cargo in common (refitting if needed).
bool | CheckAutoreplaceValidity (EngineID from, EngineID to, CompanyID company)
| Checks some basic properties whether autoreplace is allowed.
void | CheckCargoCapacity (Vehicle *v)
| Check the capacity of all vehicles in a chain and spread cargo if needed.
static void | TransferCargo (Vehicle *old_veh, Vehicle *new_head, bool part_of_chain)
| Transfer cargo from a single (articulated )old vehicle to the new vehicle chain.
static bool | VerifyAutoreplaceRefitForOrders (const Vehicle *v, EngineID engine_type)
| Tests whether refit orders that applied to v will also apply to the new vehicle type.
static CargoID | GetNewCargoTypeForReplace (Vehicle *v, EngineID engine_type, bool part_of_chain)
| Function to find what type of cargo to refit to when autoreplacing.
static CommandCost | GetNewEngineType (const Vehicle *v, const Company *c, EngineID &e)
| Get the EngineID of the replacement for a vehicle.
static CommandCost | BuildReplacementVehicle (Vehicle *old_veh, Vehicle **new_vehicle, bool part_of_chain)
| Builds and refits a replacement vehicle Important: The old vehicle is still in the original vehicle chain (used for determining the cargo when the old vehicle did not carry anything, but the new one does).
static CommandCost | CmdStartStopVehicle (const Vehicle *v, bool evaluate_callback)
| Issue a start/stop command.
static CommandCost | CmdMoveVehicle (const Vehicle *v, const Vehicle *after, DoCommandFlag flags, bool whole_chain)
| Issue a train vehicle move command.
static CommandCost | CopyHeadSpecificThings (Vehicle *old_head, Vehicle *new_head, DoCommandFlag flags)
| Copy head specific things to the new vehicle chain after it was successfully constructed.
static CommandCost | ReplaceFreeUnit (Vehicle **single_unit, DoCommandFlag flags, bool *nothing_to_do)
| Replace a single unit in a free wagon chain.
static CommandCost | ReplaceChain (Vehicle **chain, DoCommandFlag flags, bool wagon_removal, bool *nothing_to_do)
| Replace a whole vehicle chain.
CommandCost | CmdAutoreplaceVehicle (TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 p2, const char *text)
| Autoreplaces a vehicle Trains are replaced as a whole chain, free wagons in depot are replaced on their own.
CommandCost | CmdSetAutoReplace (TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 p2, const char *text)
| Change engine renewal parameters.

## Detailed Description

Deals with autoreplace execution but not the setup.

Definition in file autoreplace_cmd.cpp.

## Function Documentation

static CommandCost BuildReplacementVehicle | ( | Vehicle * | old_veh,
|  | Vehicle ** | new_vehicle,
|  | bool | part_of_chain |
| ) |  |  | `[static]`

Builds and refits a replacement vehicle Important: The old vehicle is still in the original vehicle chain (used for determining the cargo when the old vehicle did not carry anything, but the new one does).

Parameters:

  | old_veh | A single (articulated/multiheaded) vehicle that shall be replaced.
  | new_vehicle | Returns the newly build and refittet vehicle
  | part_of_chain | The vehicle is part of a train

Returns:
  cost or error

Definition at line 267 of file autoreplace_cmd.cpp.

References _current_company, CommandCost::AddCost(), CMD_REVERSE_TRAIN_DIRECTION, CT_INVALID, CT_NO_REFIT, DC_AUTOREPLACE, DC_EXEC, DoCommand(), CommandCost::Failed(), SpecializedVehicle< Train, Type >::From(), Pool< Titem, Tindex, Tgrowth_step, Tmax_size, Tpool_type, Tcache, Tzero >::PoolItem<&_vehicle_pool >::Get(), Pool< Titem, Tindex, Tgrowth_step, Tmax_size, Tpool_type, Tcache, Tzero >::PoolItem<&_company_pool >::Get(), GetBestFittingSubType(), GetNewCargoTypeForReplace(), GetNewEngineType(), HasBit(), Pool< Titem, Tindex, Tgrowth_step, Tmax_size, Tpool_type, Tcache, Tzero >::PoolItem< Tpool >::index, INVALID_ENGINE, CommandCost::Succeeded(), Vehicle::tile, BaseVehicle::type, VEH_TRAIN, and VRF_REVERSE_DIRECTION.

Referenced by ReplaceChain(), and ReplaceFreeUnit().

void ChangeVehicleNews | ( | VehicleID | from_index,
|  | VehicleID | to_index |
| ) |  |  |

Report a change in vehicle IDs (due to autoreplace) to affected vehicle news.

Note:
  Viewports of currently displayed news is changed via ChangeVehicleViewports

Parameters:

  | from_index | the old vehicle ID
  | to_index | the new vehicle ID

Definition at line 922 of file news_gui.cpp.

References NewsItem::next, NR_VEHICLE, and NS_ADVICE.

Referenced by CopyHeadSpecificThings().

void ChangeVehicleViewports | ( | VehicleID | from_index,
|  | VehicleID | to_index |
| ) |  |  |

Switches viewports following vehicles, which get autoreplaced.

Parameters:

  | from_index | the old vehicle ID
  | to_index | the new vehicle ID

Definition at line 2953 of file window.cpp.

References ViewportData::follow_vehicle, Window::SetDirty(), and Window::viewport.

Referenced by CopyHeadSpecificThings().

void ChangeVehicleViewWindow | ( | VehicleID | from_index,
|  | VehicleID | to_index |
| ) |  |  |

Report a change in vehicle IDs (due to autoreplace) to affected vehicle windows.

Parameters:

  | from_index | the old vehicle ID
  | to_index | the new vehicle ID

Definition at line 1128 of file vehicle_gui.cpp.

References ChangeVehicleWindow(), WC_VEHICLE_DETAILS, WC_VEHICLE_ORDERS, WC_VEHICLE_REFIT, WC_VEHICLE_TIMETABLE, and WC_VEHICLE_VIEW.

Referenced by CopyHeadSpecificThings().

bool CheckAutoreplaceValidity | ( | EngineID | from,
|  | EngineID | to,
|  | CompanyID | company |
| ) |  |  |

Checks some basic properties whether autoreplace is allowed.

Parameters:

  | from | Origin engine
  | to | Destination engine
  | company | Company to check for

Returns:
  true if autoreplace is allowed

Definition at line 50 of file autoreplace_cmd.cpp.

References AIR_CTOL, RailtypeInfo::compatible_railtypes, EF_ROAD_TRAM, EnginesHaveCargoInCommon(), Pool< Titem, Tindex, Tgrowth_step, Tmax_size, Tpool_type, Tcache, Tzero >::PoolItem<&_engine_pool >::Get(), GetRailTypeInfo(), HasBit(), IsEngineBuildable(), Pool< Titem, Tindex, Tgrowth_step, Tmax_size, Tpool_type, Tcache, Tzero >::PoolItem<&_engine_pool >::IsValidID(), EngineInfo::misc_flags, RAILVEH_WAGON, AircraftVehicleInfo::subtype, Engine::type, VEH_AIRCRAFT, VEH_ROAD, and VEH_TRAIN.

Referenced by CmdSetAutoReplace(), and ReplaceVehicleWindow::GenerateReplaceVehList().

void CheckCargoCapacity | ( | Vehicle * | v | ) |

Check the capacity of all vehicles in a chain and spread cargo if needed.

Parameters:

  | v | The vehicle to check.

Definition at line 95 of file autoreplace_cmd.cpp.

References Vehicle::First(), min(), and Vehicle::Next().

Referenced by CmdMoveRailVehicle(), and ReplaceChain().

CommandCost CmdAutoreplaceVehicle | ( | TileIndex | tile,
|  | DoCommandFlag | flags,
|  | uint32 | p1,
|  | uint32 | p2,
|  | const char * | text |
| ) |  |  |

Autoreplaces a vehicle Trains are replaced as a whole chain, free wagons in depot are replaced on their own.

Parameters:

  | tile | not used
  | flags | type of operation
  | p1 | Index of vehicle
  | p2 | not used
  | text | unused

Returns:
  the cost of this operation or an error

Definition at line 657 of file autoreplace_cmd.cpp.

References _current_company, CommandCost::AddCost(), CheckOwnership(), CMD_ERROR, DC_EXEC, EXPENSES_NEW_VEHICLES, CommandCost::Failed(), SpecializedVehicle< T, Type >::First(), SpecializedVehicle< Train, Type >::From(), Pool< Titem, Tindex, Tgrowth_step, Tmax_size, Tpool_type, Tcache, Tzero >::PoolItem<&_company_pool >::Get(), CommandCost::GetCost(), Pool< Titem, Tindex, Tgrowth_step, Tmax_size, Tpool_type, Tcache, Tzero >::PoolItem<&_vehicle_pool >::GetIfValid(), GetNewEngineType(), Train::GetNextUnit(), INVALID_ENGINE, Vehicle::IsArticulatedPart(), Vehicle::IsFrontEngine(), Vehicle::IsInDepot(), Vehicle::IsPrimaryVehicle(), GroundVehicle< T, Type >::IsRearDualheaded(), Vehicle::IsStoppedInDepot(), Vehicle::owner, CompanySettings::renew_keep_length, ReplaceChain(), ReplaceFreeUnit(), RestoreRandomSeeds(), SaveRandomSeeds(), Company::settings, CommandCost::Succeeded(), BaseVehicle::type, VEH_TRAIN, Vehicle::vehstatus, and VS_CRASHED.

static CommandCost CmdMoveVehicle | ( | const Vehicle * | v,
|  | const Vehicle * | after,
|  | DoCommandFlag | flags,
|  | bool | whole_chain |
| ) |  |  | `[inline, static]`

Issue a train vehicle move command.

Parameters:

  | v | The vehicle to move
  | after | The vehicle to insert 'v' after, or NULL to start new chain
  | flags | the command flags to use
  | whole_chain | move all vehicles following 'v' (true), or only 'v' (false)

Returns:
  success or error

Definition at line 324 of file autoreplace_cmd.cpp.

References CMD_MOVE_RAIL_VEHICLE, DC_NO_CARGO_CAP_CHECK, DoCommand(), Pool< Titem, Tindex, Tgrowth_step, Tmax_size, Tpool_type, Tcache, Tzero >::PoolItem< Tpool >::index, and INVALID_VEHICLE.

Referenced by ReplaceChain(), and ReplaceFreeUnit().

CommandCost CmdSetAutoReplace | ( | TileIndex | tile,
|  | DoCommandFlag | flags,
|  | uint32 | p1,
|  | uint32 | p2,
|  | const char * | text |
| ) |  |  |

Change engine renewal parameters.

Parameters:

  | tile | unused
  | flags | operation to perform
  | p1 | packed data bits 16-31 = engine group
  | p2 | packed data bits 0-15 = old engine type bits 16-31 = new engine type
  | text | unused

Returns:
  the cost of this operation or an error

Definition at line 746 of file autoreplace_cmd.cpp.

References _current_company, AddEngineReplacementForCompany(), CheckAutoreplaceValidity(), CMD_ERROR, DC_EXEC, GB(), Pool< Titem, Tindex, Tgrowth_step, Tmax_size, Tpool_type, Tcache, Tzero >::PoolItem<&_group_pool >::Get(), Pool< Titem, Tindex, Tgrowth_step, Tmax_size, Tpool_type, Tcache, Tzero >::PoolItem<&_company_pool >::GetIfValid(), INVALID_ENGINE, InvalidateAutoreplaceWindow(), IsAllGroupID(), IsLocalCompany(), Pool< Titem, Tindex, Tgrowth_step, Tmax_size, Tpool_type, Tcache, Tzero >::PoolItem<&_engine_pool >::IsValidID(), Pool< Titem, Tindex, Tgrowth_step, Tmax_size, Tpool_type, Tcache, Tzero >::PoolItem<&_group_pool >::IsValidID(), RemoveEngineReplacementForCompany(), and GroupStatistics::UpdateAutoreplace().

static CommandCost CmdStartStopVehicle | ( | const Vehicle * | v,
|  | bool | evaluate_callback |
| ) |  |  | `[inline, static]`

Issue a start/stop command.

Parameters:

  | v | a vehicle
  | evaluate_callback | shall the start/stop callback be evaluated?

Returns:
  success or error

Definition at line 311 of file autoreplace_cmd.cpp.

References CMD_START_STOP_VEHICLE, DC_AUTOREPLACE, DC_EXEC, DoCommand(), and Pool< Titem, Tindex, Tgrowth_step, Tmax_size, Tpool_type, Tcache, Tzero >::PoolItem< Tpool >::index.

static CommandCost CopyHeadSpecificThings | ( | Vehicle * | old_head,
|  | Vehicle * | new_head,
|  | DoCommandFlag | flags |
| ) |  |  | `[static]`

Copy head specific things to the new vehicle chain after it was successfully constructed.

Parameters:

  | old_head | The old front vehicle (no wagons attached anymore)
  | new_head | The new head of the completely replaced vehicle chain
  | flags | the command flags to use

Definition at line 335 of file autoreplace_cmd.cpp.

References CommandCost::AddCost(), ChangeVehicleNews(), ChangeVehicleViewports(), ChangeVehicleViewWindow(), CMD_ADD_VEHICLE_GROUP, CMD_CLONE_ORDER, CMD_RENAME_VEHICLE, Vehicle::CopyVehicleConfigAndStatistics(), DC_AUTOREPLACE, DC_EXEC, DoCommand(), Vehicle::group_id, Pool< Titem, Tindex, Tgrowth_step, Tmax_size, Tpool_type, Tcache, Tzero >::PoolItem< Tpool >::index, Vehicle::name, CommandCost::Succeeded(), Vehicle::vehstatus, and VS_STOPPED.

Referenced by ReplaceChain().

static bool EnginesHaveCargoInCommon | ( | EngineID | engine_a,
|  | EngineID | engine_b |
| ) |  |  | `[static]`

Figure out if two engines got at least one type of cargo in common (refitting if needed).

Parameters:

  | engine_a | one of the EngineIDs
  | engine_b | the other EngineID
  | type | the type of the engines

Returns:
  true if they can both carry the same type of cargo (or at least one of them got no capacity at all)

Definition at line 36 of file autoreplace_cmd.cpp.

References GetUnionOfArticulatedRefitMasks().

Referenced by CheckAutoreplaceValidity().

static CargoID GetNewCargoTypeForReplace | ( | Vehicle * | v,
|  | EngineID | engine_type,
|  | bool | part_of_chain |
| ) |  |  | `[static]`

Function to find what type of cargo to refit to when autoreplacing.

Parameters:

  | *v | Original vehicle that is being replaced.
  | engine_type | The EngineID of the vehicle that is being replaced to
  | part_of_chain | The vehicle is part of a train

Returns:
  The cargo type to replace to CT_NO_REFIT is returned if no refit is needed CT_INVALID is returned when both old and new vehicle got cargo capacity and refitting the new one to the old one's cargo type isn't possible

Definition at line 190 of file autoreplace_cmd.cpp.

References Engine::CanCarryCargo(), Vehicle::cargo_type, CT_INVALID, Vehicle::First(), GetArticulatedRefitMasks(), Vehicle::GetEngine(), HasBit(), IsArticulatedVehicleCarryingDifferentCargoes(), Vehicle::Next(), BaseVehicle::type, VEH_TRAIN, and VerifyAutoreplaceRefitForOrders().

Referenced by BuildReplacementVehicle().

static CommandCost GetNewEngineType | ( | const Vehicle * | v,
|  | const Company * | c,
|  | EngineID & | e |
| ) |  |  | `[static]`

Get the EngineID of the replacement for a vehicle.

Parameters:

  | v | The vehicle to find a replacement for
  | c | The vehicle's owner (it's faster to forward the pointer than refinding it)
  `[out]` | e | the EngineID of the replacement. INVALID_ENGINE if no replacement is found

Returns:
  Error if the engine to build is not available

Definition at line 231 of file autoreplace_cmd.cpp.

References _current_company, Vehicle::engine_type, EngineReplacementForCompany(), SpecializedVehicle< Train, Type >::From(), Vehicle::group_id, INVALID_ENGINE, Vehicle::IsArticulatedPart(), IsEngineBuildable(), GroundVehicle< T, Type >::IsRearDualheaded(), Vehicle::NeedsAutorenewing(), BaseVehicle::type, and VEH_TRAIN.

Referenced by BuildReplacementVehicle(), and CmdAutoreplaceVehicle().

static CommandCost ReplaceChain | ( | Vehicle ** | chain,
|  | DoCommandFlag | flags,
|  | bool | wagon_removal,
|  | bool * | nothing_to_do |
| ) |  |  | `[static]`

Replace a whole vehicle chain.

Parameters:

  | chain | vehicle chain to let autoreplace/renew operator on
  | flags | command flags
  | wagon_removal | remove wagons when the resulting chain occupies more tiles than the old did
  | nothing_to_do | is set to 'false' when something was done (only valid when not failed)

Returns:
  cost or error

< Number of units in the chain

< Will store vehicles of the old chain in their order

< New vehicles corresponding to old_vehs or NULL if no replacement

< Costs for buying and refitting the new vehicles

< Shall store the last engine unit after this step

Definition at line 431 of file autoreplace_cmd.cpp.

References _settings_game, BuildReplacementVehicle(), GroundVehicleCache::cached_total_length, CeilDiv(), CheckCargoCapacity(), CmdMoveVehicle(), CopyHeadSpecificThings(), DC_AUTOREPLACE, DC_EXEC, DoCommand(), Vehicle::engine_type, EXPENSES_NEW_VEHICLES, CommandCost::Failed(), Vehicle::First(), free(), SpecializedVehicle< Train, Type >::From(), GroundVehicle< T, Type >::gcache, CommandCost::GetCost(), CommandCost::GetErrorMessage(), Train::GetNextUnit(), Train::GetPrevUnit(), Pool< Titem, Tindex, Tgrowth_step, Tmax_size, Tpool_type, Tcache, Tzero >::PoolItem< Tpool >::index, Vehicle::IsPrimaryVehicle(), VehicleSettings::max_train_length, RAILVEH_WAGON, CommandCost::Succeeded(), TILE_SIZE, TransferCargo(), BaseVehicle::type, VEH_TRAIN, and GameSettings::vehicle.

Referenced by CmdAutoreplaceVehicle().

static CommandCost ReplaceFreeUnit | ( | Vehicle ** | single_unit,
|  | DoCommandFlag | flags,
|  | bool * | nothing_to_do |
| ) |  |  | `[static]`

Replace a single unit in a free wagon chain.

Parameters:

  | single_unit | vehicle to let autoreplace/renew operator on
  | flags | command flags
  | nothing_to_do | is set to 'false' when something was done (only valid when not failed)

Returns:
  cost or error

Definition at line 381 of file autoreplace_cmd.cpp.

References BuildReplacementVehicle(), CmdMoveVehicle(), DC_EXEC, DoCommand(), EXPENSES_NEW_VEHICLES, SpecializedVehicle< Train, Type >::From(), Pool< Titem, Tindex, Tgrowth_step, Tmax_size, Tpool_type, Tcache, Tzero >::PoolItem< Tpool >::index, Vehicle::IsArticulatedPart(), GroundVehicle< T, Type >::IsRearDualheaded(), and TransferCargo().

Referenced by CmdAutoreplaceVehicle().

static void TransferCargo | ( | Vehicle * | old_veh,
|  | Vehicle * | new_head,
|  | bool | part_of_chain |
| ) |  |  | `[static]`

Transfer cargo from a single (articulated )old vehicle to the new vehicle chain.

Parameters:

  | old_veh | Old vehicle that will be sold
  | new_head | Head of the completely constructed new vehicle chain
  | part_of_chain | The vehicle is part of a train

Definition at line 124 of file autoreplace_cmd.cpp.

References Vehicle::cargo, Train::ConsistChanged(), CargoList< Tinst, Tcont >::Count(), SpecializedVehicle< Train, Type >::From(), Vehicle::IsArticulatedPart(), Vehicle::IsPrimaryVehicle(), min(), Vehicle::Next(), NUM_CARGO, BaseVehicle::type, and VEH_TRAIN.

Referenced by ReplaceChain(), and ReplaceFreeUnit().

static bool VerifyAutoreplaceRefitForOrders | ( | const Vehicle * | v,
|  | EngineID | engine_type |
| ) |  |  | `[static]`

Tests whether refit orders that applied to v will also apply to the new vehicle type.

Parameters:

  | v | The vehicle to be replaced
  | engine_type | The type we want to replace with

Returns:
  true iff all refit orders stay valid

Definition at line 162 of file autoreplace_cmd.cpp.

References Vehicle::engine_type, Vehicle::First(), Order::GetRefitCargo(), GetUnionOfArticulatedRefitMasks(), HasBit(), Order::IsAutoRefit(), Order::IsRefit(), and BaseVehicle::type.

Referenced by GetNewCargoTypeForReplace().