Changeset - r24020:a5211d49b99f
[Not reviewed]
master
0 4 0
Charles Pigott - 5 years ago 2020-01-03 14:11:33
charlespigott@googlemail.com
Fix: When loading old timetabled saves, also reset cached timetable duration
4 files changed with 26 insertions and 6 deletions:
0 comments (0 inline, 0 general)
src/order_base.h
Show inline comments
 
@@ -281,6 +281,8 @@ public:
 

	
 
	void Initialize(Order *chain, Vehicle *v);
 

	
 
	void RecalculateTimetableDuration();
 

	
 
	/**
 
	 * Get the first order of the order chain.
 
	 * @return the first order of the chain.
src/order_cmd.cpp
Show inline comments
 
@@ -296,15 +296,15 @@ void OrderList::Initialize(Order *chain,
 
	this->num_manual_orders = 0;
 
	this->num_vehicles = 1;
 
	this->timetable_duration = 0;
 
	this->total_duration = 0;
 

	
 
	for (Order *o = this->first; o != nullptr; o = o->next) {
 
		++this->num_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->RecalculateTimetableDuration();
 

	
 
	for (Vehicle *u = this->first_shared->PreviousShared(); u != nullptr; u = u->PreviousShared()) {
 
		++this->num_vehicles;
 
		this->first_shared = u;
 
@@ -314,6 +314,18 @@ void OrderList::Initialize(Order *chain,
 
}
 

	
 
/**
 
 * 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.
 
 * @param keep_orderlist If this is true only delete the orders, otherwise also delete the OrderList.
 
 * @note do not use on "current_order" vehicle orders!
src/saveload/afterload.cpp
Show inline comments
 
@@ -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).
 
	 * If we are a network server or not networking, then we just loaded a previously
src/saveload/order_sl.cpp
Show inline comments
 
@@ -182,10 +182,6 @@ static void Load_ORDR()
 
		while ((index = SlIterateArray()) != -1) {
 
			Order *order = new (index) Order();
 
			SlObject(order, GetOrderDescription());
 
			if (IsSavegameVersionBefore(SLV_190)) {
 
				order->SetTravelTimetabled(order->GetTravelTime() > 0);
 
				order->SetWaitTimetabled(order->GetWaitTime() > 0);
 
			}
 
		}
 
	}
 
}
0 comments (0 inline, 0 general)