170 lines
3.2 KiB
C++
170 lines
3.2 KiB
C++
|
//===== Copyright <20> 1996-2009, Valve Corporation, All rights reserved. ======//
|
|||
|
//
|
|||
|
// Purpose:
|
|||
|
//
|
|||
|
//===========================================================================//
|
|||
|
|
|||
|
|
|||
|
#include "game.h"
|
|||
|
#include "gamemanager.h"
|
|||
|
#include "matchsystem.h"
|
|||
|
#include "playermanager.h"
|
|||
|
#include "matchmaking.h"
|
|||
|
|
|||
|
// NOTE: This has to be the last file included!
|
|||
|
#include "tier0/memdbgon.h"
|
|||
|
|
|||
|
|
|||
|
CMatchGame::CMatchGame()
|
|||
|
{
|
|||
|
}
|
|||
|
|
|||
|
CMatchGame::~CMatchGame()
|
|||
|
{
|
|||
|
}
|
|||
|
|
|||
|
void CMatchGame::Reset()
|
|||
|
{
|
|||
|
RemoveAllPlayers();
|
|||
|
}
|
|||
|
|
|||
|
XNKID CMatchGame::GetXNKID()
|
|||
|
{
|
|||
|
return (XNKID) g_pMatchmaking->GetSessionXNKID();
|
|||
|
}
|
|||
|
|
|||
|
int CMatchGame::GetNumPlayers()
|
|||
|
{
|
|||
|
return m_PlayerList.Count();
|
|||
|
}
|
|||
|
|
|||
|
IPlayer * CMatchGame::GetPlayer( int index )
|
|||
|
{
|
|||
|
if ( m_PlayerList.IsValidIndex( index ) )
|
|||
|
return m_PlayerList[index];
|
|||
|
else
|
|||
|
return NULL;
|
|||
|
}
|
|||
|
|
|||
|
void CMatchGame::AddPlayer( XUID xuid, int pExperience[ MATCH_MAX_DIFFICULTIES ] /*= NULL*/, int pSkills[ MATCH_MAX_DIFFICULTIES ][ MATCH_MAX_SKILL_FIELDS ] /*= NULL*/ )
|
|||
|
{
|
|||
|
if ( MM_IsDebug() )
|
|||
|
{
|
|||
|
Msg( "[L4DMM] CMatchGame::AddPlayer( %llx )\n", xuid );
|
|||
|
}
|
|||
|
|
|||
|
IPlayer * player = g_pPlayerManager->FindPlayer( xuid );
|
|||
|
if ( !player )
|
|||
|
{
|
|||
|
Warning( "[L4DMM] CMatchGame::AddPlayer - Cannot find player by %llx!\n", xuid );
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
// Find a player first
|
|||
|
for ( int k = 0; k < m_PlayerList.Count(); ++ k )
|
|||
|
{
|
|||
|
if( m_PlayerList[k]->GetXUID() == xuid )
|
|||
|
{
|
|||
|
Warning( "[L4DMM] CMatchGame::AddPlayer - player %llx already added!\n", xuid );
|
|||
|
return;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
m_PlayerList.AddToTail( player );
|
|||
|
}
|
|||
|
|
|||
|
void CMatchGame::RemovePlayer( XUID xuid )
|
|||
|
{
|
|||
|
if ( MM_IsDebug() )
|
|||
|
{
|
|||
|
Msg( "[L4DMM] CMatchGame::RemovePlayer( %llx )\n", xuid );
|
|||
|
}
|
|||
|
|
|||
|
int numRemoved = 0;
|
|||
|
for ( int k = 0; k < m_PlayerList.Count(); ++ k )
|
|||
|
{
|
|||
|
if( m_PlayerList[k]->GetXUID() == xuid )
|
|||
|
{
|
|||
|
m_PlayerList.Remove( k );
|
|||
|
++ numRemoved;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if ( !numRemoved )
|
|||
|
{
|
|||
|
Warning( "[L4DMM] CMatchGame::RemovePlayer - Cannot find player by %llx!\n", xuid );
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
void CMatchGame::RemoveAllPlayers( )
|
|||
|
{
|
|||
|
if ( MM_IsDebug() )
|
|||
|
{
|
|||
|
Msg( "[L4DMM] CMatchGame::RemoveAllPlayers\n" );
|
|||
|
}
|
|||
|
|
|||
|
m_PlayerList.RemoveAll();
|
|||
|
}
|
|||
|
|
|||
|
int CMatchGame::GetAggregateExperience( )
|
|||
|
{
|
|||
|
int difficulty = 1; // CMatchSystem::GetMatchSystem()->GetManager()->GameGetDifficulty();
|
|||
|
|
|||
|
double exp = 0;
|
|||
|
int numExp = 0;
|
|||
|
|
|||
|
int numPlayers = m_PlayerList.Count();
|
|||
|
|
|||
|
for( int index = 0; index < numPlayers; ++index )
|
|||
|
{
|
|||
|
IPlayer * player = GetPlayer( index );
|
|||
|
if( player )
|
|||
|
{
|
|||
|
// TODO: exp += player->GetExperience( difficulty );
|
|||
|
++ numExp;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if( numExp )
|
|||
|
exp /= numExp;
|
|||
|
|
|||
|
if ( MM_IsDebug() >= 2 )
|
|||
|
{
|
|||
|
Msg( "[L4DMM] Game aggregate experience on difficulty%d = %f out of %d exp players.\n", difficulty, exp, numExp );
|
|||
|
}
|
|||
|
|
|||
|
return exp;
|
|||
|
}
|
|||
|
|
|||
|
int CMatchGame::GetAggregateSkill( int iSkillType )
|
|||
|
{
|
|||
|
int difficulty = 1; // CMatchSystem::GetMatchSystem()->GetManager()->GameGetDifficulty();
|
|||
|
|
|||
|
double skill = 0;
|
|||
|
int numSkills = 0;
|
|||
|
|
|||
|
int numPlayers = m_PlayerList.Count();
|
|||
|
|
|||
|
for( int index = 0; index < numPlayers; ++index )
|
|||
|
{
|
|||
|
IPlayer * player = GetPlayer( index );
|
|||
|
if( player )
|
|||
|
{
|
|||
|
// TODO: skill += player->GetSkill( iSkillType, difficulty );
|
|||
|
++ numSkills;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if( numSkills )
|
|||
|
skill /= numSkills;
|
|||
|
|
|||
|
if ( MM_IsDebug() >= 2 )
|
|||
|
{
|
|||
|
Msg( "[L4DMM] Game aggregate skill%d on difficulty%d = %f out of %d skill players.\n", iSkillType, difficulty, skill, numSkills );
|
|||
|
}
|
|||
|
|
|||
|
return skill;
|
|||
|
}
|
|||
|
|
|||
|
|