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