# order_cmd.cpp File Reference

Handling of orders. More...

`#include "stdafx.h"`
`#include "debug.h"`
`#include "command_func.h"`
`#include "company_func.h"`
`#include "news_func.h"`
`#include "vehicle_gui.h"`
`#include "strings_func.h"`
`#include "functions.h"`
`#include "window_func.h"`
`#include "timetable.h"`
`#include "vehicle_func.h"`
`#include "depot_base.h"`
`#include "core/pool_func.hpp"`
`#include "aircraft.h"`
`#include "roadveh.h"`
`#include "station_base.h"`
`#include "waypoint_base.h"`
`#include "company_base.h"`
`#include "table/strings.h"`

Go to the source code of this file.

## Functions
| assert_compile (sizeof(DestinationID) >=sizeof(DepotID))
void | InvalidateVehicleOrder (const Vehicle *v, int data)
| Updates the widgets of a vehicle which contains the order-data.
static bool | OrderGoesToStation (const Vehicle *v, const Order *o)
| Checks whether the order goes to a station or not, i.e.
static void | DeleteOrderWarnings (const Vehicle *v)
| Delete all news items regarding defective orders about a vehicle This could kill still valid warnings (for example about void order when just another order gets added), but assume the company will notice the problems, when (s)he's changing the orders.
static TileIndex | GetOrderLocation (const Order &o)
static uint | GetOrderDistance (const Order *prev, const Order *cur, const Vehicle *v, int conditional_depth=0)
CommandCost | CmdInsertOrder (TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 p2, const char *text)
| Add an order to the orderlist of a vehicle.
static CommandCost | DecloneOrder (Vehicle *dst, DoCommandFlag flags)
| Declone an order-list.
CommandCost | CmdDeleteOrder (TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 p2, const char *text)
| Delete an order from the orderlist of a vehicle.
CommandCost | CmdSkipToOrder (TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 p2, const char *text)
| Goto order of order-list.
CommandCost | CmdMoveOrder (TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 p2, const char *text)
| Move an order inside the orderlist.
CommandCost | CmdModifyOrder (TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 p2, const char *text)
| Modify an order in the orderlist of a vehicle.
CommandCost | CmdCloneOrder (TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 p2, const char *text)
| Clone/share/copy an order-list of another vehicle.
CommandCost | CmdOrderRefit (TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 p2, const char *text)
| Add/remove refit orders from an order.
void | BackupVehicleOrders (const Vehicle *v, BackuppedOrders *bak)
| Backup a vehicle order-list, so you can replace a vehicle without losing the order-list.
void | RestoreVehicleOrders (const Vehicle *v, const BackuppedOrders *bak)
| Restore vehicle orders that are backupped via BackupVehicleOrders.
CommandCost | CmdRestoreOrderIndex (TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 p2, const char *text)
| Restore the current order-index of a vehicle and sets service-interval.
void | CheckOrders (const Vehicle *v)
| Check the orders of a vehicle, to see if there are invalid orders and stuff.
void | RemoveOrderFromAllVehicles (OrderType type, DestinationID destination)
| Removes an order from all vehicles.
bool | VehicleHasDepotOrders (const Vehicle *v)
| Checks if a vehicle has a GOTO_DEPOT in his order list.
void | DeleteVehicleOrders (Vehicle *v, bool keep_orderlist)
| Delete all orders from a vehicle.
uint16 | GetServiceIntervalClamped (uint interval, CompanyID company_id)
| Clamp the service interval to the correct min/max.
static bool | CheckForValidOrders (const Vehicle *v)
| Check if a vehicle has any valid orders.
static bool | OrderConditionCompare (OrderConditionComparator occ, int variable, int value)
| Compare the variable and value based on the given comparator.
VehicleOrderID | ProcessConditionalOrder (const Order *order, const Vehicle *v)
| Process a conditional order and determine the next order.
bool | UpdateOrderDest (Vehicle *v, const Order *order, int conditional_depth)
| Update the vehicle's destination tile from an order.
bool | ProcessOrders (Vehicle *v)
| Handle the orders of a vehicle and determine the next place to go to if needed.
void | InitializeOrders ()
## Variables
TileIndex | _backup_orders_tile
BackuppedOrders | _backup_orders_data
OrderPool | _order_pool ("Order")
OrderListPool | _orderlist_pool ("OrderList")

