text: ﻿//========= Copyright Valve Corporation, All rights reserved. ============//
  //
  // Purpose: 
  //
  //=============================================================================
  
  #include "cbase.h"
  #include "gamestats.h"
  
  void BasicGameStatsRecord_t::Clear()
  {
  	m_nCount = 0;
  	m_nSeconds = 0;
  	m_nCommentary = 0;
  	m_nHDR = 0;
  	m_nCaptions = 0;
  	m_bSteam = true;
  	m_bCyberCafe = false;
  	Q_memset( m_nSkill, 0, sizeof( m_nSkill ) );
  	m_nDeaths = 0;
  }
  
  void BasicGameStatsRecord_t::SaveToBuffer( CUtlBuffer &buf )
  {
  	buf.PutInt( m_nCount );
  	buf.PutInt( m_nSeconds );
  	buf.PutInt( m_nCommentary );
  	buf.PutInt( m_nHDR );
  	buf.PutInt( m_nCaptions );
  	for ( int i = 0; i < 3; ++i )
  	{
  		buf.PutInt( m_nSkill[ i ] );
  	}
  
  	buf.PutChar( m_bSteam ? 1 : 0 );
  	buf.PutChar( m_bCyberCafe ? 1 : 0 );
  	buf.PutInt( m_nDeaths );
  }
  
  bool BasicGameStatsRecord_t::ParseFromBuffer( CUtlBuffer &buf, int iBufferStatsVersion )
  {
  	bool bret = true;
  	m_nCount = buf.GetInt();
  
  	if ( m_nCount > 100000 || m_nCount < 0 )
  	{
  		bret = false;
  	}
  
  	m_nSeconds = buf.GetInt();
  	// Note, don't put the buf.GetInt() in the macro since it'll get evaluated twice!!!
  	m_nSeconds = MAX( m_nSeconds, 0 );
  
  	m_nCommentary = buf.GetInt();
  	if ( m_nCommentary < 0 || m_nCommentary > 100000 )
  	{
  		bret = false;
  	}
  
  	m_nHDR = buf.GetInt();
  	if ( m_nHDR < 0 || m_nHDR > 100000 )
  	{
  		bret = false;
  	}
  
  	m_nCaptions = buf.GetInt();
  	if ( m_nCaptions < 0 || m_nCaptions > 100000 )
  	{
  		bret = false;
  	}
  
  	for ( int i = 0; i < 3; ++i )
  	{
  		m_nSkill[ i ] = buf.GetInt();
  		if ( m_nSkill[ i ] < 0 || m_nSkill[ i ]  > 100000 )
  		{
  			bret = false;
  		}
  	}
  
  	if ( iBufferStatsVersion > GAMESTATS_FILE_VERSION_OLD )
  	{
  		m_bSteam = buf.GetChar() ? true : false;
  	}
  	if ( iBufferStatsVersion > GAMESTATS_FILE_VERSION_OLD2 )
  	{
  		m_bCyberCafe = buf.GetChar() ? true : false;
  	}
  	if ( iBufferStatsVersion > GAMESTATS_FILE_VERSION_OLD5 )
  	{
  		m_nDeaths = buf.GetInt();
  	}
  
  	return bret;
  }
  
  void BasicGameStats_t::Clear()
  {
  	m_nSecondsToCompleteGame = 0;
  	m_Summary.Clear();
  	m_MapTotals.Purge();
  }
  
  void BasicGameStats_t::SaveToBuffer( CUtlBuffer& buf )
  {
  	buf.PutInt( m_nSecondsToCompleteGame );
  
  	m_Summary.SaveToBuffer( buf );
  
  	int c = m_MapTotals.Count();
  	buf.PutInt( c );
  	for ( int i = m_MapTotals.First(); i != m_MapTotals.InvalidIndex(); i = m_MapTotals.Next( i ) )
  	{
  		char const *name = m_MapTotals.GetElementName( i );
  		BasicGameStatsRecord_t &rec = m_MapTotals[ i ];
  
  		buf.PutString( name );
  		rec.SaveToBuffer( buf );
  	}
  
  	buf.PutChar( (char)m_nHL2ChaptureUnlocked );	
  	buf.PutChar( m_bSteam ? 1 : 0 );
  	buf.PutChar( m_bCyberCafe ? 1 : 0 );
  	buf.PutShort( (short)m_nDXLevel );
  }
  
  BasicGameStatsRecord_t *BasicGameStats_t::FindOrAddRecordForMap( char const *mapname )
  {
  	int idx = m_MapTotals.Find( mapname );
  	if ( idx == m_MapTotals.InvalidIndex() )
  	{
  		idx = m_MapTotals.Insert( mapname );
  	}
  
  	return &m_MapTotals[ idx ];
  }
  
  bool BasicGameStats_t::ParseFromBuffer( CUtlBuffer& buf, int iBufferStatsVersion )
  {
  	bool bret = true;
  
  	m_nSecondsToCompleteGame = buf.GetInt();
  	if ( m_nSecondsToCompleteGame < 0 || m_nSecondsToCompleteGame > 10000000 )
  	{
  		bret = false;
  	}
  
  	m_Summary.ParseFromBuffer( buf, iBufferStatsVersion );
  	int c = buf.GetInt();
  	if ( c > 1024 || c < 0 )
  	{
  		bret = false;
  	}
  
  	for ( int i = 0; i < c; ++i )
  	{
  		char mapname[ 256 ];
  		buf.GetString( mapname );
  
  		BasicGameStatsRecord_t *rec = FindOrAddRecordForMap( mapname );
  		bool valid= rec->ParseFromBuffer( buf, iBufferStatsVersion );
  		if ( !valid )
  		{
  			bret = false;
  		}
  	}
  
  	if ( iBufferStatsVersion >= GAMESTATS_FILE_VERSION_OLD2 )
  	{
  		m_nHL2ChaptureUnlocked = (int)buf.GetChar();	
  		m_bSteam = buf.GetChar() ? true : false;
  	}
  	if ( iBufferStatsVersion > GAMESTATS_FILE_VERSION_OLD2 )
  	{
  		m_bCyberCafe = buf.GetChar() ? true : false;
  	}
  	if ( iBufferStatsVersion > GAMESTATS_FILE_VERSION_OLD3 )
  	{
  		m_nDXLevel = (int)buf.GetShort();
  	}
  	return bret;
  }
  
  