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