(svn r12696) -Fix: loading ancient savegames could result in invalid orders in order lists with all related problems.
authorrubidium
Sun, 13 Apr 2008 19:46:26 +0000
changeset 10165 85baf185d1c5
parent 10164 3ff9e65f3d49
child 10166 9124595d2295
(svn r12696) -Fix: loading ancient savegames could result in invalid orders in order lists with all related problems.
src/openttd.cpp
src/order_cmd.cpp
--- a/src/openttd.cpp	Sun Apr 13 19:25:14 2008 +0000
+++ b/src/openttd.cpp	Sun Apr 13 19:46:26 2008 +0000
@@ -2301,6 +2301,40 @@
 		}
 	}
 
+
+	if (CheckSavegameVersion(93)) {
+		/* Rework of orders. */
+		Order *order;
+		FOR_ALL_ORDERS(order) order->ConvertFromOldSavegame();
+
+		Vehicle *v;
+		FOR_ALL_VEHICLES(v) {
+			if (v->orders != NULL && !v->orders->IsValid()) v->orders = NULL;
+
+			v->current_order.ConvertFromOldSavegame();
+			if (v->type == VEH_ROAD && v->IsPrimaryVehicle() && v->prev_shared == NULL) {
+				FOR_VEHICLE_ORDERS(v, order) order->SetNonStopType(ONSF_NO_STOP_AT_INTERMEDIATE_STATIONS);
+			}
+		}
+	} else if (CheckSavegameVersion(94)) {
+		/* Unload and transfer are now mutual exclusive. */
+		Order *order;
+		FOR_ALL_ORDERS(order) {
+			if ((order->GetUnloadType() & (OUFB_UNLOAD | OUFB_TRANSFER)) == (OUFB_UNLOAD | OUFB_TRANSFER)) {
+				order->SetUnloadType(OUFB_TRANSFER);
+				order->SetLoadType(OLFB_NO_LOAD);
+			}
+		}
+
+		Vehicle *v;
+		FOR_ALL_VEHICLES(v) {
+			if ((v->current_order.GetUnloadType() & (OUFB_UNLOAD | OUFB_TRANSFER)) == (OUFB_UNLOAD | OUFB_TRANSFER)) {
+				v->current_order.SetUnloadType(OUFB_TRANSFER);
+				v->current_order.SetLoadType(OLFB_NO_LOAD);
+			}
+		}
+	}
+
 	if (CheckSavegameVersion(84)) {
 		/* Update go to buoy orders because they are just waypoints */
 		Order *order;
@@ -2445,37 +2479,6 @@
 		}
 	}
 
-	if (CheckSavegameVersion(93)) {
-		/* Rework of orders. */
-		Order *order;
-		FOR_ALL_ORDERS(order) order->ConvertFromOldSavegame();
-
-		Vehicle *v;
-		FOR_ALL_VEHICLES(v) {
-			v->current_order.ConvertFromOldSavegame();
-			if (v->type == VEH_ROAD && v->IsPrimaryVehicle() && v->prev_shared == NULL) {
-				FOR_VEHICLE_ORDERS(v, order) order->SetNonStopType(ONSF_NO_STOP_AT_INTERMEDIATE_STATIONS);
-			}
-		}
-	} else if (CheckSavegameVersion(94)) {
-		/* Unload and transfer are now mutual exclusive. */
-		Order *order;
-		FOR_ALL_ORDERS(order) {
-			if ((order->GetUnloadType() & (OUFB_UNLOAD | OUFB_TRANSFER)) == (OUFB_UNLOAD | OUFB_TRANSFER)) {
-				order->SetUnloadType(OUFB_TRANSFER);
-				order->SetLoadType(OLFB_NO_LOAD);
-			}
-		}
-
-		Vehicle *v;
-		FOR_ALL_VEHICLES(v) {
-			if ((v->current_order.GetUnloadType() & (OUFB_UNLOAD | OUFB_TRANSFER)) == (OUFB_UNLOAD | OUFB_TRANSFER)) {
-				v->current_order.SetUnloadType(OUFB_TRANSFER);
-				v->current_order.SetLoadType(OLFB_NO_LOAD);
-			}
-		}
-	}
-
 	return InitializeWindowsAndCaches();
 }
 
--- a/src/order_cmd.cpp	Sun Apr 13 19:25:14 2008 +0000
+++ b/src/order_cmd.cpp	Sun Apr 13 19:46:26 2008 +0000
@@ -216,9 +216,7 @@
 	 * Sanity check
 	 * TTD stores invalid orders as OT_NOTHING with non-zero flags/station
 	 */
-	if (!order.IsValid() && (order.GetLoadType() != 0 || order.GetUnloadType() != 0 || order.GetDestination() != 0)) {
-		order.MakeDummy();
-	}
+	if (!order.IsValid() && packed != 0) order.MakeDummy();
 
 	return order;
 }