summaryrefslogtreecommitdiffstats
path: root/src/core/ZoneCull.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/ZoneCull.h')
-rw-r--r--src/core/ZoneCull.h94
1 files changed, 94 insertions, 0 deletions
diff --git a/src/core/ZoneCull.h b/src/core/ZoneCull.h
new file mode 100644
index 00000000..5b04b4f9
--- /dev/null
+++ b/src/core/ZoneCull.h
@@ -0,0 +1,94 @@
+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 ResolveVisibilities(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; }
+};