mirror of https://github.com/OpenTTD/OpenTTD
Fix: When loading old timetabled saves, also reset cached timetable duration
parent
cddb8a4605
commit
d1cead7f25
|
@ -281,6 +281,8 @@ public:
|
||||||
|
|
||||||
void Initialize(Order *chain, Vehicle *v);
|
void Initialize(Order *chain, Vehicle *v);
|
||||||
|
|
||||||
|
void RecalculateTimetableDuration();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the first order of the order chain.
|
* Get the first order of the order chain.
|
||||||
* @return the first order of the chain.
|
* @return the first order of the chain.
|
||||||
|
|
|
@ -296,15 +296,15 @@ void OrderList::Initialize(Order *chain, Vehicle *v)
|
||||||
this->num_manual_orders = 0;
|
this->num_manual_orders = 0;
|
||||||
this->num_vehicles = 1;
|
this->num_vehicles = 1;
|
||||||
this->timetable_duration = 0;
|
this->timetable_duration = 0;
|
||||||
this->total_duration = 0;
|
|
||||||
|
|
||||||
for (Order *o = this->first; o != nullptr; o = o->next) {
|
for (Order *o = this->first; o != nullptr; o = o->next) {
|
||||||
++this->num_orders;
|
++this->num_orders;
|
||||||
if (!o->IsType(OT_IMPLICIT)) ++this->num_manual_orders;
|
if (!o->IsType(OT_IMPLICIT)) ++this->num_manual_orders;
|
||||||
this->timetable_duration += o->GetTimetabledWait() + o->GetTimetabledTravel();
|
|
||||||
this->total_duration += o->GetWaitTime() + o->GetTravelTime();
|
this->total_duration += o->GetWaitTime() + o->GetTravelTime();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
this->RecalculateTimetableDuration();
|
||||||
|
|
||||||
for (Vehicle *u = this->first_shared->PreviousShared(); u != nullptr; u = u->PreviousShared()) {
|
for (Vehicle *u = this->first_shared->PreviousShared(); u != nullptr; u = u->PreviousShared()) {
|
||||||
++this->num_vehicles;
|
++this->num_vehicles;
|
||||||
this->first_shared = u;
|
this->first_shared = u;
|
||||||
|
@ -313,6 +313,18 @@ void OrderList::Initialize(Order *chain, Vehicle *v)
|
||||||
for (const Vehicle *u = v->NextShared(); u != nullptr; u = u->NextShared()) ++this->num_vehicles;
|
for (const Vehicle *u = v->NextShared(); u != nullptr; u = u->NextShared()) ++this->num_vehicles;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Recomputes Timetable duration.
|
||||||
|
* Split out into a separate function so it can be used by afterload.
|
||||||
|
*/
|
||||||
|
void OrderList::RecalculateTimetableDuration()
|
||||||
|
{
|
||||||
|
this->timetable_duration = 0;
|
||||||
|
for (Order *o = this->first; o != nullptr; o = o->next) {
|
||||||
|
this->timetable_duration += o->GetTimetabledWait() + o->GetTimetabledTravel();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Free a complete order chain.
|
* Free a complete order chain.
|
||||||
* @param keep_orderlist If this is true only delete the orders, otherwise also delete the OrderList.
|
* @param keep_orderlist If this is true only delete the orders, otherwise also delete the OrderList.
|
||||||
|
|
|
@ -2963,6 +2963,16 @@ bool AfterLoadGame()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (IsSavegameVersionBefore(SLV_190)) {
|
||||||
|
for (Order *order : Order::Iterate()) {
|
||||||
|
order->SetTravelTimetabled(order->GetTravelTime() > 0);
|
||||||
|
order->SetWaitTimetabled(order->GetWaitTime() > 0);
|
||||||
|
}
|
||||||
|
for (OrderList *orderlist : OrderList::Iterate()) {
|
||||||
|
orderlist->RecalculateTimetableDuration();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Only keep order-backups for network clients (and when replaying).
|
* Only keep order-backups for network clients (and when replaying).
|
||||||
* If we are a network server or not networking, then we just loaded a previously
|
* If we are a network server or not networking, then we just loaded a previously
|
||||||
|
|
|
@ -182,10 +182,6 @@ static void Load_ORDR()
|
||||||
while ((index = SlIterateArray()) != -1) {
|
while ((index = SlIterateArray()) != -1) {
|
||||||
Order *order = new (index) Order();
|
Order *order = new (index) Order();
|
||||||
SlObject(order, GetOrderDescription());
|
SlObject(order, GetOrderDescription());
|
||||||
if (IsSavegameVersionBefore(SLV_190)) {
|
|
||||||
order->SetTravelTimetabled(order->GetTravelTime() > 0);
|
|
||||||
order->SetWaitTimetabled(order->GetWaitTime() > 0);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue