summaryrefslogtreecommitdiffstats
path: root/src/control/Garages.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/control/Garages.h')
-rw-r--r--src/control/Garages.h114
1 files changed, 94 insertions, 20 deletions
diff --git a/src/control/Garages.h b/src/control/Garages.h
index 5e106ade..e39a81fa 100644
--- a/src/control/Garages.h
+++ b/src/control/Garages.h
@@ -1,6 +1,7 @@
#pragma once
#include "Automobile.h"
#include "audio_enums.h"
+#include "Camera.h"
#include "config.h"
class CVehicle;
@@ -63,34 +64,42 @@ class CStoredCar
int8 m_nVariationA;
int8 m_nVariationB;
int8 m_nCarBombType;
+public:
+ void Init() { m_nModelIndex = 0; }
+ CStoredCar(const CStoredCar& other);
+ void StoreCar(CVehicle*);
+ CVehicle* RestoreCar();
};
static_assert(sizeof(CStoredCar) == 0x28, "CStoredCar");
+#define SWITCH_GARAGE_DISTANCE_CLOSE 40.0f
+
class CGarage
{
public:
eGarageType m_eGarageType;
eGarageState m_eGarageState;
char field_2;
- char m_bClosingWithoutTargetCar;
- char m_bDeactivated;
- char m_bResprayHappened;
- char field_6;
- char field_7;
+ bool m_bClosingWithoutTargetCar;
+ bool m_bDeactivated;
+ bool m_bResprayHappened;
int m_nTargetModelIndex;
CEntity *m_pDoor1;
CEntity *m_pDoor2;
- char m_bDoor1PoolIndex;
- char m_bDoor2PoolIndex;
- char m_bIsDoor1Object;
- char m_bIsDoor2Object;
- char field_24;
- char m_bRotatedDoor;
- char m_bCameraFollowsPlayer;
- char field_27;
- CVector m_vecInf;
- CVector m_vecSup;
+ uint8 m_bDoor1PoolIndex;
+ uint8 m_bDoor2PoolIndex;
+ bool m_bDoor1IsDummy;
+ bool m_bDoor2IsDummy;
+ bool m_bRecreateDoorOnNextRefresh;
+ bool m_bRotatedDoor;
+ bool m_bCameraFollowsPlayer;
+ float m_fX1;
+ float m_fX2;
+ float m_fY1;
+ float m_fY2;
+ float m_fZ1;
+ float m_fZ2;
float m_fDoorPos;
float m_fDoorHeight;
float m_fDoor1X;
@@ -99,7 +108,7 @@ public:
float m_fDoor2Y;
float m_fDoor1Z;
float m_fDoor2Z;
- int m_nDoorOpenTime;
+ uint32 m_nTimeToStartAction;
char m_bCollectedCarsState;
char field_89;
char field_90;
@@ -112,6 +121,51 @@ public:
void CloseThisGarage();
bool IsOpen() { return m_eGarageState == GS_OPENED || m_eGarageState == GS_OPENEDCONTAINSCAR; }
bool IsClosed() { return m_eGarageState == GS_FULLYCLOSED; }
+ bool IsUsed() { return m_eGarageType != GARAGE_NONE; }
+ void Update();
+ float GetGarageCenterX() { return (m_fX1 + m_fX2) / 2; }
+ float GetGarageCenterY() { return (m_fY1 + m_fY2) / 2; }
+ bool IsClose()
+ {
+#ifdef FIX_BUGS
+ return Abs(TheCamera.GetPosition().x - GetGarageCenterX()) > SWITCH_GARAGE_DISTANCE_CLOSE ||
+ Abs(TheCamera.GetPosition().y - GetGarageCenterY()) > SWITCH_GARAGE_DISTANCE_CLOSE;
+#else
+ return Abs(TheCamera.GetPosition().x - m_fX1) > SWITCH_GARAGE_DISTANCE_CLOSE ||
+ Abs(TheCamera.GetPosition().y - m_fY1) > SWITCH_GARAGE_DISTANCE_CLOSE;
+#endif
+ }
+ void TidyUpGarageClose();
+ void TidyUpGarage();
+ void RefreshDoorPointers(bool);
+ void UpdateCrusherAngle();
+ void UpdateDoorsHeight();
+ bool IsEntityEntirelyInside3D(CEntity*, float);
+ bool IsEntityEntirelyOutside(CEntity*, float);
+ bool IsEntityEntirelyInside(CEntity*);
+ float CalcDistToGarageRectangleSquared(float, float);
+ float CalcSmallestDistToGarageDoorSquared(float, float);
+ bool IsAnyOtherCarTouchingGarage(CVehicle* pException);
+ bool IsStaticPlayerCarEntirelyInside();
+ bool IsPlayerOutsideGarage();
+ bool IsAnyCarBlockingDoor();
+ void CenterCarInGarage(CVehicle*);
+ bool DoesCraigNeedThisCar(int32);
+ void MarkThisCarAsCollectedForCraig(int32);
+ bool HasCraigCollectedThisCar(int32);
+ bool IsGarageEmpty();
+ void UpdateCrusherShake(float, float);
+ int32 CountCarsWithCenterPointWithinGarage(CEntity* pException);
+ void RemoveCarsBlockingDoorNotInside();
+ void StoreAndRemoveCarsForThisHideout(CStoredCar*, int32);
+ bool RestoreCarsForThisHideout(CStoredCar*);
+ bool IsEntityTouching3D(CEntity*);
+ bool EntityHasASphereWayOutsideGarage(CEntity*, float);
+ bool IsAnyOtherPedTouchingGarage(CPed* pException);
+ void BuildRotatedDoorMatrix(CEntity*, float);
+ void FindDoorsEntities();
+ void FindDoorsEntitiesSectorList(CPtrList&, bool);
+ void PlayerArrestedOrDied();
};
static_assert(sizeof(CGarage) == 140, "CGarage");
@@ -135,9 +189,19 @@ public:
static bool &PlayerInGarage;
static int32 &PoliceCarsCollected;
static uint32 &GarageToBeTidied;
- static CGarage(&Garages)[NUM_GARAGES];
-
+ static CGarage(&aGarages)[NUM_GARAGES];
+ static CStoredCar(&aCarsInSafeHouse1)[NUM_GARAGE_STORED_CARS];
+ static CStoredCar(&aCarsInSafeHouse2)[NUM_GARAGE_STORED_CARS];
+ static CStoredCar(&aCarsInSafeHouse3)[NUM_GARAGE_STORED_CARS];
+ static int32 &AudioEntity;
+ static bool &bCamShouldBeOutisde;
public:
+ static void Init(void);
+#ifndef PS2
+ static void Shutdown(void);
+#endif
+ static int16 AddOne(float X1, float Y1, float Z1, float X2, float Y2, float Z2, eGarageType type, int32 targetId);
+
static bool IsModelIndexADoor(uint32 id);
static void TriggerMessage(const char *text, int16, uint16 time, int16);
static void PrintMessages(void);
@@ -145,11 +209,10 @@ public:
static bool IsPointWithinHideOutGarage(CVector&);
static bool IsPointWithinAnyGarage(CVector&);
static void PlayerArrestedOrDied();
- static void Init(void);
+
static void Update(void);
static void Load(uint8 *buf, uint32 size);
static void Save(uint8 *buf, uint32 *size);
- static int16 AddOne(float, float, float, float, float, float, uint8, uint32);
static void SetTargetCarForMissonGarage(int16, CVehicle*);
static bool HasCarBeenDroppedOffYet(int16);
static void ActivateGarage(int16);
@@ -165,6 +228,17 @@ public:
static bool HasImportExportGarageCollectedThisCar(int16, int8);
static void SetLeaveCameraForThisGarage(int16);
static bool IsThisCarWithinGarageArea(int16, CEntity*);
+ static bool IsCarSprayable(CVehicle*);
+ static int32 FindMaxNumStoredCarsForGarage(eGarageType);
+ static int32 CountCarsInHideoutGarage(eGarageType);
+ static bool IsPointInAGarageCameraZone(CVector);
+ static bool CameraShouldBeOutside();
+ static void CloseHideOutGaragesBeforeSave();
+ static void SetAllDoorsBackToOriginalHeight();
+ static int GetBombTypeForGarageType(eGarageType type) { return type - GARAGE_BOMBSHOP1 + 1; }
static int GetCarsCollectedIndexForGarageType(eGarageType type) { return type - GARAGE_COLLECTCARS_1; }
+
+private:
+ static float FindDoorHeightForMI(int32);
};