Mercurial > hg > openttd
changeset 6817:f25c4cfd1893 draft
(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.
author | rubidium <rubidium@openttd.org> |
---|---|
date | Thu, 07 Jun 2007 12:37:48 +0000 |
parents | d38b94f5ba15 |
children | f36e508d7816 |
files | src/saveload.cpp src/saveload.h src/vehicle.cpp |
diffstat | 3 files changed, 28 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- a/src/saveload.cpp +++ b/src/saveload.cpp @@ -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 +++ b/src/saveload.h @@ -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 +++ b/src/vehicle.cpp @@ -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;