Modified source engine (2017) developed by valve and leaked in 2020. Not for commercial purporses
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

110 lines
2.4 KiB

5 years ago
//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
// $NoKeywords: $
//=============================================================================//
#ifndef COUNTDOWN_ANNOUNCER_H
#define COUNTDOWN_ANNOUNCER_H
#ifdef _WIN32
#pragma once
#endif
#include "mathlib/mathlib.h"
#include "tf/tf_gamerules.h"
//=============================================================================
class CCountdownAnnouncer
{
public:
struct TimeSounds {
const char *at60;
const char *at30;
const char *at10;
const char *at5;
const char *at4;
const char *at3;
const char *at2;
const char *at1;
};
CCountdownAnnouncer(const TimeSounds *pTimeSounds)
: m_state( Disabled )
, m_pTimeSounds( pTimeSounds )
, m_fTimeRemain( 0 )
, m_iPrevSecondsRemain( 0 )
{}
void Disable() { m_state = Disabled; }
void Start( int durationSec )
{
if ( m_state == Running )
return;
m_state = Running;
m_fTimeRemain = (float) durationSec;
m_iPrevSecondsRemain = 1 + (int) m_fTimeRemain;
Tick( 0 );
}
// returns true once when time expires
bool Tick( float delta )
{
assert( delta >= 0 );
switch ( m_state )
{
case Disabled:
case Expired:
break;
case Running:
{
m_fTimeRemain = MAX( 0, m_fTimeRemain - delta );
const int iSecondsRemain = Ceil2Int( m_fTimeRemain );
if ( iSecondsRemain == m_iPrevSecondsRemain )
break;
m_iPrevSecondsRemain = iSecondsRemain;
switch( iSecondsRemain )
{
case 60: BroadcastSound( m_pTimeSounds->at60 ); break;
case 30: BroadcastSound( m_pTimeSounds->at30 ); break;
case 10: BroadcastSound( m_pTimeSounds->at10 ); break;
case 5: BroadcastSound( m_pTimeSounds->at5 ); break;
case 4: BroadcastSound( m_pTimeSounds->at4 ); break;
case 3: BroadcastSound( m_pTimeSounds->at3 ); break;
case 2: BroadcastSound( m_pTimeSounds->at2 ); break;
case 1: BroadcastSound( m_pTimeSounds->at1 ); break;
default: break;
}
if ( iSecondsRemain == 0 )
{
Disable();
return true;
}
break;
}
}
return false;
}
bool IsDisabled() const { return m_state == Disabled; }
private:
void BroadcastSound( const char* name )
{
if ( name && *name )
TFGameRules()->BroadcastSound( 255, name );
}
enum State { Disabled, Running, Expired };
State m_state;
const TimeSounds *m_pTimeSounds;
float m_fTimeRemain;
int m_iPrevSecondsRemain;
};
#endif // COUNTDOWN_ANNOUNCER_H