summaryrefslogtreecommitdiff
path: root/game/server/tf2/info_act.h
blob: f946316276ad48cfa89ef68a52764838c64af0f5 (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
//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose: 
//
// $NoKeywords: $
//=============================================================================//

#ifndef INFO_ACT_H
#define INFO_ACT_H
#ifdef _WIN32
#pragma once
#endif

class CBaseTFPlayer;

//-----------------------------------------------------------------------------
// Purpose: Map entity that defines an act
//-----------------------------------------------------------------------------
class CInfoAct : public CBaseEntity
{
	DECLARE_CLASS( CInfoAct, CBaseEntity );
public:
	CInfoAct();

	DECLARE_DATADESC();
	DECLARE_SERVERCLASS();

	int UpdateTransmitState();

	void Spawn( void );
	void StartAct( void );
	void UpdateClient( CBaseTFPlayer *pPlayer );
	void FinishAct( void );
	void ActThink( void );
	int ActNumber() const;

	void CleanupOnActStart( void );

	bool IsAWaitingAct( void );

	// Act player locking
	void StartActOverlayTime( CBaseTFPlayer *pPlayer );
	void EndActOverlayTime( CBaseTFPlayer *pPlayer );
	void ActThinkEndActOverlayTime( void );

	// Intermissions
	void StartIntermission( CBaseTFPlayer *pPlayer );
	void EndIntermission( CBaseTFPlayer *pPlayer );

	int GetMCVTimer( void ) { return m_nRespawn2Team2Time; }

private:
	enum
	{
		RESPAWN_TIMER_90_REMAINING = 0,
		RESPAWN_TIMER_60_REMAINING,
		RESPAWN_TIMER_45_REMAINING,
		RESPAWN_TIMER_30_REMAINING,
		RESPAWN_TIMER_10_REMAINING,
		RESPAWN_TIMER_0_REMAINING,

		RESPAWN_TIMER_EVENT_COUNT
	};

	void SetUpRespawnTimers();
	void ShutdownRespawnTimers();

	// Inputs
	void InputStart( inputdata_t &inputdata );
	void InputFinishWinNone( inputdata_t &inputdata );
	void InputFinishWin1( inputdata_t &inputdata );
	void InputFinishWin2( inputdata_t &inputdata );
	void InputAddTime( inputdata_t &inputdata );

	// Respawn timers
	void RespawnTimerThink();

	// Respawn delay
	void Team1RespawnDelayThink();
	void Team2RespawnDelayThink();

	// Computes the time remaining
	int ComputeTimeRemaining( int nPeriod, int nDelay );

	// Fires respawn events
	void FireRespawnEvents( int nTimeRemaining, COutputEvent *pRespawnEvents, COutputInt &respawnTime );

	// Outputs
	COutputEvent	m_OnStarted;
	COutputEvent	m_OnFinishedTeamNone;
	COutputEvent	m_OnFinishedTeam1;
	COutputEvent	m_OnFinishedTeam2;
	COutputEvent	m_OnTimerExpired;

	COutputEvent	m_Team1RespawnDelayDone;
	COutputEvent	m_Team2RespawnDelayDone;

	COutputInt		m_Respawn1Team1TimeRemaining;
	COutputInt		m_Respawn2Team1TimeRemaining;
	COutputInt		m_Respawn1Team2TimeRemaining;
	COutputInt		m_Respawn2Team2TimeRemaining;

	// A whole buncha respawn timer events
	COutputEvent	m_Respawn1Team1Events[RESPAWN_TIMER_EVENT_COUNT];
	COutputEvent	m_Respawn2Team1Events[RESPAWN_TIMER_EVENT_COUNT];
	COutputEvent	m_Respawn1Team2Events[RESPAWN_TIMER_EVENT_COUNT];
	COutputEvent	m_Respawn2Team2Events[RESPAWN_TIMER_EVENT_COUNT];
	
	// Respawn timer periods
	CNetworkVar( int, m_nRespawn1Team1Time );
	CNetworkVar( int, m_nRespawn1Team2Time );
	CNetworkVar( int, m_nRespawn2Team1Time );
	CNetworkVar( int, m_nRespawn2Team2Time );
	CNetworkVar( int, m_nRespawnTeam1Delay );
	CNetworkVar( int, m_nRespawnTeam2Delay );

	// Data
	CNetworkVar( int, m_iActNumber );
	CNetworkVar( float, m_flActTimeLimit );
	int				m_iWinners;

	// Acts
	float			m_flActStartedAt;

	// Intermissions
	string_t		m_iszIntermissionCamera;
};

inline int CInfoAct::ActNumber() const
{
	return m_iActNumber;
}

extern CHandle<CInfoAct>	g_hCurrentAct;

bool CurrentActIsAWaitingAct( void );

#endif // INFO_ACT_H