class CCullZone { public: CVector position; float minx; float maxx; float miny; float maxy; float minz; float maxz; // TODO: figure these out: int32 m_indexStart; int16 unk2; int16 unk3; int16 unk4; int16 m_numBuildings; int16 m_numTreadablesPlus10m; int16 m_numTreadables; void DoStuffLeavingZone(void); static void DoStuffLeavingZone_OneBuilding(uint16 i); static void DoStuffLeavingZone_OneTreadableBoth(uint16 i); void DoStuffEnteringZone(void); static void DoStuffEnteringZone_OneBuilding(uint16 i); static void DoStuffEnteringZone_OneTreadablePlus10m(uint16 i); static void DoStuffEnteringZone_OneTreadable(uint16 i); }; enum eZoneAttribs { ATTRZONE_CAMCLOSEIN = 1, ATTRZONE_STAIRS = 2, ATTRZONE_1STPERSON = 4, ATTRZONE_NORAIN = 8, ATTRZONE_NOPOLICE = 0x10, ATTRZONE_NOTCULLZONE = 0x20, ATTRZONE_DOINEEDCOLLISION = 0x40, ATTRZONE_SUBWAYVISIBLE = 0x80, }; struct CAttributeZone { float minx; float maxx; float miny; float maxy; float minz; float maxz; int16 attributes; int16 wantedLevel; }; class CCullZones { public: static int32 &NumCullZones; static CCullZone *aZones; // [NUMCULLZONES]; static int32 &NumAttributeZones; static CAttributeZone *aAttributeZones; // [NUMATTRIBZONES]; static uint16 *aIndices; // [NUMZONEINDICES]; static int16 *aPointersToBigBuildingsForBuildings; // [NUMBUILDINGS]; static int16 *aPointersToBigBuildingsForTreadables; // [NUMTREADABLES]; static int32 &CurrentWantedLevelDrop_Player; static int32 &CurrentFlags_Camera; static int32 &CurrentFlags_Player; static int32 &OldCullZone; static int32 &EntityIndicesUsed; static bool &bCurrentSubwayIsInvisible; static bool &bCullZonesDisabled; static void Init(void); static void Update(void); static void ForceCullZoneCoors(CVector coors); static int32 FindCullZoneForCoors(CVector coors); static int32 FindAttributesForCoors(CVector coors, int32 *wantedLevel); static CAttributeZone *FindZoneWithStairsAttributeForPlayer(void); static void MarkSubwayAsInvisible(bool visible); static void AddCullZone(CVector const &position, float minx, float maxx, float miny, float maxy, float minz, float maxz, uint16 flag, int16 wantedLevel); static bool CamCloseInForPlayer(void) { return (CurrentFlags_Player & ATTRZONE_CAMCLOSEIN) != 0; } static bool CamStairsForPlayer(void) { return (CurrentFlags_Player & ATTRZONE_STAIRS) != 0; } static bool Cam1stPersonForPlayer(void) { return (CurrentFlags_Player & ATTRZONE_1STPERSON) != 0; } static bool NoPolice(void) { return (CurrentFlags_Player & ATTRZONE_NOPOLICE) != 0; } static bool DoINeedToLoadCollision(void) { return (CurrentFlags_Player & ATTRZONE_DOINEEDCOLLISION) != 0; } static bool PlayerNoRain(void) { return (CurrentFlags_Player & ATTRZONE_NORAIN) != 0; } static bool CamNoRain(void) { return (CurrentFlags_Camera & ATTRZONE_NORAIN) != 0; } static int32 GetWantedLevelDrop(void) { return CurrentWantedLevelDrop_Player; } };