1 #ifndef _VEHICLES_H
2 #define _VEHICLES_H
3 
4 #include "JA2Types.h"
5 #include "Strategic_Movement.h"
6 
7 #include <vector>
8 
9 
10 #define MAX_VEHICLES 10
11 
12 // type of vehicles
13 enum{
14 	ELDORADO_CAR = 0,
15 	HUMMER,
16 	ICE_CREAM_TRUCK,
17 	JEEP_CAR,
18 	TANK_CAR,
19 	HELICOPTER,
20 	NUMBER_OF_TYPES_OF_VEHICLES,
21 };
22 
23 
24 // struct for vehicles
25 struct VEHICLETYPE
26 {
27 	PathSt  *pMercPath; // vehicle's stategic path list
28 	UINT8   ubMovementGroup; // the movement group this vehicle belongs to
29 	UINT8   ubVehicleType; // type of vehicle
30 	INT16   sSectorX; // X position on the Stategic Map
31 	INT16   sSectorY; // Y position on the Stategic Map
32 	INT16   sSectorZ;
33 	BOOLEAN fBetweenSectors; // between sectors?
34 	INT16   sGridNo; // location in tactical
35 	SOLDIERTYPE *pPassengers[ 10 ];
36 	BOOLEAN fDestroyed;
37 	UINT32  uiMovementSoundID;
38 	BOOLEAN fValid;
39 };
40 
41 #define CFOR_EACH_PASSENGER(v, iter)                                                   \
42 	for (SOLDIERTYPE* const* iter = (v).pPassengers,                        \
43 		* const* const end__##iter = (v).pPassengers + GetVehicleSeats((v)); \
44 		iter != end__##iter;                                                            \
45 		++iter)                                                                         \
46 		if (!*iter) continue; else
47 
48 
49 // the list of vehicles
50 extern std::vector<VEHICLETYPE> pVehicleList;
51 
52 #define VEHICLE2ID(v) static_cast<INT32>(&(v) - pVehicleList.data())
53 
54 #define BASE_FOR_EACH_VEHICLE(type, iter) \
55 	for (type& iter : pVehicleList) \
56 		if (!iter.fValid) continue; else
57 #define FOR_EACH_VEHICLE( iter) BASE_FOR_EACH_VEHICLE(      VEHICLETYPE, iter)
58 #define CFOR_EACH_VEHICLE(iter) BASE_FOR_EACH_VEHICLE(const VEHICLETYPE, iter)
59 
60 
61 void SetVehicleValuesIntoSoldierType( SOLDIERTYPE *pVehicle );
62 
63 // add vehicle to list and return id value
64 INT32 AddVehicleToList( INT16 sMapX, INT16 sMapY, INT16 sGridNo, UINT8 ubType );
65 
66 // remove this vehicle from the list
67 void RemoveVehicleFromList(VEHICLETYPE&);
68 
69 // clear out the vehicle list
70 void ClearOutVehicleList( void );
71 
72 bool AnyAccessibleVehiclesInSoldiersSector(SOLDIERTYPE const&);
73 
74 // is this vehicle in the same sector (not between sectors), and accesible
75 bool IsThisVehicleAccessibleToSoldier(SOLDIERTYPE const&, VEHICLETYPE const&);
76 
77 // strategic mvt stuff
78 // move character path to the vehicle
79 BOOLEAN MoveCharactersPathToVehicle( SOLDIERTYPE *pSoldier );
80 
81 // Return the vehicle, iff the vehicle ID is valid, NULL otherwise
82 VEHICLETYPE& GetVehicle(INT32 vehicle_id);
83 
84 // Given this grunt, find out if asscoiated vehicle has a mvt group, if so,
85 // set this grunts mvt group to the vehicle.  For pathing purposes, will be
86 // reset to zero in copying of path
87 void SetUpMvtGroupForVehicle(SOLDIERTYPE*);
88 
89 // find vehicle id of group with this vehicle
90 VEHICLETYPE& GetVehicleFromMvtGroup(GROUP const&);
91 
92 // kill everyone in vehicle
93 BOOLEAN KillAllInVehicle(VEHICLETYPE const&);
94 
95 // grab number of occupants in vehicles
96 INT32 GetNumberInVehicle(VEHICLETYPE const&);
97 
98 // grab # in vehicle skipping EPCs (who aren't allowed to drive :-)
99 INT32 GetNumberOfNonEPCsInVehicle( INT32 iId );
100 
101 BOOLEAN ExitVehicle( SOLDIERTYPE *pSoldier );
102 
103 
104 void VehicleTakeDamage(UINT8 ubID, UINT8 ubReason, INT16 sDamage, INT16 sGridNo, SOLDIERTYPE* att);
105 
106 // the soldiertype containing this tactical incarnation of this vehicle
107 SOLDIERTYPE& GetSoldierStructureForVehicle(VEHICLETYPE const&);
108 
109 // does it need fixing?
110 bool DoesVehicleNeedAnyRepairs(VEHICLETYPE const&);
111 
112 // repair the vehicle
113 INT8 RepairVehicle(VEHICLETYPE const&, INT8 bTotalPts, BOOLEAN* pfNothingToRepair);
114 
115 
116 //Save all the vehicle information to the saved game file
117 void SaveVehicleInformationToSaveGameFile(HWFILE);
118 
119 //Load all the vehicle information From the saved game file
120 void LoadVehicleInformationFromSavedGameFile(HWFILE, UINT32 uiSavedGameVersion);
121 
122 // take soldier out of vehicle
123 BOOLEAN TakeSoldierOutOfVehicle( SOLDIERTYPE *pSoldier );
124 
125 bool PutSoldierInVehicle(SOLDIERTYPE&, VEHICLETYPE&);
126 
127 void SetVehicleSectorValues(VEHICLETYPE&, UINT8 x, UINT8 y);
128 
129 void UpdateAllVehiclePassengersGridNo( SOLDIERTYPE *pSoldier );
130 
131 void LoadVehicleMovementInfoFromSavedGameFile(HWFILE);
132 void NewSaveVehicleMovementInfoToSavedGameFile(HWFILE);
133 void NewLoadVehicleMovementInfoFromSavedGameFile(HWFILE);
134 
135 BOOLEAN OKUseVehicle( UINT8 ubProfile );
136 
137 BOOLEAN IsRobotControllerInVehicle( INT32 iId );
138 
139 void AddVehicleFuelToSave(void);
140 
141 bool SoldierMustDriveVehicle(SOLDIERTYPE const&, bool trying_to_travel);
142 
143 bool IsEnoughSpaceInVehicle(VEHICLETYPE const&);
144 
145 BOOLEAN IsSoldierInThisVehicleSquad(const SOLDIERTYPE* pSoldier, INT8 bSquadNumber);
146 
147 SOLDIERTYPE*  PickRandomPassengerFromVehicle( SOLDIERTYPE *pSoldier );
148 
149 bool DoesVehicleGroupHaveAnyPassengers(GROUP const&);
150 
151 void SetSoldierExitHelicopterInsertionData(SOLDIERTYPE*);
152 
153 void HandleVehicleMovementSound(const SOLDIERTYPE*, BOOLEAN fOn);
154 
155 UINT8 GetVehicleArmourType(UINT8 vehicle_id);
156 
157 UINT8 GetVehicleSeats(VEHICLETYPE const&);
158 
159 void InitVehicles(void);
160 
161 #endif
162