31 #include "table/strings.h"
38 static_assert(
sizeof(DestinationID) >=
sizeof(
DepotID));
39 static_assert(
sizeof(DestinationID) >=
sizeof(StationID));
49 if (CleaningPool())
return;
53 if (this->IsType(OT_GOTO_STATION) || this->IsType(OT_GOTO_WAYPOINT)) {
65 this->
type = OT_NOTHING;
77 this->
type = OT_GOTO_STATION;
79 this->
dest = destination;
92 this->
type = OT_GOTO_DEPOT;
96 this->
dest = destination;
106 this->
type = OT_GOTO_WAYPOINT;
108 this->
dest = destination;
117 this->
type = OT_LOADING;
118 if (!ordered) this->
flags = 0;
126 this->
type = OT_LEAVESTATION;
135 this->
type = OT_DUMMY;
145 this->
type = OT_CONDITIONAL;
156 this->
type = OT_IMPLICIT;
157 this->
dest = destination;
210 uint16_t order = this->
GetType();
211 switch (this->
type) {
212 case OT_GOTO_STATION:
321 for (
Order *o = this->
first; o !=
nullptr; o = next) {
326 if (keep_orderlist) {
327 this->
first =
nullptr;
343 if (
index < 0)
return nullptr;
347 while (order !=
nullptr &&
index-- > 0) {
366 if (hops > this->
GetNumOrders() || next ==
nullptr)
return nullptr;
368 if (next->
IsType(OT_CONDITIONAL)) {
378 if (next->
IsType(OT_GOTO_DEPOT)) {
380 if (next->
IsRefit())
return next;
383 if (!next->CanLoadOrUnload()) {
403 if (
first ==
nullptr) {
405 if (next ==
nullptr) {
407 if (next ==
nullptr)
return INVALID_STATION;
413 assert(next !=
nullptr);
421 while (next !=
nullptr && next->
IsType(OT_CONDITIONAL)) {
427 if (advance ==
nullptr || advance ==
first || skip_to == advance) {
428 next = (skip_to ==
first) ?
nullptr : skip_to;
429 }
else if (skip_to ==
nullptr || skip_to ==
first) {
430 next = (advance ==
first) ?
nullptr : advance;
441 if (next ==
nullptr || ((next->
IsType(OT_GOTO_STATION) || next->
IsType(OT_IMPLICIT)) &&
444 return INVALID_STATION;
458 if (this->
first ==
nullptr) {
459 this->
first = new_order;
464 this->
first = new_order;
472 order->
next = new_order;
482 if (new_order->
IsType(OT_GOTO_STATION) || new_order->
IsType(OT_GOTO_WAYPOINT)) {
501 to_remove = this->
first;
505 to_remove = prev->
next;
528 moving_one = this->
first;
532 moving_one = one_before->
next;
533 one_before->
next = moving_one->
next;
539 this->
first = moving_one;
542 moving_one->
next = one_before->
next;
543 one_before->
next = moving_one;
566 if (o->IsType(OT_IMPLICIT))
continue;
567 if (!o->IsCompletelyTimetabled())
return false;
576 void OrderList::DebugCheckSanity()
const
580 uint check_num_vehicles = 0;
584 Debug(misc, 6,
"Checking OrderList {} for sanity...", this->
index);
588 if (!o->IsType(OT_IMPLICIT)) ++check_num_manual_orders;
589 check_timetable_duration += o->GetTimetabledWait() + o->GetTimetabledTravel();
590 check_total_duration += o->GetWaitTime() + o->GetTravelTime();
598 ++check_num_vehicles;
599 assert(v->orders ==
this);
602 Debug(misc, 6,
"... detected {} orders ({} manual), {} vehicles, {} timetabled, {} total",
617 return o->
IsType(OT_GOTO_STATION) ||
645 case OT_GOTO_WAYPOINT:
646 case OT_GOTO_STATION:
671 if (cur->
IsType(OT_CONDITIONAL)) {
678 return std::max(dist1, dist2);
703 if (ret.
Failed())
return ret;
711 case OT_GOTO_STATION: {
717 if (ret.
Failed())
return ret;
764 case OT_GOTO_DEPOT: {
772 if (ret.
Failed())
return ret;
783 if (ret.
Failed())
return ret;
819 case OT_GOTO_WAYPOINT: {
830 if (ret.
Failed())
return ret;
838 if (ret.
Failed())
return ret;
846 if (ret.
Failed())
return ret;
858 case OT_CONDITIONAL: {
915 if (v->
orders ==
nullptr) {
930 if (sel_ord <= u->cur_real_order_index) {
933 if (cur < u->GetNumOrders()) {
944 if (sel_ord <= u->cur_implicit_order_index) {
947 if (cur < u->GetNumOrders()) {
961 if (order->IsType(OT_CONDITIONAL)) {
963 if (order_id >= sel_ord) {
964 order->SetConditionSkipToOrder(order_id + 1);
966 if (order_id == cur_order_id) {
967 order->SetConditionSkipToOrder((order_id + 1) % v->
GetNumOrders());
1006 if (ret.
Failed())
return ret;
1050 if (sel_ord < u->cur_real_order_index) {
1056 if (sel_ord < u->cur_implicit_order_index) {
1078 if (order->IsType(OT_CONDITIONAL)) {
1080 if (order_id >= sel_ord) {
1081 order_id = std::max(order_id - 1, 0);
1083 if (order_id == cur_order_id) {
1086 order->SetConditionSkipToOrder(order_id);
1108 if (ret.
Failed())
return ret;
1145 if (ret.
Failed())
return ret;
1153 if (moving_one ==
nullptr)
return CMD_ERROR;
1206 if (order->IsType(OT_CONDITIONAL)) {
1208 if (order_id == moving_order) {
1209 order_id = target_order;
1210 }
else if (order_id > moving_order && order_id <= target_order) {
1212 }
else if (order_id < moving_order && order_id >= target_order) {
1215 order->SetConditionSkipToOrder(order_id);
1245 if (ret.
Failed())
return ret;
1251 assert(order !=
nullptr);
1253 case OT_GOTO_STATION:
1261 case OT_GOTO_WAYPOINT:
1265 case OT_CONDITIONAL:
1274 default: NOT_REACHED();
1453 default: NOT_REACHED();
1498 for (
const Order *o = first; o !=
nullptr; o = o->
next) {
1499 switch (o->GetType()) {
1500 case OT_GOTO_STATION:
1502 case OT_GOTO_WAYPOINT:
1528 if (ret.
Failed())
return ret;
1538 if (ret.
Failed())
return ret;
1595 if (ret.
Failed())
return ret;
1618 Order *first =
nullptr;
1628 *order_dst =
new Order();
1629 (*order_dst)->AssignOrder(*order);
1630 order_dst = &(*order_dst)->
next;
1632 if (dst->
orders ==
nullptr) {
1672 if (ret.
Failed())
return ret;
1696 if (u->cur_real_order_index == order_number && (u->current_order.GetDepotOrderType() &
ODTFB_PART_OF_ORDERS)) {
1697 u->current_order.SetRefit(cargo);
1734 if (order->IsType(OT_DUMMY)) {
1735 message = STR_NEWS_VEHICLE_HAS_VOID_ORDER;
1739 if (order->IsType(OT_GOTO_STATION)) {
1744 message = STR_NEWS_VEHICLE_HAS_INVALID_ENTRY;
1750 message = STR_NEWS_PLANE_USES_TOO_SHORT_RUNWAY;
1760 message = STR_NEWS_VEHICLE_HAS_DUPLICATE_ENTRY;
1765 if (n_st < 2 && message ==
INVALID_STRING_ID) message = STR_NEWS_VEHICLE_HAS_TOO_FEW_ORDERS;
1768 if (v->
orders !=
nullptr) v->
orders->DebugCheckSanity();
1795 if ((v->type ==
VEH_AIRCRAFT && v->current_order.IsType(OT_GOTO_DEPOT) && !hangar ? OT_GOTO_STATION : v->current_order.GetType()) == type &&
1796 (!hangar || v->type ==
VEH_AIRCRAFT) && v->current_order.GetDestination() == destination) {
1797 v->current_order.MakeDummy();
1803 for (
Order *order : v->Orders()) {
1808 if (ot == OT_GOTO_DEPOT && (order->GetDepotActionType() &
ODATFB_NEAREST_DEPOT) != 0)
continue;
1809 if (ot == OT_GOTO_DEPOT && hangar && v->type !=
VEH_AIRCRAFT)
continue;
1810 if (ot == OT_IMPLICIT || (v->type ==
VEH_AIRCRAFT && ot == OT_GOTO_DEPOT && !hangar)) ot = OT_GOTO_STATION;
1811 if (ot == type && order->GetDestination() == destination) {
1815 if (order->IsType(OT_IMPLICIT)) {
1816 order = order->next;
1818 if (order !=
nullptr)
goto restart;
1823 v->orders->UpdateTotalDuration(-order->GetWaitTime());
1824 if (order->IsWaitTimetabled()) {
1825 v->orders->UpdateTimetableDuration(-order->GetTimetabledWait());
1826 order->SetWaitTimetabled(
false);
1828 order->SetWaitTime(0);
1831 bool travel_timetabled = order->IsTravelTimetabled();
1833 order->SetTravelTimetabled(travel_timetabled);
1854 if (order->IsType(OT_GOTO_DEPOT))
return true;
1877 }
else if (v->
orders !=
nullptr) {
1880 if (!keep_orderlist) v->
orders =
nullptr;
1886 if (reset_order_indices) {
1904 if (ispercent)
return Clamp(interval, MIN_SERVINT_PERCENT, MAX_SERVINT_PERCENT);
1910 return Clamp(interval, MIN_SERVINT_DAYS, MAX_SERVINT_DAYS);
1924 switch (order->GetType()) {
1925 case OT_GOTO_STATION:
1927 case OT_GOTO_WAYPOINT:
1952 default: NOT_REACHED();
1956 template <typename T, std::enable_if_t<std::is_base_of<StrongTypedefBase, T>::value,
int> = 0>
1972 bool skip_order =
false;
1985 default: NOT_REACHED();
2007 case OT_GOTO_STATION:
2013 assert(!pbs_look_ahead);
2027 if (closestDepot.found) {
2029 if (pbs_look_ahead && closestDepot.reverse)
return false;
2031 v->SetDestTile(closestDepot.location);
2048 if (pbs_look_ahead)
return false;
2060 a->SetDestTile(a->GetOrderStationLocation(destination));
2067 case OT_GOTO_WAYPOINT:
2071 case OT_CONDITIONAL: {
2072 assert(!pbs_look_ahead);
2105 if (order !=
nullptr && order->
IsType(OT_IMPLICIT)) {
2110 if (order ==
nullptr) {
2117 return UpdateOrderDest(v, order, conditional_depth + 1, pbs_look_ahead);
2138 case OT_LEAVESTATION:
2173 if (order !=
nullptr && order->
IsType(OT_IMPLICIT)) {
2227 bool is_dest_station = this->
IsType(OT_GOTO_STATION) && this->
dest == station;
2235 bool Order::CanLoadOrUnload()
const
2237 return (this->
IsType(OT_GOTO_STATION) || this->
IsType(OT_IMPLICIT)) &&
void AircraftNextAirportPos_and_Order(Aircraft *v)
set the right pos when heading to other airports after takeoff
@ FLYING
Vehicle is flying in the air.
constexpr T SetBit(T &x, const uint8_t y)
Set a bit in a variable.
constexpr static debug_inline uint GB(const T x, const uint8_t s, const uint8_t n)
Fetch n bits from x, started at bit s.
static const CargoID CARGO_NO_REFIT
Do not refit cargo of a vehicle (used in vehicle orders and auto-replace/auto-renew).
uint8_t CargoID
Cargo slots to indicate a cargo type within a game.
static const CargoID NUM_CARGO
Maximum number of cargo types in a game.
static const CargoID CARGO_AUTO_REFIT
Automatically choose cargo type when doing auto refitting.
Cheats _cheats
All the cheats.
Types related to cheating.
Common return value for all commands.
bool Failed() const
Did this command fail?
Minimal stack that uses a pool to avoid pointers.
Titem Pop()
Pop an item from the stack.
bool IsEmpty() const
Check if the stack is empty.
void Push(const Titem &item)
Pushes a new item onto the stack if there is still space in the underlying pool.
static constexpr TimerGameTick::Ticks DAY_TICKS
1 day is 74 ticks; TimerGameCalendar::date_fract used to be uint16_t and incremented by 885.
static constexpr int DAYS_IN_LEAP_YEAR
sometimes, you need one day more...
static bool UsingWallclockUnits(bool newgame=false)
Check if we are using wallclock units.
static DateFract date_fract
Fractional part of the day.
int32_t Ticks
The type to store ticks in.
static constexpr Year DateToYear(Date date)
Calculate the year of a given date.
Functions related to commands.
static const CommandCost CMD_ERROR
Define a default return value for a failed command.
#define return_cmd_error(errcode)
Returns from a function with a specific StringID as error.
DoCommandFlag
List of flags for a command.
@ DC_EXEC
execute the given command
Definition of stuff that is very close to a company, like the company struct itself.
CommandCost CheckOwnership(Owner owner, TileIndex tile)
Check whether the current owner owns something.
CompanyID _local_company
Company controlled by the human player at this client. Can also be COMPANY_SPECTATOR.
Functions related to companies.
@ OWNER_NONE
The tile has no ownership.
Functions related to debugging.
#define Debug(category, level, format_string,...)
Ouptut a line of debugging information.
Base for all depots (except hangars)
uint16_t DepotID
Type for the unique identifier of depots.
@ GVF_SUPPRESS_IMPLICIT_ORDERS
Disable insertion and removal of automatic orders until the vehicle completes the real order.
uint DistanceSquare(TileIndex t0, TileIndex t1)
Gets the 'Square' distance between the two given tiles.
uint DistanceManhattan(TileIndex t0, TileIndex t1)
Gets the Manhattan distance between the two given tiles.
constexpr uint ToPercent16(uint i)
Converts a "fract" value 0..65535 to "percent" value 0..100.
constexpr T Clamp(const T a, const T min, const T max)
Clamp a value between an interval.
Functions related to news.
void DeleteVehicleNews(VehicleID vid, StringID news)
Delete a news item type about a vehicle.
void AddVehicleAdviceNewsItem(StringID string, VehicleID vehicle)
Adds a vehicle-advice news item.
Functions related to order backups.
CommandCost CmdMoveOrder(DoCommandFlag flags, VehicleID veh, VehicleOrderID moving_order, VehicleOrderID target_order)
Move an order inside the orderlist.
static bool OrderGoesToStation(const Vehicle *v, const Order *o)
Checks whether the order goes to a station or not, i.e.
static bool CheckAircraftOrderDistance(const Aircraft *v_new, const Vehicle *v_order, const Order *first)
Check if an aircraft has enough range for an order list.
uint16_t GetServiceIntervalClamped(int interval, bool ispercent)
Clamp the service interval to the correct min/max.
static bool CheckForValidOrders(const Vehicle *v)
Check if a vehicle has any valid orders.
CommandCost CmdOrderRefit(DoCommandFlag flags, VehicleID veh, VehicleOrderID order_number, CargoID cargo)
Add/remove refit orders from an order.
CommandCost CmdCloneOrder(DoCommandFlag flags, CloneOptions action, VehicleID veh_dst, VehicleID veh_src)
Clone/share/copy an order-list of another vehicle.
bool ProcessOrders(Vehicle *v)
Handle the orders of a vehicle and determine the next place to go to if needed.
static bool OrderConditionCompare(OrderConditionComparator occ, int variable, int value)
Compare the variable and value based on the given comparator.
static void CancelLoadingDueToDeletedOrder(Vehicle *v)
Cancel the current loading order of the vehicle as the order was deleted.
CommandCost CmdInsertOrder(DoCommandFlag flags, VehicleID veh, VehicleOrderID sel_ord, const Order &new_order)
Add an order to the orderlist of a vehicle.
bool UpdateOrderDest(Vehicle *v, const Order *order, int conditional_depth, bool pbs_look_ahead)
Update the vehicle's destination tile from an order.
void InsertOrder(Vehicle *v, Order *new_o, VehicleOrderID sel_ord)
Insert a new order but skip the validation.
void InvalidateVehicleOrder(const Vehicle *v, int data)
Updates the widgets of a vehicle which contains the order-data.
CommandCost CmdModifyOrder(DoCommandFlag flags, VehicleID veh, VehicleOrderID sel_ord, ModifyOrderFlags mof, uint16_t data)
Modify an order in the orderlist of a vehicle.
void CheckOrders(const Vehicle *v)
Check the orders of a vehicle, to see if there are invalid orders and stuff.
CommandCost CmdDeleteOrder(DoCommandFlag flags, VehicleID veh_id, VehicleOrderID sel_ord)
Delete an order from the orderlist of a vehicle.
CommandCost CmdSkipToOrder(DoCommandFlag flags, VehicleID veh_id, VehicleOrderID sel_ord)
Goto order of order-list.
void DeleteVehicleOrders(Vehicle *v, bool keep_orderlist, bool reset_order_indices)
Delete all orders from a vehicle.
static void DeleteOrderWarnings(const Vehicle *v)
Delete all news items regarding defective orders about a vehicle This could kill still valid warnings...
void DeleteOrder(Vehicle *v, VehicleOrderID sel_ord)
Delete an order but skip the parameter validation.
VehicleOrderID ProcessConditionalOrder(const Order *order, const Vehicle *v)
Process a conditional order and determine the next order.
static CommandCost DecloneOrder(Vehicle *dst, DoCommandFlag flags)
Declone an order-list.
uint GetOrderDistance(const Order *prev, const Order *cur, const Vehicle *v, int conditional_depth)
Get the distance between two orders of a vehicle.
void RemoveOrderFromAllVehicles(OrderType type, DestinationID destination, bool hangar)
Removes an order from all vehicles.
Command definitions related to orders.
OrderDepotActionFlags
Actions that can be performed when the vehicle enters the depot.
@ ODATFB_UNBUNCH
Service the vehicle and then unbunch it.
@ ODATFB_NEAREST_DEPOT
Send the vehicle to the nearest depot.
@ ODATFB_HALT
Service the vehicle and then halt it.
OrderConditionComparator
Comparator for the skip reasoning.
@ OCC_LESS_EQUALS
Skip if the value is less or equal to the limit.
@ OCC_EQUALS
Skip if both values are equal.
@ OCC_NOT_EQUALS
Skip if both values are not equal.
@ OCC_MORE_THAN
Skip if the value is more than the limit.
@ OCC_IS_TRUE
Skip if the variable is true.
@ OCC_LESS_THAN
Skip if the value is less than the limit.
@ OCC_MORE_EQUALS
Skip if the value is more or equal to the limit.
@ OCC_IS_FALSE
Skip if the variable is false.
ModifyOrderFlags
Enumeration for the data to set in CmdModifyOrder.
@ MOF_COND_VARIABLE
A conditional variable changes.
@ MOF_LOAD
Passes an OrderLoadType.
@ MOF_UNLOAD
Passes an OrderUnloadType.
@ MOF_STOP_LOCATION
Passes an OrderStopLocation.
@ MOF_COND_DESTINATION
Change the destination of a conditional order.
@ MOF_COND_COMPARATOR
A comparator changes.
@ MOF_COND_VALUE
The value to set the condition to.
@ MOF_DEPOT_ACTION
Selects the OrderDepotAction.
@ MOF_NON_STOP
Passes an OrderNonStopFlags.
OrderLoadFlags
Flags related to the loading order.
@ OLFB_FULL_LOAD
Full load all cargoes of the consist.
@ OLFB_NO_LOAD
Do not load anything.
@ OLF_LOAD_IF_POSSIBLE
Load as long as there is cargo that fits in the train.
@ OLF_FULL_LOAD_ANY
Full load a single cargo of the consist.
OrderStopLocation
Where to stop the trains.
@ OSL_PLATFORM_MIDDLE
Stop at the middle of the platform.
@ OSL_PLATFORM_FAR_END
Stop at the far end of the platform.
@ OSL_PLATFORM_NEAR_END
Stop at the near end of the platform.
OrderConditionVariable
Variables (of a vehicle) to 'cause' skipping on.
@ OCV_AGE
Skip based on the age.
@ OCV_UNCONDITIONALLY
Always skip.
@ OCV_MAX_SPEED
Skip based on the maximum speed.
@ OCV_LOAD_PERCENTAGE
Skip based on the amount of load.
@ OCV_REQUIRES_SERVICE
Skip when the vehicle requires service.
@ OCV_RELIABILITY
Skip based on the reliability.
@ OCV_REMAINING_LIFETIME
Skip based on the remaining lifetime.
@ OCV_MAX_RELIABILITY
Skip based on the maximum reliability.
uint8_t VehicleOrderID
The index of an order within its current vehicle (not pool related)
OrderUnloadFlags
Flags related to the unloading order.
@ OUFB_TRANSFER
Transfer all cargo onto the platform.
@ OUFB_NO_UNLOAD
Totally no unloading will be done.
@ OUF_UNLOAD_IF_POSSIBLE
Unload all cargo that the station accepts.
@ OUFB_UNLOAD
Force unloading all cargo onto the platform, possibly not getting paid.
static const VehicleOrderID MAX_VEH_ORDER_ID
Last valid VehicleOrderID.
OrderNonStopFlags
Non-stop order flags.
@ ONSF_NO_STOP_AT_DESTINATION_STATION
The vehicle will stop at any station it passes except the destination.
@ ONSF_STOP_EVERYWHERE
The vehicle will stop at any station it passes and the destination.
@ ONSF_NO_STOP_AT_INTERMEDIATE_STATIONS
The vehicle will not stop at any stations it passes except the destination.
OrderDepotTypeFlags
Reasons that could cause us to go to the depot.
@ ODTFB_PART_OF_ORDERS
This depot order is because of a regular order.
@ ODTFB_SERVICE
This depot order is because of the servicing limit.
@ DA_SERVICE
Service only if needed.
@ DA_STOP
Go to the depot and stop there.
@ DA_ALWAYS_GO
Always go to the depot.
@ DA_UNBUNCH
Go to the depot and unbunch.
static const VehicleOrderID INVALID_VEH_ORDER_ID
Invalid vehicle order index (sentinel)
CloneOptions
Clone actions.
Some methods of Pool are placed here in order to reduce compilation time and binary size.
#define INSTANTIATE_POOL_METHODS(name)
Force instantiation of pool methods so we don't get linker errors.
static debug_inline bool IsRailDepotTile(Tile t)
Is this tile rail tile and a rail depot?
Pseudo random number generator.
static debug_inline bool IsRoadDepotTile(Tile t)
Return whether a tile is a road depot tile.
A number of safeguards to prevent using unsafe methods.
ClientSettings _settings_client
The current settings for this game.
Base classes/functions for stations.
StationID GetStationIndex(Tile t)
Get StationID from a tile.
@ FACIL_DOCK
Station with a dock.
@ FACIL_BUS_STOP
Station with bus stops.
@ FACIL_TRUCK_STOP
Station with truck stops.
@ FACIL_TRAIN
Station with train station.
Definition of base types and functions in a cross-platform compatible way.
void SetDParam(size_t n, uint64_t v)
Set a string parameter v at index n in the global string parameter array.
Functions related to OTTD's strings.
uint32_t StringID
Numeric value that represents a string, independent of the selected language.
static const StringID INVALID_STRING_ID
Constant representing an invalid string (16bit in case it is used in savegames)
uint32_t cached_max_range_sqr
Cached squared maximum range.
uint16_t cached_max_range
Cached maximum range.
uint8_t subtype
Type of aircraft.
Aircraft, helicopters, rotors and their shadows belong to this class.
uint8_t state
State of the airport.
StationID targetairport
Airport to go to next.
Flags flags
Flags for this airport type.
@ SHORT_STRIP
This airport has a short landing strip, dangerous for fast aircraft.
bool HasHangar() const
Check if this airport has at least one hangar.
const AirportFTAClass * GetFTA() const
Get the finite-state machine for this airport or the finite-state machine for the dummy airport in ca...
TimerGameTick::Ticks current_order_time
How many ticks have passed since this order started.
VehicleOrderID cur_real_order_index
The index to the current real (non-implicit) order.
VehicleOrderID cur_implicit_order_index
The index to the current implicit order.
void ResetDepotUnbunching()
Resets all the data used for depot unbunching.
Base class for all station-ish types.
StationFacility facilities
The facilities that this station has.
TileIndex xy
Base tile of the station.
Owner owner
The owner of this station.
VehicleType type
Type of vehicle.
bool value
tells if the bool cheat is active or not
Cheat no_jetcrash
no jet will crash on small airports anymore
GUISettings gui
settings related to the GUI
Structure to return information about the closest depot location, and whether it could be found.
DestinationID destination
The DestinationID as used for orders.
uint16_t reliability
Current reliability of the engine.
uint8_t order_review_system
perform order reviews on vehicles
static void RemoveOrder(OrderType type, DestinationID destination, bool hangar)
Removes an order from all vehicles.
Shared order list linking together the linked list of orders and the list of vehicles sharing this or...
void DeleteOrderAt(int index)
Remove an order from the order list and delete it.
StationIDStack GetNextStoppingStation(const Vehicle *v, const Order *first=nullptr, uint hops=0) const
Recursively determine the next deterministic station to stop at.
bool IsCompleteTimetable() const
Checks whether all orders of the list have a filled timetable.
const Order * GetNextDecisionNode(const Order *next, uint hops) const
Get the next order which will make the given vehicle stop at a station or refit at a depot or evaluat...
void Initialize(Order *chain, Vehicle *v)
Recomputes everything.
Order * GetLastOrder() const
Get the last order of the order chain.
void RemoveVehicle(Vehicle *v)
Removes the vehicle from the shared order list.
uint num_vehicles
NOSAVE: Number of vehicles that share this order list.
VehicleOrderID num_orders
NOSAVE: How many orders there are in the list.
void InsertOrderAt(Order *new_order, int index)
Insert a new order into the order chain.
Order * GetOrderAt(int index) const
Get a certain order of the order chain.
void MoveOrder(int from, int to)
Move an order to another position within the order list.
TimerGameTick::Ticks timetable_duration
NOSAVE: Total timetabled duration of the order list.
Order * first
First order of the order list.
Vehicle * first_shared
NOSAVE: pointer to the first vehicle in the shared order chain.
VehicleOrderID num_manual_orders
NOSAVE: How many manually added orders are there in the list.
const Order * GetNext(const Order *curr) const
Get the order after the given one or the first one, if the given one is the last one.
VehicleOrderID GetNumOrders() const
Get number of orders in the order list.
void RecalculateTimetableDuration()
Recomputes Timetable duration.
void FreeChain(bool keep_orderlist=false)
Free a complete order chain.
Order * GetFirstOrder() const
Get the first order of the order chain.
bool IsShared() const
Is this a shared order list?
TimerGameTick::Ticks total_duration
NOSAVE: Total (timetabled or not) duration of the order list.
TileIndex GetLocation(const Vehicle *v, bool airport=false) const
Returns a tile somewhat representing the order destination (not suitable for pathfinding).
OrderDepotTypeFlags GetDepotOrderType() const
What caused us going to the depot?
CargoID GetRefitCargo() const
Get the cargo to to refit to.
uint16_t GetTimetabledTravel() const
Get the time in ticks a vehicle should take to reach the destination or 0 if it's not timetabled.
OrderConditionVariable GetConditionVariable() const
What variable do we have to compare?
bool Equals(const Order &other) const
Does this order have the same type, flags and destination?
uint16_t MapOldOrder() const
Pack this order into a 16 bits integer as close to the TTD representation as possible.
uint16_t GetMaxSpeed() const
Get the maxmimum speed in km-ish/h a vehicle is allowed to reach on the way to the destination.
void SetUnloadType(OrderUnloadFlags unload_type)
Set how the consist must be unloaded.
void SetLoadType(OrderLoadFlags load_type)
Set how the consist must be loaded.
uint16_t max_speed
How fast the vehicle may go on the way to the destination.
DestinationID GetDestination() const
Gets the destination of this order.
bool IsType(OrderType type) const
Check whether this order is of the given type.
void SetNonStopType(OrderNonStopFlags non_stop_type)
Set whether we must stop at stations or not.
VehicleOrderID GetConditionSkipToOrder() const
Get the order to skip to.
OrderStopLocation GetStopLocation() const
Where must we stop at the platform?
uint16_t GetWaitTime() const
Get the time in ticks a vehicle will probably wait at the destination (timetabled or not).
OrderType GetType() const
Get the type of order of this order.
void MakeGoToStation(StationID destination)
Makes this order a Go To Station order.
uint8_t type
The type of order + non-stop flags.
uint16_t wait_time
How long in ticks to wait at the destination.
void SetDepotOrderType(OrderDepotTypeFlags depot_order_type)
Set the cause to go to the depot.
OrderLoadFlags GetLoadType() const
How must the consist be loaded?
void SetStopLocation(OrderStopLocation stop_location)
Set where we must stop at the platform.
void MakeDummy()
Makes this order a Dummy order.
void MakeGoToWaypoint(StationID destination)
Makes this order a Go To Waypoint order.
void SetConditionVariable(OrderConditionVariable condition_variable)
Set variable we have to compare.
uint8_t flags
Load/unload types, depot order/action types.
void MakeGoToDepot(DepotID destination, OrderDepotTypeFlags order, OrderNonStopFlags non_stop_type=ONSF_NO_STOP_AT_INTERMEDIATE_STATIONS, OrderDepotActionFlags action=ODATF_SERVICE_ONLY, CargoID cargo=CARGO_NO_REFIT)
Makes this order a Go To Depot order.
Order * next
Pointer to next order. If nullptr, end of list.
DestinationID dest
The destination of the order.
void SetDestination(DestinationID destination)
Sets the destination of this order.
void SetRefit(CargoID cargo)
Make this depot/station order also a refit order.
uint32_t Pack() const
Pack this order into a 32 bits integer, or actually only the type, flags and destination.
void SetConditionComparator(OrderConditionComparator condition_comparator)
Set the comparator to use.
void MakeConditional(VehicleOrderID order)
Makes this order an conditional order.
void SetDepotActionType(OrderDepotActionFlags depot_service_type)
Set what we are going to do in the depot.
void SetConditionSkipToOrder(VehicleOrderID order_id)
Get the order to skip to.
OrderDepotActionFlags GetDepotActionType() const
What are we going to do when in the depot.
void MakeLeaveStation()
Makes this order a Leave Station order.
bool CanLeaveWithCargo(bool has_cargo) const
A vehicle can leave the current station with cargo if:
void SetConditionValue(uint16_t value)
Set the value to base the skip on.
void Free()
'Free' the order
CargoID refit_cargo
Refit CargoID.
uint16_t GetTimetabledWait() const
Get the time in ticks a vehicle should wait at the destination or 0 if it's not timetabled.
bool ShouldStopAtStation(const Vehicle *v, StationID station) const
Check whether the given vehicle should stop at the given station based on this order and the non-stop...
uint16_t GetTravelTime() const
Get the time in ticks a vehicle will probably take to reach the destination (timetabled or not).
void MakeImplicit(StationID destination)
Makes this order an implicit order.
OrderUnloadFlags GetUnloadType() const
How must the consist be unloaded?
void AssignOrder(const Order &other)
Assign data to an order (from another order) This function makes sure that the index is maintained co...
OrderConditionComparator GetConditionComparator() const
What is the comparator to use?
OrderNonStopFlags GetNonStopType() const
At which stations must we stop?
bool IsRefit() const
Is this order a refit order.
void MakeLoading(bool ordered)
Makes this order a Loading order.
uint16_t GetConditionValue() const
Get the value to base the skip on.
uint16_t travel_time
How long in ticks the journey to this destination should take.
TileIndex tile
The base tile of the area.
Tindex index
Index of this pool item.
static Titem * Get(size_t index)
Returns Titem with given index.
static bool CanAllocateItem(size_t n=1)
Helper functions so we can use PoolItem::Function() instead of _poolitem_pool.Function()
static Titem * GetIfValid(size_t index)
Returns Titem with given index.
static Pool::IterateWrapper< Titem > Iterate(size_t from=0)
Returns an iterable ensemble of all valid Titem.
Base class for all pools.
static Station * GetIfValid(size_t index)
Returns station if the index is a valid index for this station type.
static Station * Get(size_t index)
Gets station with given index.
static T * From(Vehicle *v)
Converts a Vehicle to SpecializedVehicle with type checking.
TileArea ship_station
Tile area the ship 'station' part covers.
Airport airport
Tile area the airport covers.
EngineID engine_type
The type of engine used for this vehicle.
uint16_t & GetGroundVehicleFlags()
Access the ground vehicle flags of the vehicle.
bool IsOrderListShared() const
Check if we share our orders with another vehicle.
const Engine * GetEngine() const
Retrieves the engine of the vehicle.
void IncrementRealOrderIndex()
Advanced cur_real_order_index to the next real order, keeps care of the wrap-around and invalidates t...
bool HasDepotOrder() const
Checks if a vehicle has a depot in its order list.
void LeaveStation()
Perform all actions when leaving a station.
void AddToShared(Vehicle *shared_chain)
Adds this vehicle to a shared vehicle chain.
bool HasUnbunchingOrder() const
Check if the current vehicle has an unbunching order.
VehicleOrderID GetNumOrders() const
Get the number of orders this vehicle has.
uint8_t day_counter
Increased by one for each day.
virtual int GetDisplayMaxSpeed() const
Gets the maximum speed in km-ish/h that can be sent into SetDParam for string processing.
void IncrementImplicitOrderIndex()
Increments cur_implicit_order_index, keeps care of the wrap-around and invalidates the GUI.
virtual TileIndex GetOrderStationLocation([[maybe_unused]] StationID station)
Determine the location for the station where the vehicle goes to next.
Order * GetOrder(int index) const
Returns order 'index' of a vehicle or nullptr when it doesn't exists.
VehicleOrderID GetNumManualOrders() const
Get the number of manually added orders this vehicle has.
Order current_order
The current order (+ status, like: loading)
OrderList * orders
Pointer to the order list for this vehicle.
virtual ClosestDepot FindClosestDepot()
Find the closest depot for this vehicle and tell us the location, DestinationID and whether we should...
Order * GetFirstOrder() const
Get the first order of the vehicles order list.
bool HasFullLoadOrder() const
Check if the current vehicle has a full load order.
virtual bool IsPrimaryVehicle() const
Whether this is the primary vehicle in the chain.
TimerGameCalendar::Date age
Age in calendar days.
IterateWrapper Orders() const
Returns an iterable ensemble of orders of a vehicle.
Vehicle * FirstShared() const
Get the first vehicle of this vehicle chain.
TimerGameCalendar::Date max_age
Maximum age.
uint16_t reliability
Reliability.
Vehicle * NextShared() const
Get the next vehicle of the shared vehicle chain.
void RemoveFromShared()
Removes the vehicle from the shared order list.
debug_inline bool IsGroundVehicle() const
Check if the vehicle is a ground vehicle.
TileIndex tile
Current tile index.
TileIndex dest_tile
Heading for this tile.
bool NeedsServicing() const
Check if the vehicle needs to go to a depot in near future (if a opportunity presents itself) for ser...
bool HasConditionalOrder() const
Check if the current vehicle has a conditional order.
StationID last_station_visited
The last station we stopped at.
Vehicle * PreviousShared() const
Get the previous vehicle of the shared vehicle chain.
Owner owner
Which company owns the vehicle?
Order * GetLastOrder() const
Returns the last order of a vehicle, or nullptr if it doesn't exists.
void DeleteUnreachedImplicitOrders()
Delete all implicit orders which were not reached.
void UpdateRealOrderIndex()
Skip implicit orders until cur_real_order_index is a non-implicit order.
Representation of a waypoint.
Owner GetTileOwner(Tile tile)
Returns the owner of a tile.
static debug_inline bool IsTileType(Tile tile, TileType type)
Checks if a tile is a given tiletype.
constexpr TileIndex INVALID_TILE
The very nice invalid tile marker.
@ MP_STATION
A tile of a station.
Command definitions related to trains.
StringID GetVehicleCannotUseStationReason(const Vehicle *v, const Station *st)
Get reason string why this station can't be used by the given vehicle.
uint8_t CalcPercentVehicleFilled(const Vehicle *front, StringID *colour)
Calculates how full a vehicle is.
bool CanVehicleUseStation(EngineID engine_type, const Station *st)
Can this station be used by the given engine type?
@ VS_STOPPED
Vehicle is stopped by the player.
@ VS_CRASHED
Vehicle is crashed.
Functions related to vehicles.
@ VIWD_MODIFY_ORDERS
Other order modifications.
@ VIWD_REMOVE_ALL_ORDERS
Removed / replaced all orders (after deleting / sharing).
WindowClass GetWindowClassForVehicleType(VehicleType vt)
Get WindowClass for vehicle list of given vehicle type.
@ VEH_ROAD
Road vehicle type.
@ VEH_AIRCRAFT
Aircraft vehicle type.
@ VEH_SHIP
Ship vehicle type.
@ VEH_TRAIN
Train vehicle type.
uint32_t VehicleID
The type all our vehicle IDs have.
bool IsShipDepotTile(Tile t)
Is it a ship depot tile?
void SetWindowClassesDirty(WindowClass cls)
Mark all windows of a particular class as dirty (in need of repainting)
void InvalidateWindowData(WindowClass cls, WindowNumber number, int data, bool gui_scope)
Mark window data of the window of a given class and specific window number as invalid (in need of re-...
void SetWindowDirty(WindowClass cls, WindowNumber number)
Mark window as dirty (in need of repainting)
void InvalidateWindowClassesData(WindowClass cls, int data, bool gui_scope)
Mark window data of all windows of a given class as invalid (in need of re-computing) Note that by de...
@ WC_STATION_LIST
Station list; Window numbers:
@ WC_VEHICLE_ORDERS
Vehicle orders; Window numbers:
@ WC_SHIPS_LIST
Ships list; Window numbers:
@ WC_VEHICLE_VIEW
Vehicle view; Window numbers:
@ WC_VEHICLE_TIMETABLE
Vehicle timetable; Window numbers:
@ WC_AIRCRAFT_LIST
Aircraft list; Window numbers: