summaryrefslogtreecommitdiff
path: root/src/control/CarCtrl.h
diff options
context:
space:
mode:
authorclaude-bot <[email protected]>2026-07-13 12:27:07 +0000
committerclaude-bot <[email protected]>2026-07-13 12:27:07 +0000
commit9f61c9e6ac6b1ac5692cf6352d2ebbd47a31a686 (patch)
treea84756b82513739a2672db3a1f0ec579db6d18ff /src/control/CarCtrl.h
downloadre3-9f61c9e6ac6b1ac5692cf6352d2ebbd47a31a686.tar.gz
re3-9f61c9e6ac6b1ac5692cf6352d2ebbd47a31a686.zip
Import Cai1Hsu/re3 @ miami (reVC / GTA:VC decompilation)HEADmiami
Snapshot import (no upstream history) into git.ancap.in.ua/claude, per @lzcnt. Source: https://github.com/Cai1Hsu/re3 branch miami.
Diffstat (limited to 'src/control/CarCtrl.h')
-rw-r--r--src/control/CarCtrl.h174
1 files changed, 174 insertions, 0 deletions
diff --git a/src/control/CarCtrl.h b/src/control/CarCtrl.h
new file mode 100644
index 0000000..5efbe27
--- /dev/null
+++ b/src/control/CarCtrl.h
@@ -0,0 +1,174 @@
+#pragma once
+#include "PathFind.h"
+#include "Boat.h"
+#include "Vehicle.h"
+
+#define GAME_SPEED_TO_METERS_PER_SECOND 50.0f
+#define METERS_PER_SECOND_TO_GAME_SPEED (1.0f / GAME_SPEED_TO_METERS_PER_SECOND)
+#define GAME_SPEED_TO_CARAI_SPEED 60.0f
+#define TIME_COPS_WAIT_TO_EXIT_AFTER_STOPPING 2500
+
+class CZoneInfo;
+class CAutomobile;
+
+enum{
+ MAX_CARS_TO_KEEP = 2,
+ MAX_CAR_MODELS_IN_ARRAY = 25,
+};
+
+#ifdef FIX_BUGS
+#define FIX_PATHFIND_BUG
+#endif
+
+class CCarCtrl
+{
+public:
+ enum eCarClass {
+ NORMAL = 0,
+ POOR,
+ RICH,
+ EXEC,
+ WORKER,
+ BIG,
+ TAXI,
+ MOPED,
+ MOTORBIKE,
+
+ LEISUREBOAT,
+ WORKERBOAT,
+
+ COPS,
+ CUBAN,
+ HAITIAN,
+ STREET,
+ DIAZ,
+ BIKER,
+ SECURITY,
+ PLAYER,
+ GOLFERS,
+ GANG9,
+ COPS_BOAT,
+ FIRST_CAR_RATING = NORMAL,
+ FIRST_BOAT_RATING = LEISUREBOAT,
+ FIRST_GANG_CAR_RATING = CUBAN,
+ 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
+ };
+
+ static void SwitchVehicleToRealPhysics(CVehicle*);
+ static void AddToCarArray(int32 id, int32 vehclass);
+ static void UpdateCarCount(CVehicle*, bool);
+ static int32 ChooseCarModel(int32 vehclass);
+ static bool JoinCarWithRoadSystemGotoCoors(CVehicle*, CVector, bool);
+ static void JoinCarWithRoadSystem(CVehicle*);
+ static void UpdateCarOnRails(CVehicle*);
+ static bool MapCouldMoveInThisArea(float x, float y);
+ static void ScanForPedDanger(CVehicle *veh);
+ static void RemoveFromInterestingVehicleList(CVehicle*);
+ static void GenerateRandomCars(void);
+ static void GenerateOneRandomCar(void);
+ static void GenerateEmergencyServicesCar(void);
+ static int32 ChooseModel(CZoneInfo*, int*);
+ static int32 ChoosePoliceCarModel(void);
+ static int32 ChooseGangCarModel(int32 gang);
+ static void RemoveDistantCars(void);
+ static void PossiblyRemoveVehicle(CVehicle*);
+ static bool IsThisVehicleInteresting(CVehicle*);
+ static void RegisterVehicleOfInterest(CVehicle*);
+ static int32 CountCarsOfType(int32 mi);
+ static void SlowCarOnRailsDownForTrafficAndLights(CVehicle*);
+ static bool PickNextNodeAccordingStrategy(CVehicle*);
+ 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);
+ static void SlowCarDownForOtherCar(CEntity*, CVehicle*, float*, float);
+ static float TestCollisionBetween2MovingRects(CVehicle*, CVehicle*, float, float, CVector*, CVector*, uint8);
+ 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*);
+#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);
+ static void Init(void);
+ static void ReInit(void);
+ static float FindSpeedMultiplier(float, float, float, float);
+ static void SteerAICarWithPhysics(CVehicle*);
+ static void SteerAICarWithPhysics_OnlyMission(CVehicle*, float*, float*, float*, bool*);
+ 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 bool ThisRoadObjectCouldMove(int16);
+ static void ClearInterestingVehicleList();
+ static void FindLinksToGoWithTheseNodes(CVehicle*);
+ static bool GenerateOneEmergencyServicesCar(uint32, CVector);
+ static float FindSpeedMultiplierWithSpeedFromNodes(int8);
+ static int32 ChooseBoatModel(int32);
+ static int32 ChooseBoatRating(CZoneInfo* pZoneInfo);
+ static int32 ChooseCarRating(CZoneInfo* pZoneInfo);
+ static void AddToLoadedVehicleArray(int32 mi, int32 rating, int32 freq);
+ static void RemoveFromLoadedVehicleArray(int32 mi, int32 rating);
+ static int32 ChooseCarModelToLoad(int32 rating);
+ static bool BoatWithTallMast(int32 mi);
+ static void RemoveCarsIfThePoolGetsFull(void);
+ static void SteerAIBoatWithPhysicsHeadingForTarget(CVehicle*, float, float, float*, float*, float*);
+ static void SteerAIHeliTowardsTargetCoors(CAutomobile*);
+ static void SteerAIPlaneTowardsTargetCoors(CAutomobile*);
+ static void SteerAIBoatWithPhysicsAttackingPlayer(CVehicle*, float*, float*, float*, bool*);
+ static void SteerAICarBlockingPlayerForwardAndBack(CVehicle*, float*, float*, float*, bool*);
+
+ static float GetPositionAlongCurrentCurve(CVehicle* pVehicle)
+ {
+ uint32 timeInCurve = CTimer::GetTimeInMilliseconds() - pVehicle->AutoPilot.m_nTimeEnteredCurve;
+ return (float)timeInCurve / pVehicle->AutoPilot.m_nTimeToSpendOnCurrentCurve;
+ }
+
+ static float LimitRadianAngle(float angle)
+ {
+ while (angle < -PI)
+ angle += TWOPI;
+ while (angle > PI)
+ angle -= TWOPI;
+ return angle;
+ }
+
+ static bool bMadDriversCheat;
+ 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];
+
+ static int32 MiamiViceCycle;
+ static uint32 LastTimeMiamiViceGenerated;
+ static int32 NumRequestsOfCarRating[TOTAL_CUSTOM_CLASSES];
+ 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];
+};
+
+extern CVehicle* apCarsToKeep[MAX_CARS_TO_KEEP]; \ No newline at end of file