# HG changeset patch # User truelight # Date 1105296558 0 # Node ID d72a565cc6726a710b81cf359d7f6a854ee73422 # Parent 25bc5b97e3e27d37abd0bb5f233fbe961a27b411 (svn r1448) -Fix: The current_order of a vehicle is now correctly saved (caused massive desyncs) Warning: savegames which are made with the nightly of 08-01-2005 will NO LONGER work!! diff -r 25bc5b97e3e2 -r d72a565cc672 saveload.h --- a/saveload.h Sun Jan 09 17:55:11 2005 +0000 +++ b/saveload.h Sun Jan 09 18:49:18 2005 +0000 @@ -139,9 +139,6 @@ }; #define SLE_VAR(t,i,c) 0 | (offsetof(t,i) & 0xF), offsetof(t,i) >> 4, c -#if _MSC_VER == 1200 /* XXX workaround for MSVC6 */ -#define SLE_VAR2(t0,i0, t1, i1, c) 0 | ((offsetof(t0, i0) + offsetof(t1, i1)) & 0xF), (offsetof(t0, i0) + offsetof(t1, i1)) >> 4, c -#endif #define SLE_REF(t,i,c) 0x10 | (offsetof(t,i) & 0xF), offsetof(t,i) >> 4, c #define SLE_ARR(t,i,c,l) 0x20 | (offsetof(t,i) & 0xF), offsetof(t,i) >> 4, c, l #define SLE_CONDVAR(t,i,c,from,to) 0x40 | (offsetof(t,i) & 0xF), offsetof(t,i) >> 4, c, from, to diff -r 25bc5b97e3e2 -r d72a565cc672 vehicle.c --- a/vehicle.c Sun Jan 09 17:55:11 2005 +0000 +++ b/vehicle.c Sun Jan 09 18:49:18 2005 +0000 @@ -1511,7 +1511,7 @@ // 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++; - + v->cargo_type = rvi->cargo_type; v->cargo_cap = rvi->capacity; v->max_speed = rvi->max_speed; @@ -1834,12 +1834,18 @@ SLE_VAR(Vehicle,cur_order_index, SLE_UINT8), SLE_VAR(Vehicle,num_orders, SLE_UINT8), - SLE_VAR(Vehicle,current_order, SLE_UINT8), /* XXX hack to avoid version bump */ - #if _MSC_VER != 1200 - SLE_VAR(Vehicle,current_order.station, SLE_UINT8), - #else /* XXX workaround for MSVC6 */ - SLE_VAR2(Vehicle, current_order, Order, station, SLE_UINT8), - #endif + + /* This next line is for version 4 and prior compatibility.. it temporarily reads + type and flags (which were both 4 bits) into type. Later on this is + converted correctly */ + SLE_CONDVARX(offsetof(Vehicle, current_order) + offsetof(Order, type), SLE_UINT8, 0, 4), + SLE_CONDVARX(offsetof(Vehicle, current_order) + offsetof(Order, station), SLE_FILE_U8 | SLE_VAR_U16, 0, 4), + + /* Orders for version 5 and on */ + SLE_CONDVARX(offsetof(Vehicle, current_order) + offsetof(Order, type), SLE_UINT8, 5, 255), + SLE_CONDVARX(offsetof(Vehicle, current_order) + offsetof(Order, flags), SLE_UINT8, 5, 255), + SLE_CONDVARX(offsetof(Vehicle, current_order) + offsetof(Order, station), SLE_UINT16, 5, 255), + SLE_REF(Vehicle,schedule_ptr, REF_SCHEDULE), SLE_VAR(Vehicle,age, SLE_UINT16), @@ -1986,11 +1992,8 @@ SLE_VAR(Vehicle,z_height, SLE_UINT8), SLE_VAR(Vehicle,owner, SLE_UINT8), SLE_VAR(Vehicle,vehstatus, SLE_UINT8), - #if _MSC_VER != 1200 - SLE_VAR(Vehicle,current_order.station, SLE_UINT8), - #else /* XXX workaround for MSVC6 */ - SLE_VAR2(Vehicle, current_order, Order, station, SLE_UINT8), - #endif + SLE_CONDVARX(offsetof(Vehicle, current_order) + offsetof(Order, station), SLE_FILE_U8 | SLE_VAR_U16, 0, 4), + SLE_CONDVARX(offsetof(Vehicle, current_order) + offsetof(Order, station), SLE_UINT16, 5, 255), SLE_VAR(Vehicle,cur_image, SLE_UINT16), SLE_VAR(Vehicle,age, SLE_UINT16), @@ -2045,6 +2048,13 @@ /* Old savegames used 'last_station_visited = 0xFF', should be 0xFFFF */ if (_sl.version < 5 && v->last_station_visited == 0xFF) v->last_station_visited = 0xFFFF; + + if (_sl.version < 5) { + /* Convert the current_order.type (which is a mix of type and flags, because + in those versions, they both were 4 bits big) to type and flags */ + v->current_order.flags = (v->current_order.type & 0xF0) >> 4; + v->current_order.type = v->current_order.type & 0x0F; + } } // Iterate through trains and set first_engine appropriately. diff -r 25bc5b97e3e2 -r d72a565cc672 vehicle.h --- a/vehicle.h Sun Jan 09 17:55:11 2005 +0000 +++ b/vehicle.h Sun Jan 09 18:49:18 2005 +0000 @@ -3,6 +3,10 @@ #include "vehicle_gui.h" +/* If you change this, keep in mind that it is saved on 3 places: + - Load_ORDR, all the global orders + - Vehicle -> current_order + - REF_SHEDULE (all REFs are currently limited to 16 bits!!) */ typedef struct Order { uint8 type; uint8 flags;