Skip to content

Commit 2b93407

Browse files
committed
WIP -- track team data stat
1 parent 246de1e commit 2b93407

7 files changed

Lines changed: 489 additions & 1 deletion

File tree

common/ComputationalTools.h

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
#ifndef COMPUTATIONAL_TOOLS
2+
#define COMPUTATIONAL_TOOLS
3+
4+
#include <minmax.h>
5+
6+
template <typename T, int N>
7+
class MovingAverage
8+
{
9+
enum { val = (N >= 1) & !(N & (N - 1)) };
10+
static_assert(val, "The Sample size template parameter should be a power of 2");
11+
12+
public:
13+
MovingAverage() : num_samples_(0), total_(0) {}
14+
15+
void Reset()
16+
{
17+
num_samples_ = 0;
18+
total_ = 0;
19+
}
20+
21+
void AddNumber( T sample )
22+
{
23+
if (num_samples_ < N)
24+
{
25+
samples_[num_samples_++] = sample;
26+
total_ += sample;
27+
} else {
28+
T& oldest = samples_[num_samples_++ % N];
29+
total_ += sample - oldest;
30+
oldest = sample;
31+
}
32+
}
33+
34+
operator double() const { return total_ / min(num_samples_, N); }
35+
36+
private:
37+
T samples_[N];
38+
int num_samples_;
39+
T total_;
40+
};
41+
#endif

sizzlinglib/timedeventmgr.cpp

Lines changed: 153 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,153 @@
1+
//========= Copyright © 1996-2005, Valve Corporation, All rights reserved. ============//
2+
//
3+
// Purpose:
4+
//
5+
//=============================================================================//
6+
7+
#include "edict.h"
8+
#include "timedeventmgr.h"
9+
#include "tier0/vprof.h"
10+
11+
// memdbgon must be the last include file in a .cpp file!!!
12+
#include "tier0/memdbgon.h"
13+
14+
extern CGlobalVars *gpGlobals;
15+
16+
// ------------------------------------------------------------------------------------------ //
17+
// CEventRegister.
18+
// ------------------------------------------------------------------------------------------ //
19+
20+
CEventRegister::CEventRegister()
21+
{
22+
m_bRegistered = false;
23+
m_pEventMgr = NULL;
24+
}
25+
26+
27+
CEventRegister::~CEventRegister()
28+
{
29+
Term();
30+
}
31+
32+
33+
void CEventRegister::Init( CTimedEventMgr *pMgr, IEventRegisterCallback *pCallback )
34+
{
35+
Term();
36+
m_pEventMgr = pMgr;
37+
m_pCallback = pCallback;
38+
}
39+
40+
41+
void CEventRegister::Term()
42+
{
43+
// Unregister.
44+
if ( m_pEventMgr && m_bRegistered )
45+
{
46+
m_pEventMgr->RemoveEvent( this );
47+
}
48+
}
49+
50+
51+
void CEventRegister::SetUpdateInterval( float interval )
52+
{
53+
Assert( m_pEventMgr );
54+
55+
if ( m_pEventMgr )
56+
{
57+
// Register for this event.
58+
m_flUpdateInterval = interval;
59+
m_flNextEventTime = gpGlobals->curtime + m_flUpdateInterval;
60+
61+
m_pEventMgr->RegisterForNextEvent( this );
62+
}
63+
}
64+
65+
66+
void CEventRegister::StopUpdates()
67+
{
68+
if ( m_pEventMgr )
69+
{
70+
// Unregister our next event.
71+
m_pEventMgr->RemoveEvent( this );
72+
}
73+
}
74+
75+
76+
void CEventRegister::Reregister()
77+
{
78+
if ( m_flUpdateInterval > 1e-6 && m_pEventMgr )
79+
{
80+
while ( m_flNextEventTime <= gpGlobals->curtime )
81+
{
82+
m_flNextEventTime += m_flUpdateInterval;
83+
}
84+
85+
m_pEventMgr->RegisterForNextEvent( this );
86+
}
87+
}
88+
89+
90+
// ------------------------------------------------------------------------------------------ //
91+
// CTimedEventMgr.
92+
// ------------------------------------------------------------------------------------------ //
93+
94+
bool TimedEventMgr_LessFunc( CEventRegister* const &a, CEventRegister* const &b )
95+
{
96+
return a->m_flNextEventTime > b->m_flNextEventTime;
97+
}
98+
99+
100+
CTimedEventMgr::CTimedEventMgr()
101+
{
102+
m_Events.SetLessFunc( TimedEventMgr_LessFunc );
103+
}
104+
105+
106+
void CTimedEventMgr::FireEvents()
107+
{
108+
VPROF( "CTimedEventMgr::FireEvents" );
109+
while ( m_Events.Count() )
110+
{
111+
// Fire the top element, then break out.
112+
CEventRegister *pEvent = m_Events.ElementAtHead();
113+
if ( gpGlobals->curtime >= pEvent->m_flNextEventTime )
114+
{
115+
// Reregister for the timed event, then fire the callback for the event.
116+
m_Events.RemoveAtHead();
117+
pEvent->m_bRegistered = false;
118+
pEvent->Reregister();
119+
120+
pEvent->m_pCallback->FireEvent();
121+
}
122+
else
123+
{
124+
break;
125+
}
126+
}
127+
}
128+
129+
130+
void CTimedEventMgr::RegisterForNextEvent( CEventRegister *pEvent )
131+
{
132+
RemoveEvent( pEvent );
133+
m_Events.Insert( pEvent );
134+
pEvent->m_bRegistered = true;
135+
}
136+
137+
138+
void CTimedEventMgr::RemoveEvent( CEventRegister *pEvent )
139+
{
140+
if ( pEvent->m_bRegistered )
141+
{
142+
// Find the event in the list and remove it.
143+
int cnt = m_Events.Count();
144+
for ( int i=0; i < cnt; i++ )
145+
{
146+
if ( m_Events.Element( i ) == pEvent )
147+
{
148+
m_Events.RemoveAt( i );
149+
break;
150+
}
151+
}
152+
}
153+
}

