changeset 8724:1c158935ff43 draft

(svn r12399) -Fix: some old DOS savegame didn't load properly due to 'garbage' that was sprinkled in some places.
author rubidium <rubidium@openttd.org>
date Sun, 23 Mar 2008 21:31:43 +0000
parents 36823c86c7f1
children 590fb24ba91d
files src/oldloader.cpp
diffstat 1 files changed, 18 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/src/oldloader.cpp
+++ b/src/oldloader.cpp
@@ -339,6 +339,18 @@
 			ClrBit(v->u.road.state, RVS_IS_STOPPING);
 		}
 
+		/* The subtype should be 0, but it sometimes isn't :( */
+		if (v->type == VEH_ROAD) v->subtype = 0;
+
+		/* Sometimes primary vehicles would have a nothing (invalid) order
+		 * or vehicles that could not have an order would still have a
+		 * (loading) order which causes assertions and the like later on.
+		 */
+		if (!IsPlayerBuildableVehicleType(v) ||
+				(v->IsPrimaryVehicle() && v->current_order.type == OT_NOTHING)) {
+			v->current_order.type = OT_DUMMY;
+		}
+
 		FOR_ALL_VEHICLES_FROM(u, v->index + 1) {
 			/* If a vehicle has the same orders, add the link to eachother
 			 * in both vehicles */
@@ -1223,7 +1235,12 @@
 		}
 
 		if (_old_order_ptr != 0 && _old_order_ptr != 0xFFFFFFFF) {
-			v->orders = GetOrder(REMAP_ORDER_IDX(_old_order_ptr));
+			uint old_id = REMAP_ORDER_IDX(_old_order_ptr);
+			/* There is a maximum of 5000 orders in old savegames, so *if*
+			 * we go over that limit something is very wrong. In that case
+			 * we just assume there are no orders for the vehicle.
+			 */
+			if (old_id < 5000) v->orders = GetOrder(old_id);
 		}
 		AssignOrder(&v->current_order, UnpackOldOrder(_old_order));