re3/src/control/CarCtrl.h

167 lines
6.4 KiB
C
Raw Normal View History

2019-05-18 10:39:39 +00:00
#pragma once
2019-08-11 17:11:54 +00:00
#include "PathFind.h"
2019-09-14 17:53:04 +00:00
#include "Boat.h"
2019-08-11 17:11:54 +00:00
#include "Vehicle.h"
2019-05-18 10:39:39 +00:00
2019-10-10 21:02:55 +00:00
#define GAME_SPEED_TO_METERS_PER_SECOND 50.0f
2020-01-03 16:48:13 +00:00
#define METERS_PER_SECOND_TO_GAME_SPEED (1.0f / GAME_SPEED_TO_METERS_PER_SECOND)
2019-10-10 21:02:55 +00:00
#define GAME_SPEED_TO_CARAI_SPEED 60.0f
#define TIME_COPS_WAIT_TO_EXIT_AFTER_STOPPING 2500
2019-08-06 21:32:19 +00:00
class CZoneInfo;
2019-05-18 10:39:39 +00:00
2019-08-11 17:11:54 +00:00
enum{
MAX_CARS_TO_KEEP = 2,
MAX_CAR_MODELS_IN_ARRAY = 25,
2019-08-11 17:11:54 +00:00
};
#define LANE_WIDTH 5.0f
2019-09-02 16:04:09 +00:00
#ifdef FIX_BUGS
#define FIX_PATHFIND_BUG
#endif
2019-05-18 10:39:39 +00:00
class CCarCtrl
{
2020-05-07 09:33:20 +00:00
public:
2019-08-06 21:32:19 +00:00
enum eCarClass {
2020-05-07 09:33:20 +00:00
NORMAL = 0,
POOR,
2019-08-06 21:32:19 +00:00
RICH,
EXEC,
WORKER,
BIG,
TAXI,
2020-05-07 09:33:20 +00:00
MOPED,
MOTORBIKE,
2020-05-07 09:33:20 +00:00
LEISUREBOAT,
WORKERBOAT,
2020-05-07 20:21:36 +00:00
COPS,
2019-08-06 21:32:19 +00:00
MAFIA,
TRIAD,
DIABLO,
YAKUZA,
YARDIE,
COLOMB,
NINES,
GANG8,
GANG9,
2020-05-07 20:21:36 +00:00
COPS_BOAT,
FIRST_CAR_RATING = NORMAL,
FIRST_BOAT_RATING = LEISUREBOAT,
FIRST_GANG_CAR_RATING = MAFIA,
NUM_CAR_CLASSES = MOTORBIKE - FIRST_CAR_RATING + 1,
NUM_BOAT_CLASSES = WORKERBOAT - FIRST_BOAT_RATING + 1,
NUM_GANG_CAR_CLASSES = GANG9 - FIRST_GANG_CAR_RATING + 1,
TOTAL_CUSTOM_CLASSES = NUM_CAR_CLASSES + NUM_BOAT_CLASSES
2019-08-06 21:32:19 +00:00
};
2020-05-07 09:33:20 +00:00
2019-05-18 10:39:39 +00:00
static void SwitchVehicleToRealPhysics(CVehicle*);
2019-06-28 10:34:02 +00:00
static void AddToCarArray(int32 id, int32 vehclass);
2019-06-24 22:42:23 +00:00
static void UpdateCarCount(CVehicle*, bool);
2019-06-28 10:34:02 +00:00
static int32 ChooseCarModel(int32 vehclass);
static bool JoinCarWithRoadSystemGotoCoors(CVehicle*, CVector, bool);
static void JoinCarWithRoadSystem(CVehicle*);
static void UpdateCarOnRails(CVehicle*);
2019-07-17 21:58:06 +00:00
static bool MapCouldMoveInThisArea(float x, float y);
2019-07-18 13:41:09 +00:00
static void ScanForPedDanger(CVehicle *veh);
2019-07-25 20:34:29 +00:00
static void RemoveFromInterestingVehicleList(CVehicle*);
2019-08-06 21:32:19 +00:00
static void GenerateRandomCars(void);
2020-05-08 08:43:27 +00:00
static void GenerateOneRandomCar(void);
2019-08-06 21:32:19 +00:00
static void GenerateEmergencyServicesCar(void);
static int32 ChooseModel(CZoneInfo*, CVector*, int*);
static int32 ChoosePoliceCarModel(void);
2019-08-10 07:44:19 +00:00
static int32 ChooseGangCarModel(int32 gang);
2019-08-11 17:11:54 +00:00
static void RemoveDistantCars(void);
static void PossiblyRemoveVehicle(CVehicle*);
static bool IsThisVehicleInteresting(CVehicle*);
2019-09-13 19:04:55 +00:00
static void RegisterVehicleOfInterest(CVehicle*);
2019-08-11 17:11:54 +00:00
static int32 CountCarsOfType(int32 mi);
static void SlowCarOnRailsDownForTrafficAndLights(CVehicle*);
2019-09-02 16:04:09 +00:00
static bool PickNextNodeAccordingStrategy(CVehicle*);
2019-08-11 17:11:54 +00:00
static void DragCarToPoint(CVehicle*, CVector*);
static float FindMaximumSpeedForThisCarInTraffic(CVehicle*);
static void SlowCarDownForCarsSectorList(CPtrList&, CVehicle*, float, float, float, float, float*, float);
static void SlowCarDownForPedsSectorList(CPtrList&, CVehicle*, float, float, float, float, float*, float);
2019-08-25 13:47:22 +00:00
static void SlowCarDownForOtherCar(CEntity*, CVehicle*, float*, float);
static float TestCollisionBetween2MovingRects(CVehicle*, CVehicle*, float, float, CVector*, CVector*, uint8);
2019-09-01 14:02:23 +00:00
static float FindAngleToWeaveThroughTraffic(CVehicle*, CPhysical*, float, float);
static void WeaveThroughCarsSectorList(CPtrList&, CVehicle*, CPhysical*, float, float, float, float, float*, float*);
static void WeaveForOtherCar(CEntity*, CVehicle*, float*, float*);
static void WeaveThroughPedsSectorList(CPtrList&, CVehicle*, CPhysical*, float, float, float, float, float*, float*);
static void WeaveForPed(CEntity*, CVehicle*, float*, float*);
static void WeaveThroughObjectsSectorList(CPtrList&, CVehicle*, float, float, float, float, float*, float*);
static void WeaveForObject(CEntity*, CVehicle*, float*, float*);
2019-09-02 16:04:09 +00:00
#ifdef FIX_PATHFIND_BUG
static void PickNextNodeToChaseCar(CVehicle*, float, float, float, CVehicle*);
#else
static void PickNextNodeToChaseCar(CVehicle*, float, float, CVehicle*);
#endif
static bool PickNextNodeToFollowPath(CVehicle*);
static void PickNextNodeRandomly(CVehicle*);
static uint8 FindPathDirection(int32, int32, int32);
2019-09-12 10:11:13 +00:00
static void Init(void);
static void ReInit(void);
2019-09-14 17:53:04 +00:00
static float FindSpeedMultiplier(float, float, float, float);
static void SteerAICarWithPhysics(CVehicle*);
static void SteerAICarWithPhysics_OnlyMission(CVehicle*, float*, float*, float*, bool*);
static void SteerAIBoatWithPhysics(CBoat*);
static float FindMaxSteerAngle(CVehicle*);
static void SteerAICarWithPhysicsFollowPath(CVehicle*, float*, float*, float*, bool*);
static void SteerAICarWithPhysicsHeadingForTarget(CVehicle*, CPhysical*, float, float, float*, float*, float*, bool*);
static void SteerAICarWithPhysicsTryingToBlockTarget(CVehicle*, float, float, float, float, float*, float*, float*, bool*);
static void SteerAICarWithPhysicsTryingToBlockTarget_Stop(CVehicle*, float, float, float, float, float*, float*, float*, bool*);
static void SteerAIBoatWithPhysicsHeadingForTarget(CBoat*, float, float, float*, float*, float*);
2019-09-12 10:11:13 +00:00
static bool ThisRoadObjectCouldMove(int16);
2019-09-14 23:28:07 +00:00
static void ClearInterestingVehicleList();
static void FindLinksToGoWithTheseNodes(CVehicle*);
static bool GenerateOneEmergencyServicesCar(uint32, CVector);
static float FindSpeedMultiplierWithSpeedFromNodes(int8);
2020-05-07 20:21:36 +00:00
static int32 ChooseBoatModel(int32);
static int32 ChooseBoatRating(CZoneInfo* pZoneInfo);
static int32 ChooseCarRating(CZoneInfo* pZoneInfo);
2020-05-08 08:11:09 +00:00
static void AddToLoadedVehicleArray(int32 mi, int32 rating, int32 freq);
static void RemoveFromLoadedVehicleArray(int32 mi, int32 rating);
static int32 ChooseCarModelToLoad(int rating);
2019-08-11 17:11:54 +00:00
static float GetPositionAlongCurrentCurve(CVehicle* pVehicle)
{
uint32 timeInCurve = CTimer::GetTimeInMilliseconds() - pVehicle->AutoPilot.m_nTimeEnteredCurve;
return (float)timeInCurve / pVehicle->AutoPilot.m_nTimeToSpendOnCurrentCurve;
}
2019-09-01 14:02:23 +00:00
static float LimitRadianAngle(float angle)
{
while (angle < -PI)
angle += TWOPI;
while (angle > PI)
angle -= TWOPI;
return angle;
}
2020-04-17 05:54:14 +00:00
static int32 NumLawEnforcerCars;
static int32 NumAmbulancesOnDuty;
static int32 NumFiretrucksOnDuty;
static int32 NumRandomCars;
static int32 NumMissionCars;
static int32 NumParkedCars;
static int32 NumPermanentCars;
static bool bCarsGeneratedAroundCamera;
static float CarDensityMultiplier;
static int8 CountDownToCarsAtStart;
static int32 MaxNumberOfCarsInUse;
static uint32 LastTimeLawEnforcerCreated;
static uint32 LastTimeFireTruckCreated;
static uint32 LastTimeAmbulanceCreated;
static int32 TotalNumOfCarsOfRating[TOTAL_CUSTOM_CLASSES];
static int32 CarArrays[TOTAL_CUSTOM_CLASSES][MAX_CAR_MODELS_IN_ARRAY];
2020-05-07 20:21:36 +00:00
static int32 NumRequestsOfCarRating[TOTAL_CUSTOM_CLASSES];
2020-05-08 08:11:09 +00:00
static int32 NumOfLoadedCarsOfRating[TOTAL_CUSTOM_CLASSES];
static int32 CarFreqArrays[TOTAL_CUSTOM_CLASSES][MAX_CAR_MODELS_IN_ARRAY];
static int32 LoadedCarsArray[TOTAL_CUSTOM_CLASSES][MAX_CAR_MODELS_IN_ARRAY];
2019-05-18 10:39:39 +00:00
};
2019-08-11 17:11:54 +00:00
2020-04-17 05:54:14 +00:00
extern CVehicle* apCarsToKeep[MAX_CARS_TO_KEEP];