## Detailed Description

Handling of orders.

Definition in file order_cmd.cpp.

## Function Documentation

void BackupVehicleOrders | ( | const Vehicle * | v,
|  | BackuppedOrders * | bak |
| ) |  |  |

Backup a vehicle order-list, so you can replace a vehicle without losing the order-list.

Definition at line 1282 of file order_cmd.cpp.

References INVALID_VEHICLE.

static bool CheckForValidOrders | ( | const Vehicle * | v | ) | `[static]`

Check if a vehicle has any valid orders.

Returns:
  false if there are no valid orders

Note:
  Conditional orders are not considered valid destination orders

Definition at line 1587 of file order_cmd.cpp.

Referenced by ProcessOrders().

void CheckOrders | ( | const Vehicle * | v | ) |

Check the orders of a vehicle, to see if there are invalid orders and stuff.

Definition at line 1423 of file order_cmd.cpp.

References _settings_client, AddVehicleNewsItem(), CanVehicleUseStation(), SpecializedStation< Station, false >::Get(), ClientSettings::gui, NS_ADVICE, GUISettings::order_review_system, and SetDParam().

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

Clone/share/copy an order-list of another vehicle.

Parameters:

  | tile | unused
  | flags | operation to perform
  | p1 | various bitstuffed elements p1 = (bit 0-15) - destination vehicle to clone orders to (p1 & 0xFFFF) p1 = (bit 16-31) - source vehicle to clone orders from, if any (none for CO_UNSHARE)
  | p2 | mode of cloning: CO_SHARE, CO_COPY, or CO_UNSHARE
  | text | unused

Returns:
  the cost of this operation or an error

Definition at line 1123 of file order_cmd.cpp.

References Pool< Titem, Tindex, Tgrowth_step, Tmax_size, Tcache, Tzero >::PoolItem< Tpool >::CanAllocateItem(), CanVehicleUseStation(), CheckOwnership(), CMD_ERROR, DC_EXEC, DecloneOrder(), DeleteVehicleOrders(), OrderList::first, SpecializedVehicle< RoadVehicle, VEH_ROAD >::From(), GB(), SpecializedStation< Station, false >::Get(), GetWindowClassForVehicleType(), InvalidateVehicleOrder(), InvalidateWindowClassesData(), RoadVehicle::IsBus(), OrderGoesToStation(), OrderList::OrderList(), return_cmd_error, and VEH_ROAD.

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

Delete an order from the orderlist of a vehicle.

Parameters:

  | tile | unused
  | flags | operation to perform
  | p1 | the ID of the vehicle
  | p2 | the order to delete (max 255)
  | text | unused

Returns:
  the cost of this operation or an error

Definition at line 711 of file order_cmd.cpp.

References CheckOwnership(), CMD_ERROR, DC_EXEC, DecloneOrder(), DeleteOrderWarnings(), GetWindowClassForVehicleType(), INVALID_VEH_ORDER_ID, InvalidateVehicleOrder(), InvalidateWindowClassesData(), max(), and ONSF_STOP_EVERYWHERE.

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

Add an order to the orderlist of a vehicle.

Parameters:

  | tile | unused
  | flags | operation to perform
  | p1 | various bitstuffed elements p1 = (bit 0 - 15) - ID of the vehicle p1 = (bit 16 - 31) - the selected order (if any). If the last order is given, the order will be inserted before that one the maximum vehicle order id is 254.
  | p2 | packed order to insert
  | text | unused

Returns:
  the cost of this operation or an error

Definition at line 451 of file order_cmd.cpp.