sizzlingstats/SSTeamData.cpp

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
2+
#include "SSTeamData.h"
3+
4+
tfteam to_tfteam( int teamid )
5+
{
6+
7+
switch (teamid) {
8+
TFTEAM_SPECTATOR:
9+
return TFTEAM_SPECTATOR;
10+
TFTEAM_RED:
11+
return TFTEAM_RED;
12+
TFTEAM_BLUE:
13+
return TFTEAM_BLUE;
14+
default:
15+
return TFTEAM_UNASSIGNED;
16+
}
17+
}
18+
19+
void TeamScoreData::Reset()
20+
{
21+
m_AverageMedicDistance.Reset();
22+
}
23+
24+
CTeamDataManager::CTeamDataManager()
25+
{
26+
27+
}
28+
29+
CTeamDataManager::~CTeamDataManager()
30+
{
31+
}
32+
33+
void CTeamDataManager::Reset()
34+
{
35+
TeamScoreData *tm_data = nullptr;
36+
37+
if ((tm_data = GetTeamStats(TFTEAM_RED)) != nullptr)
38+
{
39+
tm_data->Reset();
40+
}
41+
42+
if ((tm_data = GetTeamStats(TFTEAM_BLUE)) != nullptr)
43+
{
44+
tm_data->Reset();
45+
}
46+
47+
}
48+
49+
void CTeamDataManager::ResetTeamStatsData()
50+
{
51+
}
52+
53+
void CTeamDataManager::AddStatSample( tfteam team, TeamStat stat, float sample_point )
54+
{
55+
56+
if (stat == TeamStat::MedicCohesion)
57+
{
58+
TeamScoreData *team_data = GetTeamStats(team);
59+
if (!team_data)
60+
return;
61+
62+
team_data->m_AverageMedicDistance.AddNumber(sample_point);
63+
}
64+
}
65+
66+
double CTeamDataManager::GetStat( tfteam team, TeamStat stat )
67+
{
68+
if (stat == TeamStat::MedicCohesion)
69+
{
70+
TeamScoreData *team_data = GetTeamStats(team);
71+
if (!team_data)
72+
return 0.0;
73+
return team_data->m_AverageMedicDistance;
74+
}
75+
76+
return 0.0;
77+
}
78+
79+
80+
TeamScoreData *CTeamDataManager::GetTeamStats( tfteam team )
81+
{
82+
switch (team)
83+
{
84+
case TFTEAM_RED:
85+
return &m_TeamScoreData[0];
86+
case TFTEAM_BLUE:
87+
return &m_TeamScoreData[1];
88+
default:
89+
return nullptr;
90+
}
91+
}
92+

sizzlingstats/SSTeamData.h

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
#ifndef SS_TEAM_DATA
2+
#define SS_TEAM_DATA
3+
4+
#include "ComputationalTools.h"
5+
6+
class CSizzPluginContext;
7+
/**
8+
* Maintains the round statistics for the team as a whole.
9+
*/
10+
11+
12+
struct TeamScoreData
13+
{
14+
MovingAverage<double, 64> m_AverageMedicDistance;
15+
void Reset();
16+
};
17+
18+
enum tfteam
19+
{
20+
TFTEAM_UNASSIGNED = 0,
21+
TFTEAM_SPECTATOR = 1,
22+
TFTEAM_RED = 2,
23+
TFTEAM_BLUE = 3
24+
};
25+
26+
enum class TeamStat
27+
{
28+
MedicCohesion
29+
};
30+
31+
32+
tfteam to_tfteam( int );
33+
34+
class CTeamDataManager
35+
{
36+
public:
37+
CTeamDataManager();
38+
~CTeamDataManager();
39+
40+
void AddStatSample( tfteam team, TeamStat stat, float sample_point );
41+
double GetStat( tfteam team, TeamStat stat );
42+
43+
void ResetTeamStatsData();
44+
void Reset();
45+
46+
private:
47+
TeamScoreData *GetTeamStats( tfteam team );
48+
TeamScoreData m_TeamScoreData[2];
49+
};
50+
51+
52+
53+
#endif

0 commit comments

Comments
 (0)