@@ -47,13 +47,13 @@ LinkGraph::BaseEdge::BaseEdge(NodeID des
/**
* Shift all dates by given interval.
* This is useful if the date has been modified with the cheat menu.
* @param interval Number of days to be added or subtracted.
*/
void LinkGraph::ShiftDates(int interval)
void LinkGraph::ShiftDates(TimerGameCalendar::Date interval)
{
this->last_compression += interval;
for (NodeID node1 = 0; node1 < this->Size(); ++node1) {
BaseNode &source = this->nodes[node1];
if (source.last_update != INVALID_DATE) source.last_update += interval;
for (BaseEdge &edge : this->nodes[node1].edges) {
@@ -168,26 +168,26 @@ public:
typedef std::vector<BaseNode> NodeVector;
/** Minimum effective distance for timeout calculation. */
static const uint MIN_TIMEOUT_DISTANCE = 32;
/** Number of days before deleting links served only by vehicles stopped in depot. */
static const uint STALE_LINK_DEPOT_TIMEOUT = 1024;
static constexpr TimerGameCalendar::Date STALE_LINK_DEPOT_TIMEOUT = 1024;
/** Minimum number of days between subsequent compressions of a LG. */
static const uint COMPRESSION_INTERVAL = 256;
static constexpr TimerGameCalendar::Date COMPRESSION_INTERVAL = 256;
* Scale a value from a link graph of age orig_age for usage in one of age
* target_age. Make sure that the value stays > 0 if it was > 0 before.
* @param val Value to be scaled.
* @param target_age Age of the target link graph.
* @param orig_age Age of the original link graph.
* @return scaled value.
inline static uint Scale(uint val, uint target_age, uint orig_age)
inline static uint Scale(uint val, TimerGameCalendar::Date target_age, TimerGameCalendar::Date orig_age)
return val > 0 ? std::max(1U, val * target_age / orig_age) : 0;
}
/** Bare constructor, only for save/load. */
LinkGraph() : cargo(INVALID_CARGO), last_compression(0) {}
@@ -195,13 +195,13 @@ public:
* Real constructor.
* @param cargo Cargo the link graph is about.
LinkGraph(CargoID cargo) : cargo(cargo), last_compression(TimerGameCalendar::date) {}
void Init(uint size);
void ShiftDates(int interval);
void ShiftDates(TimerGameCalendar::Date interval);
void Compress();
void Merge(LinkGraph *other);
/* Splitting link graphs is intentionally not implemented.
* The overhead in determining connectedness would probably outweigh the
* benefit of having to deal with smaller graphs. In real world examples
@@ -220,13 +220,13 @@ public:
inline TimerGameCalendar::Date JoinDate() const { return join_date; }
* Change the join date on date cheating.
* @param interval Number of days to add.
inline void ShiftJoinDate(int interval) { this->join_date += interval; }
inline void ShiftJoinDate(TimerGameCalendar::Date interval) { this->join_date += interval; }
* Get the link graph settings for this component.
* @return Settings.
inline const LinkGraphSettings &Settings() const { return this->settings; }
@@ -129,13 +129,13 @@ void LinkGraphSchedule::SpawnAll()
* Shift all dates (join dates and edge annotations) of link graphs and link
* graph jobs by the number of days given.
void LinkGraphSchedule::ShiftDates(int interval)
void LinkGraphSchedule::ShiftDates(TimerGameCalendar::Date interval)
for (LinkGraph *lg : LinkGraph::Iterate()) lg->ShiftDates(interval);
for (LinkGraphJob *lgj : LinkGraphJob::Iterate()) lgj->ShiftJoinDate(interval);
@@ -55,13 +55,13 @@ public:
static void Clear();
void SpawnNext();
bool IsJoinWithUnfinishedJobDue() const;
void JoinNext();
void SpawnAll();
* Queue a link graph for execution.
* @param lg Link graph to be queued.
void Queue(LinkGraph *lg)
@@ -3803,14 +3803,14 @@ void DeleteStaleLinks(Station *from)
if (lg == nullptr) continue;
std::vector<NodeID> to_remove{};
for (Edge &edge : (*lg)[ge.node].edges) {
Station *to = Station::Get((*lg)[edge.dest_node].station);
assert(to->goods[c].node == edge.dest_node);
assert(TimerGameCalendar::date >= edge.LastUpdate());
uint timeout = LinkGraph::MIN_TIMEOUT_DISTANCE + (DistanceManhattan(from->xy, to->xy) >> 3);
if ((uint)(TimerGameCalendar::date - edge.LastUpdate()) > timeout) {
auto timeout = TimerGameCalendar::Date(LinkGraph::MIN_TIMEOUT_DISTANCE + (DistanceManhattan(from->xy, to->xy) >> 3));
if (TimerGameCalendar::date - edge.LastUpdate() > timeout) {
bool updated = false;
if (auto_distributed) {
/* Have all vehicles refresh their next hops before deciding to
* remove the node. */
std::vector<Vehicle *> vehicles;
@@ -3832,14 +3832,13 @@ void DeleteStaleLinks(Station *from)
auto iter = vehicles.begin();
while (iter != vehicles.end()) {
Vehicle *v = *iter;
/* Do not refresh links of vehicles that have been stopped in depot for a long time. */
if (!v->IsStoppedInDepot() || static_cast<uint>(TimerGameCalendar::date - v->date_of_last_service) <=
LinkGraph::STALE_LINK_DEPOT_TIMEOUT) {
if (!v->IsStoppedInDepot() || TimerGameCalendar::date - v->date_of_last_service <= LinkGraph::STALE_LINK_DEPOT_TIMEOUT) {
LinkRefresher::Run(v, false); // Don't allow merging. Otherwise lg might get deleted.
if (edge.LastUpdate() == TimerGameCalendar::date) {
updated = true;
break;
@@ -3859,25 +3858,25 @@ void DeleteStaleLinks(Station *from)
if (!updated) {
/* If it's still considered dead remove it. */
to_remove.emplace_back(to->goods[c].node);
ge.flows.DeleteFlows(to->index);
RerouteCargo(from, c, to->index, from->index);
} else if (edge.last_unrestricted_update != INVALID_DATE && (uint)(TimerGameCalendar::date - edge.last_unrestricted_update) > timeout) {
} else if (edge.last_unrestricted_update != INVALID_DATE && TimerGameCalendar::date - edge.last_unrestricted_update > timeout) {
edge.Restrict();
ge.flows.RestrictFlows(to->index);
} else if (edge.last_restricted_update != INVALID_DATE && (uint)(TimerGameCalendar::date - edge.last_restricted_update) > timeout) {
} else if (edge.last_restricted_update != INVALID_DATE && TimerGameCalendar::date - edge.last_restricted_update > timeout) {
edge.Release();
/* Remove dead edges. */
for (NodeID r : to_remove) (*lg)[ge.node].RemoveEdge(r);
assert(TimerGameCalendar::date >= lg->LastCompression());
if ((uint)(TimerGameCalendar::date - lg->LastCompression()) > LinkGraph::COMPRESSION_INTERVAL) {
if (TimerGameCalendar::date - lg->LastCompression() > LinkGraph::COMPRESSION_INTERVAL) {
lg->Compress();
@@ -756,13 +756,13 @@ uint32_t Vehicle::GetGRFID() const
* @param interval Number of days to be added or substracted.
void Vehicle::ShiftDates(int interval)
void Vehicle::ShiftDates(TimerGameCalendar::Date interval)
this->date_of_last_service = std::max(this->date_of_last_service + interval, TimerGameCalendar::Date(0));
/* date_of_last_service_newgrf is not updated here as it must stay stable
* for vehicles outside of a depot. */
@@ -572,13 +572,13 @@ public:
* Calls the new day handler of the vehicle
virtual void OnNewDay() {};
* Crash the (whole) vehicle chain.
* @param flooded whether the cause of the crash is flooding or not.
* @return the number of lost souls.
Status change: