1
0
Fork 0

Fix: When loading old timetabled saves, also reset cached timetable duration

pull/7906/head
Charles Pigott 2020-01-03 14:11:33 +00:00
parent cddb8a4605
commit d1cead7f25
4 changed files with 26 additions and 6 deletions

View File

@ -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.

View File

@ -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.

View File

@ -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

View File

@ -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);
}
} }
} }
} }