References _settings_game, Pool< Titem, Tindex, Tgrowth_step, Tmax_size, Tcache, Tzero >::PoolItem< Tpool >::CanAllocateItem(), CanVehicleUseStation(), CheckOwnership(), CMD_ERROR, DC_EXEC, DeleteOrderWarnings(), FACIL_DOCK, FACIL_TRAIN, GB(), Station::GetAirportSpec(), SpecializedStation< Station, false >::GetIfValid(), OrderList::GetNumOrders(), GetTileOwner(), GetWindowClassForVehicleType(), INVALID_VEH_ORDER_ID, InvalidateVehicleOrder(), InvalidateWindowClassesData(), IsRailDepotTile(), MAX_VEH_ORDER_ID, AirportSpec::nof_depots, OCC_EQUALS, OCC_IS_FALSE, OCC_IS_TRUE, OCV_LOAD_PERCENTAGE, OCV_RELIABILITY, OCV_REQUIRES_SERVICE, OCV_UNCONDITIONALLY, ODATFB_HALT, ODATFB_NEAREST_DEPOT, ODTFB_PART_OF_ORDERS, ODTFB_SERVICE, OLF_FULL_LOAD_ANY, OLF_LOAD_IF_POSSIBLE, OLFB_FULL_LOAD, OLFB_NO_LOAD, ONSF_STOP_EVERYWHERE, OrderList::OrderList(), OSL_PLATFORM_FAR_END, OSL_PLATFORM_MIDDLE, OSL_PLATFORM_NEAR_END, OUF_UNLOAD_IF_POSSIBLE, OUFB_NO_UNLOAD, OUFB_TRANSFER, OUFB_UNLOAD, BaseStation::owner, OWNER_NONE, PathfinderSettings::pathfinder_for_ships, GameSettings::pf, return_cmd_error, VEH_AIRCRAFT, VEH_ROAD, VEH_SHIP, VEH_TRAIN, and VPF_NPF.

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

Modify an order in the orderlist of a vehicle.

Parameters:

  | tile | unused
  | flags | operation to perform
  | p1 | various bitstuffed elements p1 = (bit 0 - 15) - ID of the vehicle p1 = (bit 16 - 31) - the selected order (if any). If the last order is given, the order will be inserted before that one only the first 8 bits used currently (bit 16 - 23) (max 255)
  | p2 | various bitstuffed elements p2 = (bit 0 - 3) - what data to modify (

See also:
  ModifyOrderFlags)
  - p2 = (bit 4 - 15) - the data to modify

Parameters:

  | text | unused

Returns:
  the cost of this operation or an error

Definition at line 896 of file order_cmd.cpp.

References CheckOwnership(), CMD_ERROR, DA_ALWAYS_GO, DA_SERVICE, DA_STOP, DC_EXEC, DeleteOrderWarnings(), GB(), InvalidateVehicleOrder(), MOF_COND_COMPARATOR, MOF_COND_DESTINATION, MOF_COND_VALUE, MOF_COND_VARIABLE, MOF_DEPOT_ACTION, MOF_LOAD, MOF_NON_STOP, MOF_STOP_LOCATION, MOF_UNLOAD, OCC_EQUALS, OCC_IS_FALSE, OCC_IS_TRUE, OCV_LOAD_PERCENTAGE, OCV_RELIABILITY, OCV_REQUIRES_SERVICE, OCV_UNCONDITIONALLY, ODATFB_HALT, ODTFB_SERVICE, OLFB_NO_LOAD, OUFB_NO_UNLOAD, OUFB_TRANSFER, OUFB_UNLOAD, VEH_ROAD, and VEH_TRAIN.

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

Move an order inside the orderlist.

Parameters:

  | tile | unused
  | flags | operation to perform
  | p1 | the ID of the vehicle
  | p2 | order to move and target bit 0-15 : the order to move bit 16-31 : the target order
  | text | unused

Returns:
  the cost of this operation or an error

Note:
  The target order will move one place down in the orderlist if you move the order upwards else it'll move it one place down

Definition at line 818 of file order_cmd.cpp.

References CheckOwnership(), CMD_ERROR, DC_EXEC, DeleteOrderWarnings(), GB(), GetWindowClassForVehicleType(), InvalidateVehicleOrder(), and InvalidateWindowClassesData().

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

Add/remove refit orders from an order.

Parameters:

  | tile | Not used
  | flags | operation to perform
  | p1 | VehicleIndex of the vehicle having the order
  | p2 | bitmask bit 0-7 CargoID bit 8-15 Cargo subtype bit 16-23 number of order to modify
  | text | unused

Returns:
  the cost of this operation or an error

Definition at line 1246 of file order_cmd.cpp.

References CheckOwnership(), CMD_ERROR, DC_EXEC, GB(), InvalidateVehicleOrder(), and ODTFB_PART_OF_ORDERS.

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

Restore the current order-index of a vehicle and sets service-interval.

Parameters:

  | tile | unused
  | flags | operation to perform
  | p1 | the ID of the vehicle
  | p2 | various bistuffed elements p2 = (bit 0-15) - current order-index (p2 & 0xFFFF) p2 = (bit 16-31) - service interval (p2 >> 16)
  | text | unused

Returns:
  the cost of this operation or an error

Todo:
  Unfortunately you cannot safely restore the unitnumber or the old vehicle as far as I can see. We can store it in BackuppedOrders, and restore it, but but we have no way of seeing it has been tampered with or not, as we have no legit way of knowing what that ID was.
  If we do want to backup/restore it, just add UnitID uid to BackuppedOrders, and restore it as parameter 'y' (ugly hack I know) for example. "v->unitnumber = y;"

Definition at line 1399 of file order_cmd.cpp.

References CheckOwnership(), CMD_ERROR, DC_EXEC, GB(), and GetServiceIntervalClamped().

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

Goto order of order-list.

Parameters:

  | tile | unused
  | flags | operation to perform
  | p1 | The ID of the vehicle which order is skipped
  | p2 | the selected order to which we want to skip
  | text | unused

Returns:
  the cost of this operation or an error

Definition at line 778 of file order_cmd.cpp.

References CheckOwnership(), CMD_ERROR, DC_EXEC, InvalidateVehicleOrder(), SetWindowClassesDirty(), VEH_AIRCRAFT, and VEH_SHIP.

static CommandCost DecloneOrder | ( | Vehicle * | dst,
|  | DoCommandFlag | flags |
| ) |  |  | `[static]`

Declone an order-list.

Parameters:

  | *dst | delete the orders of this vehicle
  | flags | execution flags

Definition at line 693 of file order_cmd.cpp.

References DC_EXEC, DeleteVehicleOrders(), GetWindowClassForVehicleType(), InvalidateVehicleOrder(), and InvalidateWindowClassesData().

Referenced by CmdCloneOrder(), and CmdDeleteOrder().

void DeleteVehicleOrders | ( | Vehicle * | v,
|  | bool | keep_orderlist |
| ) |  |  |

Delete all orders from a vehicle.

Definition at line 1559 of file order_cmd.cpp.

References DeleteOrderWarnings().

Referenced by CmdCloneOrder(), CmdMoveRailVehicle(), CmdSellRailWagon(), and DecloneOrder().

uint16 GetServiceIntervalClamped | ( | uint | interval,
|  | CompanyID | company_id |
| ) |  |  |

Clamp the service interval to the correct min/max.

The actual min/max values depend on whether it's in percent or days.

Parameters:

  | interval | proposed service interval
  | company_id | the owner of the vehicle

Returns:
  Clamped service interval

Definition at line 1574 of file order_cmd.cpp.

References Clamp().

Referenced by CmdChangeServiceInt(), CmdRestoreOrderIndex(), and VehicleDetailsWindow::OnClick().

void InvalidateVehicleOrder | ( | const Vehicle * | v,
|  | int | data |
| ) |  |  |

Updates the widgets of a vehicle which contains the order-data.

Definition at line 175 of file order_cmd.cpp.

References InvalidateWindowData(), and SetWindowDirty().

Referenced by CmdCloneOrder(), CmdDeleteOrder(), CmdInsertOrder(), CmdModifyOrder(), CmdMoveOrder(), CmdOrderRefit(), CmdSkipToOrder(), DecloneOrder(), ProcessOrders(), and RemoveOrderFromAllVehicles().

static bool OrderGoesToStation | ( | const Vehicle * | v,
|  | const Order * | o |
| ) |  |  | `[inline, static]`

Checks whether the order goes to a station or not, i.e.

whether the destination is a station

Parameters:

  | v | the vehicle to check for
  | o | the order to check

Returns:
  true if the destination is a station

Definition at line 391 of file order_cmd.cpp.

References ODATFB_NEAREST_DEPOT, and VEH_AIRCRAFT.

Referenced by CmdCloneOrder().

VehicleOrderID ProcessConditionalOrder | ( | const Order * | order,
|  | const Vehicle * | v |
| ) |  |  |

Process a conditional order and determine the next order.

Parameters:

  | order | the order the vehicle currently has
  | v | the vehicle to update

Returns:
  index of next order to jump to, or INVALID_VEH_ORDER_ID to use the next order

Definition at line 1630 of file order_cmd.cpp.

References CalcPercentVehicleFilled(), DAYS_IN_LEAP_YEAR, INVALID_VEH_ORDER_ID, OCV_AGE, OCV_LOAD_PERCENTAGE, OCV_MAX_SPEED, OCV_RELIABILITY, OCV_REQUIRES_SERVICE, OCV_UNCONDITIONALLY, OrderConditionCompare(), and ToPercent16().

Referenced by VehicleOrderSaver::SwitchToNextOrder(), and UpdateOrderDest().

bool ProcessOrders | ( | Vehicle * | v | ) |

Handle the orders of a vehicle and determine the next place to go to if needed.

Parameters:

  | v | the vehicle to do this for.

Returns:
  true *if* the vehicle is eligible for reversing (basically only when leaving a station).

Reversing because of order change is allowed only just after leaving a station (and the difficulty setting to allowed, of course) this can be detected because only after OT_LEAVESTATION, current_order will be reset to nothing. (That also happens if no order, but in that case it won't hit the point in code where may_reverse is checked)

Definition at line 1741 of file order_cmd.cpp.

References CheckForValidOrders(), SpecializedVehicle< Aircraft, VEH_AIRCRAFT >::From(), SpecializedStation< Station, false >::Get(), GetStationIndex(), GetWindowClassForVehicleType(), INVALID_TILE, InvalidateVehicleOrder(), IsTileType(), MP_STATION, ODTFB_PART_OF_ORDERS, ONSF_NO_STOP_AT_DESTINATION_STATION, SetWindowClassesDirty(), UpdateOrderDest(), VEH_AIRCRAFT, VEH_ROAD, VEH_SHIP, and VEH_TRAIN.

void RemoveOrderFromAllVehicles | ( | OrderType | type,
|  | DestinationID | destination |
| ) |  |  |

Removes an order from all vehicles.

Triggers when, say, a station is removed.

Parameters:

  | type | The type of the order (OT_GOTO_[STATION|DEPOT|WAYPOINT]).
  | destination | The destination. Can be a StationID, DepotID or WaypointID.

Definition at line 1498 of file order_cmd.cpp.

References INVALID_VEH_ORDER_ID, InvalidateVehicleOrder(), ODATFB_NEAREST_DEPOT, SetWindowDirty(), and VEH_AIRCRAFT.

Referenced by Station::~Station().

void RestoreVehicleOrders | ( | const Vehicle * | v,
|  | const BackuppedOrders * | bak |
| ) |  |  |

Restore vehicle orders that are backupped via BackupVehicleOrders.

Definition at line 1333 of file order_cmd.cpp.

References _settings_game, CMD_ADD_VEHICLE_GROUP, CMD_CHANGE_TIMETABLE, CMD_CLONE_ORDER, CMD_INSERT_ORDER, CMD_MODIFY_ORDER, CMD_NO_TEST_IF_IN_NETWORK, CMD_RENAME_VEHICLE, CMD_RESTORE_ORDER_INDEX, DoCommandP(), INVALID_VEHICLE, MOF_LOAD, GameSettings::order, and OrderSettings::timetabling.

Referenced by CcBuildPrimaryVehicle().

bool UpdateOrderDest | ( | Vehicle * | v,
|  | const Order * | order,
|  | int | conditional_depth |
| ) |  |  |

Update the vehicle's destination tile from an order.

Parameters:

  | order | the order the vehicle currently has
  | v | the vehicle to update
  | conditional_depth | the depth (amount of steps) to go with conditional orders. This to prevent infinite loops.

Definition at line 1657 of file order_cmd.cpp.

References AircraftNextAirportPos_and_Order(), CMD_REVERSE_TRAIN_DIRECTION, DC_EXEC, DoCommand(), SpecializedVehicle< Aircraft, VEH_AIRCRAFT >::From(), INVALID_VEH_ORDER_ID, ODATFB_NEAREST_DEPOT, ODTFB_SERVICE, ProcessConditionalOrder(), Aircraft::state, Aircraft::targetairport, UpdateOrderDest(), VEH_AIRCRAFT, and VEH_TRAIN.

Referenced by ProcessOrders(), VehicleOrderSaver::SwitchToNextOrder(), and UpdateOrderDest().

bool VehicleHasDepotOrders | ( | const Vehicle * | v | ) |

Checks if a vehicle has a GOTO_DEPOT in his order list.

Returns:
  True if this is true (lol ;))

Definition at line 1542 of file order_cmd.cpp.