summaryrefslogtreecommitdiffstats
path: root/src/peds/PedAttractor.h
blob: c55e40285e98098af2a64361fabb975a8ef40225 (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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
#pragma once
#include "common.h"
#include <vector>

#include "2dEffect.h"
#include "Ped.h"

#define NUM_ATTRACTORS_FOR_ICECREAM_VAN 4

class CPedAttractor;

class CVehicleToEffect
{
	CVehicle* m_pVehicle;
	C2dEffect m_effects[NUM_ATTRACTORS_FOR_ICECREAM_VAN];

public:
	CVehicleToEffect(CVehicle* pVehicle);
	const C2dEffect* ChooseEffect(const CVector& pos) const;
	CVehicleToEffect& From(const CVehicleToEffect& other);
	CVehicleToEffect& operator=(const CVehicleToEffect& other) { return From(other); }
	~CVehicleToEffect() { m_pVehicle = nil; }
	CVehicle* GetVehicle() const { return m_pVehicle; }
	bool HasThisEffect(C2dEffect* pEffect) const;
	const C2dEffect* GetEffect(int32 i) const { return &m_effects[i]; }
};

class CPedAttractorManager
{
	std::vector<CPedAttractor*> vAtmAttractors;
	std::vector<CPedAttractor*> vSeatAttractors;
	std::vector<CPedAttractor*> vStopAttractors;
	std::vector<CPedAttractor*> vPizzaAttractors;
	std::vector<CPedAttractor*> vShelterAttractors;
	std::vector<CPedAttractor*> vIceCreamAttractors;
	std::vector<CVehicleToEffect> vVehicleToEffect;

public:
	CPedAttractor* RegisterPedWithAttractor(CPed* pPed, C2dEffect* pEffect, const CMatrix& matrix);
	CPedAttractor* RegisterPed(CPed* pPed, C2dEffect* pEffect, const CMatrix& matrix, std::vector<CPedAttractor*>& vecAttractors);
	bool BroadcastArrival(CPed* pPed, CPedAttractor* pAttractor);
	bool BroadcastArrival(CPed* pPed, CPedAttractor* pAttractor, std::vector<CPedAttractor*>& vecAttractors);
	const C2dEffect* GetEffectForIceCreamVan(CVehicle* pVehicle, const CVector& pos);
	bool IsApproachable(C2dEffect* pEffect, const CMatrix& matrix, int32, CPed* pPed);
	void RemoveIceCreamVanEffects(C2dEffect* pEffect);
	bool HasEmptySlot(const C2dEffect* pEffect);
	const CPedAttractor* FindAssociatedAttractor(const C2dEffect* pEffect, std::vector<CPedAttractor*>& vecAttractors);
	bool IsInQueue(CPed* pPed, CPedAttractor* pAttractor);
	bool IsInQueue(CPed* pPed, CPedAttractor* pAttractor, std::vector<CPedAttractor*>& vecAttractors);
	bool IsAtHeadOfQueue(CPed* pPed, CPedAttractor* pAttractor);
	bool IsAtHeadOfQueue(CPed* pPed, CPedAttractor* pAttractor, std::vector<CPedAttractor*>& vecAttractors);
	bool BroadcastDeparture(CPed* pPed, CPedAttractor* pAttractor);
	bool BroadcastDeparture(CPed* pPed, CPedAttractor* pAttractor, std::vector<CPedAttractor*>& vecAttractors);
	bool DeRegisterPed(CPed* pPed, CPedAttractor* pAttractor);
	bool DeRegisterPed(CPed* pPed, CPedAttractor* pAttractor, std::vector<CPedAttractor*>& vecAttractors);
	bool IsPedRegisteredWithEffect(CPed* pPed);
	bool IsPedRegistered(CPed* pPed, std::vector<CPedAttractor*>& vecAttractors);
	CVehicle* GetIceCreamVanForEffect(C2dEffect* pEffect);

	static void ComputeEffectPos(const C2dEffect* pEffect, const CMatrix& matrix, CVector& pos);
	static void ComputeEffectQueueDir(const C2dEffect* pEffect, const CMatrix& matrix, CVector& pos);
	static void ComputeEffectUseDir(const C2dEffect* pEffect, const CMatrix& matrix, CVector& pos);

};

CPedAttractorManager* GetPedAttractorManager();

enum ePedAttractorType
{
	ATTRACTOR_ATM = 0,
	ATTRACTOR_SEAT,
	ATTRACTOR_STOP,
	ATTRACTOR_PIZZA,
	ATTRACTOR_SHELTER,
	ATTRACTOR_ICECREAM
};

class CPedAttractor
{
protected:
	C2dEffect* p2dEffect;
	std::vector<CPed*> vApproachingQueue;
	std::vector<CPed*> vWaitingQueue;
	int32 m_nMaxPedsInAttractor;
	float m_fQueueDistance;
	float m_fTimeInWaitQueue;
	float m_fTimeInApproachingQueue;
	float m_fDistanceToUseAttractor;
	float m_fAcceptableHeading;
	float m_fMaxPositionDisplacement;
	float m_fMaxHeadingDisplacement;
	CVector vecEffectPos;
	CVector vecQueueDir;
	CVector vecUseDir;

public:
	virtual float GetHeadOfQueueWaitTime() { return 0.0f; }
	virtual ~CPedAttractor() {};
	virtual ePedAttractorType GetType() const = 0;
	virtual void UpdatePedStateOnDeparture(CPed* pPed) const = 0;
	virtual bool IsAtHeadOfQueue(CPed* pPed) const { return vWaitingQueue.front() == pPed; }
	virtual void ComputeAttractPos(int32 id, CVector& pos) const;
	virtual void ComputeAttractHeading(int32 id, float& pHeading) const;
	virtual bool BroadcastDeparture(CPed* pPed);

	bool IsRegisteredWithPed(CPed* pPed) const;
	bool DeRegisterPed(CPed* pPed);
	float ComputeDeltaHeading() const;
	float ComputeDeltaPos() const;
	void ComputeAttractTime(int32 id, bool, float& time) const;
	int32 GetNoOfRegisteredPeds() const { return (int32)(vWaitingQueue.size() + vApproachingQueue.size()); }
	int32 ComputeFreeSlot() const { return (int32)vWaitingQueue.size(); }
	bool IsInQueue(CPed*) const;
	bool RegisterPed(CPed*);
	bool BroadcastArrival(CPed*);

	CPedAttractor(C2dEffect* pEffect, const CMatrix& matrix, int32 maxpeds, float qdist, float waitTime, float approachTime, float distance, float headingdiff, float posdisp, float headdisp);

	C2dEffect* GetEffect() const { return p2dEffect; }
	const CVector& GetEffectPos() const { return vecEffectPos; }
	int32 GetMaxPedsInAttractor() const { return m_nMaxPedsInAttractor; }
	float GetDistanceToCountSeekDone() const { return m_fDistanceToUseAttractor; }
	float GetAcceptableHeading() const { return m_fAcceptableHeading; }
};

class CPedAtmAttractor : public CPedAttractor
{
public:
	virtual ePedAttractorType GetType() const { return ATTRACTOR_ATM; };
	virtual void UpdatePedStateOnDeparture(CPed* pPed) const;
	CPedAtmAttractor(C2dEffect* pEffect, const CMatrix& matrix, int32 maxpeds, float qdist, float waitTime, float approachTime, float distance, float headingdiff, float posdisp, float headdisp) :
		CPedAttractor(pEffect, matrix, maxpeds, qdist, waitTime, approachTime, distance, headingdiff, posdisp, headdisp)
	{};
};

class CPedIceCreamAttractor : public CPedAttractor
{
public:
	virtual ~CPedIceCreamAttractor() { GetPedAttractorManager()->RemoveIceCreamVanEffects(p2dEffect); }
	virtual ePedAttractorType GetType() const { return ATTRACTOR_ICECREAM; }
	virtual void UpdatePedStateOnDeparture(CPed* pPed) const {};
	CPedIceCreamAttractor(C2dEffect* pEffect, const CMatrix& matrix, int32 maxpeds, float qdist, float waitTime, float approachTime, float distance, float headingdiff, float posdisp, float headdisp) :
		CPedAttractor(pEffect, matrix, maxpeds, qdist, waitTime, approachTime, distance, headingdiff, posdisp, headdisp)
	{};
};

class CPedPizzaAttractor : public CPedAttractor
{
public:
	virtual float GetHeadOfQueueWaitTime() { return 2000.0f; }
	virtual ePedAttractorType GetType() const { return ATTRACTOR_PIZZA; }
	virtual void UpdatePedStateOnDeparture(CPed* pPed) const;
	CPedPizzaAttractor(C2dEffect* pEffect, const CMatrix& matrix, int32 maxpeds, float qdist, float waitTime, float approachTime, float distance, float headingdiff, float posdisp, float headdisp) :
		CPedAttractor(pEffect, matrix, maxpeds, qdist, waitTime, approachTime, distance, headingdiff, posdisp, headdisp)
	{};
};

class CPedSeatAttractor : public CPedAttractor
{
public:
	virtual ePedAttractorType GetType() const { return ATTRACTOR_SEAT; }
	virtual void UpdatePedStateOnDeparture(CPed* pPed) const {};
	CPedSeatAttractor(C2dEffect* pEffect, const CMatrix& matrix, int32 maxpeds, float qdist, float waitTime, float approachTime, float distance, float headingdiff, float posdisp, float headdisp) :
		CPedAttractor(pEffect, matrix, maxpeds, qdist, waitTime, approachTime, distance, headingdiff, posdisp, headdisp)
	{};
};

class CPedShelterAttractor : public CPedAttractor
{
	static std::vector<CVector> ms_displacements;
public:
	virtual ePedAttractorType GetType() const { return ATTRACTOR_SHELTER; }
	virtual bool BroadcastDeparture(CPed*);
	virtual void UpdatePedStateOnDeparture(CPed* pPed) const {};
	virtual bool IsAtHeadOfQueue(CPed* pPed) const { return true; }
	virtual void ComputeAttractPos(int qid, CVector& pos) const;
	virtual void ComputeAttractHeading(int qid, float& heading) const;

	CPedShelterAttractor(C2dEffect* pEffect, const CMatrix& matrix, int32 maxpeds, float qdist, float waitTime, float approachTime, float distance, float headingdiff, float posdisp, float headdisp) :
		CPedAttractor(pEffect, matrix, maxpeds, qdist, waitTime, approachTime, distance, headingdiff, posdisp, headdisp)
	{};


	CVector GetDisplacement(int32 qid) const;
};

class CPedStopAttractor : public CPedAttractor
{
public:
	virtual ePedAttractorType GetType() const { return ATTRACTOR_STOP; }
	virtual void UpdatePedStateOnDeparture(CPed* pPed) const {};

	CPedStopAttractor(C2dEffect* pEffect, const CMatrix& matrix, int32 maxpeds, float qdist, float waitTime, float approachTime, float distance, float headingdiff, float posdisp, float headdisp) :
		CPedAttractor(pEffect, matrix, maxpeds, qdist, waitTime, approachTime, distance, headingdiff, posdisp, headdisp)
	{};
};