(svn r1429) Change: bumped savegame to revision 5.
authortruelight
Sat, 08 Jan 2005 12:47:26 +0000
changeset 941 4a695e126035
parent 940 24e6412a2214
child 942 31f28eedd2b8
(svn r1429) Change: bumped savegame to revision 5.
- Now orders are bigger
- Now _map2 is official 16 bits
saveload.c
vehicle.c
vehicle.h
--- a/saveload.c	Sat Jan 08 12:03:21 2005 +0000
+++ b/saveload.c	Sat Jan 08 12:47:26 2005 +0000
@@ -7,8 +7,8 @@
 #include "saveload.h"
 
 enum {
-	SAVEGAME_MAJOR_VERSION = 4,
-	SAVEGAME_MINOR_VERSION = 4,
+	SAVEGAME_MAJOR_VERSION = 5,
+	SAVEGAME_MINOR_VERSION = 0,
 
 	SAVEGAME_LOADABLE_VERSION = (SAVEGAME_MAJOR_VERSION << 8) + SAVEGAME_MINOR_VERSION
 };
--- a/vehicle.c	Sat Jan 08 12:03:21 2005 +0000
+++ b/vehicle.c	Sat Jan 08 12:47:26 2005 +0000
@@ -598,7 +598,7 @@
 	uint32 full = 0, not_full = 0;
 
 	//special handling of aircraft
-	
+
 	//if the aircraft carries passengers and is NOT full, then
 	//continue loading, no matter how much mail is in
 	if ((v->type == VEH_Aircraft) && (v->cargo_type == CT_PASSENGERS) && (v->cargo_cap != v->cargo_count)) {
@@ -1507,7 +1507,7 @@
 				if it is a multiheaded engine (rear engine)
 				(rvi->flags & RVI_MULTIHEAD && sprite - rvi2->image_index) is true if the engine is heading the other way, otherwise 0*/
 				v->spritenum = rvi->image_index + (( rvi->flags & RVI_MULTIHEAD && sprite - rvi2->image_index) ? 1 : 0);
-				
+
 				// turn the last engine in a multiheaded train if needed
 				if ( v->next == NULL && rvi->flags & RVI_MULTIHEAD && v->spritenum == rvi->image_index )
 					v->spritenum++;
@@ -2023,10 +2023,6 @@
 	// Write the vehicles
 	FOR_ALL_VEHICLES(v) {
 		if (v->type != 0) {
-			/* XXX - Here for now, because we did not bump the savegame to version 5 yet */
-			if (_sl.version < 5 && v->last_station_visited == 0xFFFF)
-				v->last_station_visited = 0xFF;
-
 			SlSetArrayIndex(v->index);
 			SlObject(v, _veh_descs[v->type - 0x10]);
 		}
@@ -2128,7 +2124,7 @@
 
 static void Save_ORDR()
 {
-	uint16 orders[lengthof(_order_array)];
+	uint32 orders[lengthof(_order_array)];
 	uint len = _ptr_to_next_order - _order_array;
 	uint i;
 
@@ -2137,22 +2133,38 @@
 	for (i = 0; i < len; ++i)
 		orders[i] = PackOrder(&_order_array[i]);
 
-	SlArray(orders, len, SLE_UINT16);
+	SlArray(orders, len, SLE_UINT32);
 }
 
 static void Load_ORDR()
 {
-	uint16 orders[lengthof(_order_array)];
-	uint len = SlGetFieldLength() >> 1;
+	uint len = SlGetFieldLength();
 	uint i;
 
-	assert (len <= lengthof(orders));
+	if (_sl.version < 5) {
+		/* Older version had an other layout for orders.. convert them correctly */
+		uint16 orders[lengthof(_order_array)];
+
+		len /= sizeof(uint16);
+		assert (len <= lengthof(orders));
+
+		SlArray(orders, len, SLE_UINT16);
+
+		for (i = 0; i < len; ++i)
+			_order_array[i] = UnpackVersion4Order(orders[i]);
+	} else {
+		uint32 orders[lengthof(_order_array)];
+
+		len /= sizeof(uint32);
+		assert (len <= lengthof(orders));
+
+		SlArray(orders, len, SLE_UINT32);
+
+		for (i = 0; i < len; ++i)
+			_order_array[i] = UnpackOrder(orders[i]);
+	}
 
 	_ptr_to_next_order = _order_array + len;
-	SlArray(orders, len, SLE_UINT16);
-
-	for (i = 0; i < len; ++i)
-		_order_array[i] = UnpackOrder(orders[i]);
 }
 
 const ChunkHandler _veh_chunk_handlers[] = {
--- a/vehicle.h	Sat Jan 08 12:03:21 2005 +0000
+++ b/vehicle.h	Sat Jan 08 12:47:26 2005 +0000
@@ -4,27 +4,31 @@
 #include "vehicle_gui.h"
 
 typedef struct Order {
-#ifdef TTD_LITTLE_ENDIAN /* XXX hack to avoid savegame revision bump */
-	uint8 type:4;
-	uint8 flags:4;
-#else
-	uint8 flags:4;
-	uint8 type:4;
-#endif
+	uint8 type;
+	uint8 flags;
 	uint16 station;
 } Order;
 
-static inline uint16 PackOrder(const Order *order)
+static inline uint32 PackOrder(const Order *order)
 {
-	return order->station << 8 | order->flags << 4 | order->type;
+	return order->station << 16 | order->flags << 8 | order->type;
 }
 
-static inline Order UnpackOrder(uint16 packed)
+static inline Order UnpackOrder(uint32 packed)
 {
 	Order order;
-	order.type    = (packed & 0x000f);
-	order.flags   = (packed & 0x00f0) >> 4,
-	order.station = (packed & 0xff00) >> 8;
+	order.type    = (packed & 0x000000FF);
+	order.flags   = (packed & 0x0000FF00) >> 8;
+	order.station = (packed & 0xFFFF0000) >> 16;
+	return order;
+}
+
+static inline Order UnpackVersion4Order(uint16 packed)
+{
+	Order order;
+	order.type    = (packed & 0x000F);
+	order.flags   = (packed & 0x00F0) >> 4;
+	order.station = (packed & 0xFF00) >> 8;
 	return order;
 }