(svn r11057) -Fix [FS#1215]: loading TTD savegames went into an infinite loop due to not yet properly set next and previous pointers.
authorrubidium
Fri, 07 Sep 2007 22:06:52 +0000
changeset 8033 f80315b59db1
parent 8032 0901aabd9aef
child 8034 0f6a176ce1e9
(svn r11057) -Fix [FS#1215]: loading TTD savegames went into an infinite loop due to not yet properly set next and previous pointers.
src/oldloader.cpp
src/vehicle.h
--- a/src/oldloader.cpp	Fri Sep 07 21:17:01 2007 +0000
+++ b/src/oldloader.cpp	Fri Sep 07 22:06:52 2007 +0000
@@ -1175,7 +1175,7 @@
 	OCL_END()
 };
 
-static bool LoadOldVehicle(LoadgameState *ls, int num)
+bool LoadOldVehicle(LoadgameState *ls, int num)
 {
 	uint i;
 
@@ -1206,7 +1206,7 @@
 			default:   v->spritenum >>= 1; break;
 		}
 
-		if (_old_next_ptr != 0xFFFF) v->SetNext(GetVehicle(_old_next_ptr));
+		if (_old_next_ptr != 0xFFFF) v->next = GetVehicle(_old_next_ptr);
 
 		v->string_id = RemapOldStringID(_old_string_id);
 
--- a/src/vehicle.h	Fri Sep 07 21:17:01 2007 +0000
+++ b/src/vehicle.h	Fri Sep 07 22:06:52 2007 +0000
@@ -218,9 +218,12 @@
 struct Vehicle;
 DECLARE_OLD_POOL(Vehicle, Vehicle, 9, 125)
 
+/* Some declarations of functions, so we can make them friendly */
 struct SaveLoad;
-const SaveLoad *GetVehicleDescription(VehicleType vt);
-void AfterLoadVehicles();
+extern const SaveLoad *GetVehicleDescription(VehicleType vt);
+extern void AfterLoadVehicles();
+struct LoadgameState;
+extern bool LoadOldVehicle(LoadgameState *ls, int num);
 
 struct Vehicle : PoolItem<Vehicle, VehicleID, &_Vehicle_pool> {
 	VehicleTypeByte type;    ///< Type of vehicle
@@ -232,7 +235,8 @@
 	Vehicle *first;          // NOSAVE: pointer to the first vehicle in the chain
 public:
 	friend const SaveLoad *GetVehicleDescription(VehicleType vt); // So we can use private/protected variables in the saveload code
-	friend void AfterLoadVehicles();
+	friend void AfterLoadVehicles();                              // So we can set the previous and first pointers while loading
+	friend bool LoadOldVehicle(LoadgameState *ls, int num);       // So we can set the proper next pointer while loading
 
 	Vehicle *depot_list;     // NOSAVE: linked list to tell what vehicles entered a depot during the last tick. Used by autoreplace