1 #include "Debug.h"
2 #include "FileMan.h"
3 #include "LoadSaveVehicleType.h"
4 #include "LoadSaveData.h"
5 #include "Soldier_Control.h"
6 #include "Soldier_Profile.h"
7 #include "Vehicles.h"
8
9
ExtractVehicleTypeFromFile(HWFILE const file,VEHICLETYPE * const v,UINT32 const savegame_version)10 void ExtractVehicleTypeFromFile(HWFILE const file, VEHICLETYPE* const v, UINT32 const savegame_version)
11 {
12 BYTE data[128];
13 FileRead(file, data, sizeof(data));
14
15 DataReader d{data};
16 EXTR_PTR(d, v->pMercPath)
17 EXTR_U8(d, v->ubMovementGroup)
18 EXTR_U8(d, v->ubVehicleType)
19 EXTR_I16(d, v->sSectorX)
20 EXTR_I16(d, v->sSectorY)
21 EXTR_I16(d, v->sSectorZ)
22 EXTR_BOOL(d, v->fBetweenSectors)
23 EXTR_SKIP(d, 1)
24 EXTR_I16(d, v->sGridNo);
25 const ProfileID noone = (savegame_version < 86 ? 0 : NO_PROFILE);
26 // The ProfileID of the passengers gets stored, not their SoldierID
27 FOR_EACH(SOLDIERTYPE*, i, v->pPassengers)
28 {
29 ProfileID id;
30 EXTR_U8(d, id)
31 EXTR_SKIP(d, 3)
32 *i = (id == noone ? NULL : FindSoldierByProfileID(id));
33 }
34 EXTR_SKIP(d, 61)
35 EXTR_BOOL(d, v->fDestroyed)
36 EXTR_SKIP(d, 2)
37 EXTR_U32(d, v->uiMovementSoundID)
38 EXTR_SKIP(d, 1)
39 EXTR_BOOL(d, v->fValid)
40 EXTR_SKIP(d, 2)
41 Assert(d.getConsumed() == lengthof(data));
42 }
43
44
InjectVehicleTypeIntoFile(HWFILE const file,VEHICLETYPE const * const v)45 void InjectVehicleTypeIntoFile(HWFILE const file, VEHICLETYPE const* const v)
46 {
47 BYTE data[128];
48
49 DataWriter d{data};
50 INJ_PTR(d, v->pMercPath)
51 INJ_U8(d, v->ubMovementGroup)
52 INJ_U8(d, v->ubVehicleType)
53 INJ_I16(d, v->sSectorX)
54 INJ_I16(d, v->sSectorY)
55 INJ_I16(d, v->sSectorZ)
56 INJ_BOOL(d, v->fBetweenSectors)
57 INJ_SKIP(d, 1)
58 INJ_I16(d, v->sGridNo);
59 // The ProfileID of the passengers gets stored, not their SoldierID
60 FOR_EACH(SOLDIERTYPE* const, i, v->pPassengers)
61 {
62 const ProfileID id = (*i == NULL ? NO_PROFILE : (*i)->ubProfile);
63 INJ_U8(d, id)
64 INJ_SKIP(d, 3)
65 }
66 INJ_SKIP(d, 61)
67 INJ_BOOL(d, v->fDestroyed)
68 INJ_SKIP(d, 2)
69 INJ_U32(d, v->uiMovementSoundID)
70 INJ_SKIP(d, 1)
71 INJ_BOOL(d, v->fValid)
72 INJ_SKIP(d, 2)
73 Assert(d.getConsumed() == lengthof(data));
74
75 FileWrite(file, data, sizeof(data));
76 }
77