(svn r10056) -Revert (r10049): removing SLE_WRITEBYTE didn't work as expected :(. Somehow SlIterateArray and SlObject depend on eachother and adding a some arbitrary data before the SlObject makes it go crazy.
authorrubidium
Thu, 07 Jun 2007 12:37:48 +0000
changeset 6817 ca1cc2fd4cfa
parent 6816 bff19f37423d
child 6818 5d01c864837c
(svn r10056) -Revert (r10049): removing SLE_WRITEBYTE didn't work as expected :(. Somehow SlIterateArray and SlObject depend on eachother and adding a some arbitrary data before the SlObject makes it go crazy.
src/saveload.cpp
src/saveload.h
src/vehicle.cpp
--- a/src/saveload.cpp	Thu Jun 07 12:37:27 2007 +0000
+++ b/src/saveload.cpp	Thu Jun 07 12:37:48 2007 +0000
@@ -744,6 +744,7 @@
 			default: NOT_REACHED();
 			}
 			break;
+		case SL_WRITEBYTE: return 1; // a byte is logically of size 1
 		case SL_INCLUDE: return SlCalcObjLength(object, _sl.includes[sld->version_from]);
 		default: NOT_REACHED();
 	}
@@ -781,6 +782,19 @@
 		}
 		break;
 
+	/* SL_WRITEBYTE translates a value of a variable to another one upon
+	 * saving or loading.
+	 * XXX - variable renaming abuse
+	 * game_value: the value of the variable ingame is abused by sld->version_from
+	 * file_value: the value of the variable in the savegame is abused by sld->version_to */
+	case SL_WRITEBYTE:
+		if (_sl.save) {
+			SlWriteByte(sld->version_to);
+		} else {
+			*(byte*)ptr = sld->version_from;
+		}
+		break;
+
 	/* SL_INCLUDE loads common code for a type
 	 * XXX - variable renaming abuse
 	 * include_index: common code to include from _desc_includes[], abused by sld->version_from */
--- a/src/saveload.h	Thu Jun 07 12:37:27 2007 +0000
+++ b/src/saveload.h	Thu Jun 07 12:37:48 2007 +0000
@@ -161,6 +161,7 @@
 	SL_STR       =  3,
 	SL_LST       =  4,
 	// non-normal save-load types
+	SL_WRITEBYTE =  8,
 	SL_INCLUDE   =  9,
 	SL_END       = 15
 };
@@ -200,6 +201,8 @@
 
 #define SLE_CONDNULL(length, from, to) SLE_CONDARR(NullStruct, null, SLE_FILE_U8 | SLE_VAR_NULL | SLF_CONFIG_NO, length, from, to)
 
+/* Translate values ingame to different values in the savegame and vv */
+#define SLE_WRITEBYTE(base, variable, value) SLE_GENERAL(SL_WRITEBYTE, base, variable, 0, 0, value, value)
 /* Load common code and put it into each struct (currently only for vehicles */
 #define SLE_INCLUDE(base, variable, include_index) SLE_GENERAL(SL_INCLUDE, base, variable, 0, 0, include_index, 0)
 
@@ -211,6 +214,7 @@
 #define SLE_VARX(offset, type) SLE_CONDVARX(offset, type, 0, SL_MAX_VERSION)
 #define SLE_REFX(offset, type) SLE_CONDREFX(offset, type, 0, SL_MAX_VERSION)
 
+#define SLE_WRITEBYTEX(offset, something) SLE_GENERALX(SL_WRITEBYTE, offset, 0, something, 0)
 #define SLE_INCLUDEX(offset, type) SLE_GENERALX(SL_INCLUDE, offset, type, 0, SL_MAX_VERSION)
 
 /* End marker */
--- a/src/vehicle.cpp	Thu Jun 07 12:37:27 2007 +0000
+++ b/src/vehicle.cpp	Thu Jun 07 12:37:48 2007 +0000
@@ -2714,6 +2714,7 @@
 
 
 static const SaveLoad _train_desc[] = {
+	SLE_WRITEBYTE(Vehicle, type, VEH_TRAIN),
 	SLE_INCLUDEX(0, INC_VEHICLE_COMMON),
 	    SLE_VARX(cpp_offsetof(Vehicle, u) + cpp_offsetof(VehicleRail, crash_anim_pos),         SLE_UINT16),
 	    SLE_VARX(cpp_offsetof(Vehicle, u) + cpp_offsetof(VehicleRail, force_proceed),          SLE_UINT8),
@@ -2731,6 +2732,7 @@
 };
 
 static const SaveLoad _roadveh_desc[] = {
+	SLE_WRITEBYTE(Vehicle, type, VEH_ROAD),
 	SLE_INCLUDEX(0, INC_VEHICLE_COMMON),
 	    SLE_VARX(cpp_offsetof(Vehicle, u) + cpp_offsetof(VehicleRoad, state),          SLE_UINT8),
 	    SLE_VARX(cpp_offsetof(Vehicle, u) + cpp_offsetof(VehicleRoad, frame),          SLE_UINT8),
@@ -2750,6 +2752,7 @@
 };
 
 static const SaveLoad _ship_desc[] = {
+	SLE_WRITEBYTE(Vehicle, type, VEH_SHIP),
 	SLE_INCLUDEX(0, INC_VEHICLE_COMMON),
 	SLE_VARX(cpp_offsetof(Vehicle, u) + cpp_offsetof(VehicleShip, state), SLE_UINT8),
 
@@ -2760,6 +2763,7 @@
 };
 
 static const SaveLoad _aircraft_desc[] = {
+	SLE_WRITEBYTE(Vehicle, type, VEH_AIRCRAFT),
 	SLE_INCLUDEX(0, INC_VEHICLE_COMMON),
 	    SLE_VARX(cpp_offsetof(Vehicle, u) + cpp_offsetof(VehicleAir, crashed_counter), SLE_UINT16),
 	    SLE_VARX(cpp_offsetof(Vehicle, u) + cpp_offsetof(VehicleAir, pos),             SLE_UINT8),
@@ -2778,6 +2782,8 @@
 };
 
 static const SaveLoad _special_desc[] = {
+	SLE_WRITEBYTE(Vehicle, type, VEH_SPECIAL),
+
 	    SLE_VAR(Vehicle, subtype,       SLE_UINT8),
 
 	SLE_CONDVAR(Vehicle, tile,          SLE_FILE_U16 | SLE_VAR_U32, 0, 5),
@@ -2804,6 +2810,8 @@
 };
 
 static const SaveLoad _disaster_desc[] = {
+	SLE_WRITEBYTE(Vehicle, type, VEH_DISASTER),
+
 	    SLE_REF(Vehicle, next,          REF_VEHICLE_OLD),
 
 	    SLE_VAR(Vehicle, subtype,       SLE_UINT8),
@@ -2856,7 +2864,6 @@
 	/* Write the vehicles */
 	FOR_ALL_VEHICLES(v) {
 		SlSetArrayIndex(v->index);
-		SlWriteByte(v->type);
 		SlObject(v, (SaveLoad*)_veh_descs[v->type]);
 	}
 }
@@ -2874,8 +2881,8 @@
 			error("Vehicles: failed loading savegame: too many vehicles");
 
 		v = GetVehicle(index);
-		v->type = (VehicleType)SlReadByte();
-		SlObject(v, (SaveLoad*)_veh_descs[v->type]);
+		VehicleType vtype = (VehicleType)SlReadByte();
+		SlObject(v, (SaveLoad*)_veh_descs[vtype]);
 
 		switch (v->type) {
 			case VEH_TRAIN:    v = new (v) Train();           break;