OpenTTD Source 20241224-master-gf74b0cf984
|
Utility to refresh links a consist will visit. More...
#include <refresh.h>
Data Structures | |
struct | Hop |
A hop the refresh algorithm might evaluate. More... | |
struct | RefitDesc |
Simulated cargo type and capacity for prediction of future links. More... | |
Static Public Member Functions | |
static void | Run (Vehicle *v, bool allow_merge=true, bool is_full_loading=false) |
Refresh all links the given vehicle will visit. | |
Protected Types | |
enum | RefreshFlags { USE_NEXT , HAS_CARGO , WAS_REFIT , RESET_REFIT , IN_AUTOREFIT } |
Various flags about properties of the last examined link that might have an influence on the next one. More... | |
typedef std::vector< RefitDesc > | RefitList |
typedef std::set< Hop > | HopSet |
Protected Member Functions | |
LinkRefresher (Vehicle *v, HopSet *seen_hops, bool allow_merge, bool is_full_loading) | |
Constructor for link refreshing algorithm. | |
bool | HandleRefit (CargoID refit_cargo) |
Handle refit orders by updating capacities and refit_capacities. | |
void | ResetRefit () |
Restore capacities and refit_capacities as vehicle might have been able to load now. | |
void | RefreshStats (const Order *cur, const Order *next) |
Refresh link stats for the given pair of orders. | |
const Order * | PredictNextOrder (const Order *cur, const Order *next, uint8_t flags, uint num_hops=0) |
Predict the next order the vehicle will execute and resolve conditionals by recursion and return next non-conditional order in list. | |
void | RefreshLinks (const Order *cur, const Order *next, uint8_t flags, uint num_hops=0) |
Iterate over orders starting at cur and next and refresh links associated with them. | |
Protected Attributes | |
Vehicle * | vehicle |
Vehicle for which the links should be refreshed. | |
CargoArray | capacities {} |
Current added capacities per cargo ID in the consist. | |
RefitList | refit_capacities |
Current state of capacity remaining from previous refits versus overall capacity per vehicle in the consist. | |
HopSet * | seen_hops |
Hops already seen. If the same hop is seen twice we stop the algorithm. This is shared between all Refreshers of the same run. | |
CargoID | cargo |
Cargo given in last refit order. | |
bool | allow_merge |
If the refresher is allowed to merge or extend link graphs. | |
bool | is_full_loading |
If the vehicle is full loading. | |
|
protected |
|
protected |
Various flags about properties of the last examined link that might have an influence on the next one.
|
protected |
Constructor for link refreshing algorithm.
vehicle | Vehicle to refresh links for. |
seen_hops | Set of hops already seen. This is shared between this refresher and all its children. |
allow_merge | If the refresher is allowed to merge or extend link graphs. |
is_full_loading | If the vehicle is full loading. |
Definition at line 69 of file refresh.cpp.
References capacities, Vehicle::Next(), NUM_CARGO, and refit_capacities.
|
protected |
Handle refit orders by updating capacities and refit_capacities.
refit_cargo | Cargo to refit to. |
Definition at line 88 of file refresh.cpp.
References capacities, cargo, Engine::DetermineCapacity(), Pool< Titem, Tindex, Tgrowth_step, Tmax_size, Tpool_type, Tcache, Tzero >::PoolItem<&_engine_pool >::Get(), GetBestFittingSubType(), HasBit(), Vehicle::Next(), refit_capacities, VEH_AIRCRAFT, and vehicle.
Referenced by RefreshLinks().
|
protected |
Predict the next order the vehicle will execute and resolve conditionals by recursion and return next non-conditional order in list.
cur | Current order being evaluated. |
next | Next order to be evaluated. |
flags | RefreshFlags to give hints about the previous link and state carried over from that. |
num_hops | Number of hops already taken by recursive calls to this method. |
Definition at line 161 of file refresh.cpp.
References Order::GetConditionSkipToOrder(), OrderList::GetNext(), OrderList::GetNextDecisionNode(), OrderList::GetNumOrders(), OrderList::GetOrderAt(), HasBit(), Order::IsType(), Vehicle::orders, RefreshLinks(), SetBit(), USE_NEXT, and vehicle.
Referenced by RefreshLinks().
|
protected |
Iterate over orders starting at cur and next and refresh links associated with them.
cur and next can be equal. If they're not they must be "neighbours" in their order list, which means next must be directly reachable from cur without passing any further OT_GOTO_STATION or OT_IMPLICIT orders in between.
cur | Current order being evaluated. |
next | Next order to be checked. |
flags | RefreshFlags to give hints about the previous link and state carried over from that. |
num_hops | Number of hops already taken by recursive calls to this method. |
Definition at line 263 of file refresh.cpp.
References Order::CanLeaveWithCargo(), ClrBit(), CargoSpec::Get(), Order::GetRefitCargo(), HandleRefit(), HAS_CARGO, HasBit(), IN_AUTOREFIT, Pool< Titem, Tindex, Tgrowth_step, Tmax_size, Tpool_type, Tcache, Tzero >::PoolItem< Tpool >::index, Order::IsAutoRefit(), Order::IsRefit(), Order::IsType(), NUM_CARGO, PredictNextOrder(), RefreshLinks(), RefreshStats(), RESET_REFIT, ResetRefit(), seen_hops, SetBit(), USE_NEXT, and WAS_REFIT.
Referenced by PredictNextOrder(), RefreshLinks(), and Run().
Refresh link stats for the given pair of orders.
cur | Last stop where the consist could interact with cargo. |
next | Next order to be processed. |
Definition at line 199 of file refresh.cpp.
References allow_merge, capacities, DistanceManhattan(), EUM_INCREASE, EUM_REFRESH, EUM_RESTRICTED, EUM_UNRESTRICTED, SpecializedStation< Station, false >::Get(), Order::GetDestination(), Vehicle::GetDisplayMaxSpeed(), SpecializedStation< Station, false >::GetIfValid(), Order::GetLoadType(), OrderList::GetTotalDuration(), Station::goods, IncreaseStats(), Pool< Titem, Tindex, Tgrowth_step, Tmax_size, Tpool_type, Tcache, Tzero >::PoolItem< Tpool >::index, is_full_loading, Vehicle::last_station_visited, GoodsEntry::link_graph, Vehicle::load_unload_ticks, NUM_CARGO, OLFB_NO_LOAD, Vehicle::orders, RandomRange(), vehicle, and BaseStation::xy.
Referenced by RefreshLinks().
|
protected |
Restore capacities and refit_capacities as vehicle might have been able to load now.
Definition at line 143 of file refresh.cpp.
References capacities, and refit_capacities.
Referenced by RefreshLinks().
|
static |
Refresh all links the given vehicle will visit.
v | Vehicle to refresh links for. |
allow_merge | If the refresher is allowed to merge or extend link graphs. |
is_full_loading | If the vehicle is full loading. |
Definition at line 26 of file refresh.cpp.
References allow_merge, BaseConsist::cur_implicit_order_index, OrderList::GetNextDecisionNode(), Vehicle::GetOrder(), HAS_CARGO, is_full_loading, Vehicle::last_loading_station, Vehicle::orders, RefreshLinks(), and seen_hops.
Referenced by DeleteStaleLinks(), Vehicle::LeaveStation(), and LoadUnloadVehicle().
|
protected |
If the refresher is allowed to merge or extend link graphs.
Definition at line 85 of file refresh.h.
Referenced by RefreshStats(), and Run().
|
protected |
Current added capacities per cargo ID in the consist.
Definition at line 81 of file refresh.h.
Referenced by HandleRefit(), LinkRefresher(), RefreshStats(), and ResetRefit().
|
protected |
Cargo given in last refit order.
Definition at line 84 of file refresh.h.
Referenced by HandleRefit().
|
protected |
If the vehicle is full loading.
Definition at line 86 of file refresh.h.
Referenced by RefreshStats(), and Run().
|
protected |
Current state of capacity remaining from previous refits versus overall capacity per vehicle in the consist.
Definition at line 82 of file refresh.h.
Referenced by HandleRefit(), LinkRefresher(), and ResetRefit().
|
protected |
Hops already seen. If the same hop is seen twice we stop the algorithm. This is shared between all Refreshers of the same run.
Definition at line 83 of file refresh.h.
Referenced by RefreshLinks(), and Run().
|
protected |
Vehicle for which the links should be refreshed.
Definition at line 80 of file refresh.h.
Referenced by HandleRefit(), PredictNextOrder(), and RefreshStats().