summaryrefslogtreecommitdiffstats
path: root/src/Zones.h
blob: bf3957de5d8747a3778a3f9adc6df892bba8310d (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
#pragma once

#include "Game.h"

enum eZoneType
{
	ZONE_AUDIO,
	ZONE_TYPE1,	// this should be NAVIG
	ZONE_TYPE2,	// this should be INFO...but all except MAPINFO get zoneinfo??
	ZONE_MAPZONE,
};

class CZone
{
public:
	char       name[8];
	float      minx;
	float      miny;
	float      minz;
	float      maxx;
	float      maxy;
	float      maxz;
	eZoneType  type;
	eLevelName level;
	int16      zoneinfoDay;
	int16      zoneinfoNight;
	CZone     *child;
	CZone     *parent;
	CZone     *next;

	wchar *GetTranslatedName(void);
};

class CZoneInfo
{
public:
	// Car data
	int16 carDensity;
	int16 carThreshold[6];
	int16 copThreshold;
	int16 gangThreshold[9];

	// Ped data
	uint16 pedDensity;
	uint16 copDensity;
	uint16 gangDensity[9];
	uint16 pedGroup;
};


class CTheZones
{
public:
	static eLevelName &m_CurrLevel;
	static CZone *&m_pPlayersZone;
	static int16 &FindIndex;

	static uint16 &NumberOfAudioZones;
	static int16 *AudioZoneArray;	//[NUMAUDIOZONES];
	static uint16 &TotalNumberOfMapZones;
	static uint16 &TotalNumberOfZones;
	static CZone *ZoneArray;	//[NUMZONES];
	static CZone *MapZoneArray;	//[NUMMAPZONES];
	static uint16 &TotalNumberOfZoneInfos;
	static CZoneInfo *ZoneInfoArray;	//[2*NUMZONES];

	static void Init(void);
	static void Update(void);
	static void CreateZone(char *name, eZoneType type,
	                       float minx, float miny, float minz,
	                       float maxx, float maxy, float maxz,
	                       eLevelName level);
	static void CreateMapZone(char *name, eZoneType type,
	                          float minx, float miny, float minz,
	                          float maxx, float maxy, float maxz,
	                          eLevelName level);
	static CZone *GetZone(uint16 i) { return &ZoneArray[i]; }
	static void PostZoneCreation(void);
	static void InsertZoneIntoZoneHierarchy(CZone *zone);
	static bool InsertZoneIntoZoneHierRecursive(CZone *z1, CZone *z2);
	static bool ZoneIsEntirelyContainedWithinOtherZone(CZone *z1, CZone *z2);
	static bool PointLiesWithinZone(const CVector &v, CZone *zone);
	static eLevelName GetLevelFromPosition(CVector const &v);
	static CZone *FindSmallestZonePosition(const CVector *v);
	static CZone *FindSmallestZonePositionType(const CVector *v, eZoneType type);
	static CZone *FindSmallestZonePositionILN(const CVector *v);
	static int16 FindZoneByLabelAndReturnIndex(char *name);
	static CZoneInfo *GetZoneInfo(const CVector *v, uint8 day);
	static void GetZoneInfoForTimeOfDay(const CVector *pos, CZoneInfo *info);
	static void SetZoneCarInfo(uint16 zoneid, uint8 day, int16 carDensity,
		int16 gang0Num, int16 gang1Num, int16 gang2Num,
		int16 gang3Num, int16 gang4Num, int16 gang5Num,
		int16 gang6Num, int16 gang7Num, int16 gang8Num,
		int16 copNum,
		int16 car0Num, int16 car1Num, int16 car2Num,
		int16 car3Num, int16 car4Num, int16 car5Num);
	static void SetZonePedInfo(uint16 zoneid, uint8 day, int16 pedDensity,
		int16 gang0Density, int16 gang1Density, int16 gang2Density, int16 gang3Density,
		int16 gang4Density, int16 gang5Density, int16 gang6Density, int16 gang7Density,
		int16 gang8Density, int16 copDensity);
	static void SetCarDensity(uint16 zoneid, uint8 day, uint16 cardensity);
	static void SetPedDensity(uint16 zoneid, uint8 day, uint16 peddensity);
	static void SetPedGroup(uint16 zoneid, uint8 day, uint16 pedgroup);
	static int16 FindAudioZone(CVector *pos);
	static eLevelName FindZoneForPoint(const CVector &pos);
	static CZone *GetPointerForZoneIndex(int32 i) { return i == -1 ? nil : &ZoneArray[i]; }
	static int32 GetIndexForZonePointer(CZone *zone) { return zone == nil ? -1 : zone - ZoneArray; }
	static void AddZoneToAudioZoneArray(CZone *zone);
	static void InitialiseAudioZoneArray(void);
	static void SaveAllZones(uint8 *buffer, uint32 *length);
	static void LoadAllZones(uint8 *buffer, uint32 length);
};