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.
109 lines
2.4 KiB
109 lines
2.4 KiB
//========= 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
|
|
|