(svn r11057) -Fix [FS#1215]: loading TTD savegames went into an infinite loop due to not yet properly set next and previous pointers.
--- 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