Files
itgmania212121/stepmania/src/MenuTimer.cpp
T

164 lines
3.8 KiB
C++
Raw Normal View History

2003-02-16 04:01:45 +00:00
#include "global.h"
2002-05-27 08:23:27 +00:00
/*
-----------------------------------------------------------------------------
Class: MenuTimer
Desc: See header.
Copyright (c) 2001-2002 by the person(s) listed below. All rights reserved.
Chris Danford
-----------------------------------------------------------------------------
*/
#include "MenuTimer.h"
#include "RageUtil.h"
#include "GameConstantsAndTypes.h"
2002-07-23 01:41:40 +00:00
#include "PrefsManager.h"
2002-05-27 08:23:27 +00:00
#include "ScreenManager.h"
2002-07-11 19:02:26 +00:00
#include "AnnouncerManager.h"
#include "ThemeManager.h"
2002-12-29 22:54:55 +00:00
#include "Font.h"
2003-07-26 23:05:16 +00:00
#include "RageSounds.h"
2002-05-27 08:23:27 +00:00
2003-11-07 21:33:27 +00:00
#define WARNING_START THEME->GetMetricI("MenuTimer","WarningStart")
#define WARNING_BEEP_START THEME->GetMetricI("MenuTimer","WarningBeepStart")
#define WARNING_COMMAND(i) THEME->GetMetric ("MenuTimer", ssprintf("WarningCommand%i",i))
#define ON_COMMAND THEME->GetMetric ("MenuTimer","OnCommand")
static const int TIMER_SECONDS = 99;
static const int MAX_STALL_SECONDS = 30;
2002-05-27 08:23:27 +00:00
MenuTimer::MenuTimer()
{
2002-07-11 19:02:26 +00:00
m_fStallSeconds = 0;
m_fStallSecondsLeft = MAX_STALL_SECONDS;
2003-03-11 21:33:11 +00:00
m_bPaused = false;
2002-05-27 08:23:27 +00:00
m_textDigit1.LoadFromNumbers( THEME->GetPathToN("MenuTimer") );
m_textDigit2.LoadFromNumbers( THEME->GetPathToN("MenuTimer") );
2002-09-29 05:06:18 +00:00
2003-11-07 21:33:27 +00:00
const float fCharWidth = (float) m_textDigit1.m_pFont->GetLineWidthInSourcePixels(L"0");
m_textDigit1.SetX( -fCharWidth/2 );
m_textDigit2.SetX( +fCharWidth/2 );
2002-09-29 05:06:18 +00:00
this->AddChild( &m_textDigit1 );
this->AddChild( &m_textDigit2 );
2002-05-28 20:01:22 +00:00
2003-11-07 21:33:27 +00:00
SetSeconds( TIMER_SECONDS );
m_soundBeep.Load( THEME->GetPathToS("MenuTimer tick") );
2002-05-27 08:23:27 +00:00
}
2003-03-11 21:33:11 +00:00
void MenuTimer::EnableStealth( bool bStealth )
{
2003-03-11 21:33:11 +00:00
if( bStealth )
m_soundBeep.Unload(); // unload the sound
else
m_soundBeep.Load( THEME->GetPathToS("MenuTimer tick") ); // reload the sound
2003-11-07 21:33:27 +00:00
m_textDigit1.SetHidden( bStealth );
m_textDigit2.SetHidden( bStealth );
}
2002-05-27 08:23:27 +00:00
void MenuTimer::Update( float fDeltaTime )
{
ActorFrame::Update( fDeltaTime );
2003-03-11 21:33:11 +00:00
if( m_bPaused )
2002-07-11 19:02:26 +00:00
return;
2003-03-11 21:33:11 +00:00
// run down the stall time if any
2002-07-11 19:02:26 +00:00
if( m_fStallSeconds > 0 )
2003-11-07 21:33:27 +00:00
m_fStallSeconds = max( m_fStallSeconds - fDeltaTime, 0 );
if( m_fStallSeconds > 0 )
2002-07-11 19:02:26 +00:00
return;
2003-11-07 21:33:27 +00:00
const float fOldSecondsLeft = m_fSecondsLeft;
2003-03-11 21:33:11 +00:00
m_fSecondsLeft -= fDeltaTime;
CLAMP( m_fSecondsLeft, 0, 99 );
2003-11-07 21:33:27 +00:00
const float fNewSecondsLeft = m_fSecondsLeft;
2003-03-11 21:33:11 +00:00
2003-11-07 21:33:27 +00:00
const int iOldDisplay = (int)(fOldSecondsLeft + 0.99f);
const int iNewDisplay = (int)(fNewSecondsLeft + 0.99f);
2002-05-27 08:23:27 +00:00
2002-07-11 19:02:26 +00:00
if( fOldSecondsLeft > 5.5 && fNewSecondsLeft < 5.5 ) // transition to below 5.5
2003-07-26 23:05:16 +00:00
SOUND->PlayOnceFromDir( ANNOUNCER->GetPathTo("hurry up") );
2003-03-11 21:33:11 +00:00
2003-11-07 21:33:27 +00:00
if( iOldDisplay == iNewDisplay )
return;
SetText( iNewDisplay );
if( iNewDisplay <= WARNING_START )
2002-05-27 08:23:27 +00:00
{
2003-11-07 21:33:27 +00:00
m_textDigit1.Command( WARNING_COMMAND(iNewDisplay) );
m_textDigit2.Command( WARNING_COMMAND(iNewDisplay) );
2002-05-27 08:23:27 +00:00
}
2003-11-07 21:33:27 +00:00
if( iNewDisplay == 0 )
{
Stop();
SCREENMAN->PostMessageToTopScreen( SM_MenuTimer, 0 );
}
if( iNewDisplay <= WARNING_BEEP_START )
m_soundBeep.Play();
2002-05-27 08:23:27 +00:00
}
2003-03-11 21:33:11 +00:00
void MenuTimer::Pause()
{
m_bPaused = true;
}
void MenuTimer::Stop()
2002-05-27 08:23:27 +00:00
{
2003-11-07 21:33:27 +00:00
/* Don't call SetSeconds if we're already at 0: let the existing tweens finish. */
if( m_fSecondsLeft >= 1 )
SetSeconds( 0 );
2003-03-11 21:33:11 +00:00
Pause();
2002-05-27 08:23:27 +00:00
}
2003-03-11 21:33:11 +00:00
void MenuTimer::Disable()
{
SetSeconds( 99 );
Pause();
}
void MenuTimer::Stall()
2002-05-27 08:23:27 +00:00
{
/* Max amount of stall time we'll use: */
const float Amt = min( 0.5f, m_fStallSecondsLeft );
/* Amount of stall time to add: */
const float ToAdd = Amt - m_fStallSeconds;
m_fStallSeconds += ToAdd;
m_fStallSecondsLeft -= ToAdd;
2002-07-11 19:02:26 +00:00
}
2002-05-27 08:23:27 +00:00
2003-03-11 21:33:11 +00:00
void MenuTimer::SetSeconds( int iSeconds )
2002-07-11 19:02:26 +00:00
{
m_fSecondsLeft = (float)iSeconds;
2002-07-27 19:29:51 +00:00
CLAMP( m_fSecondsLeft, 0, 99 );
2002-08-20 21:00:56 +00:00
2003-11-07 21:33:27 +00:00
m_textDigit1.Command( ON_COMMAND );
m_textDigit2.Command( ON_COMMAND );
2003-03-11 08:52:45 +00:00
2003-03-11 21:33:11 +00:00
SetText( iSeconds );
2002-05-27 08:23:27 +00:00
}
2003-03-11 21:33:11 +00:00
void MenuTimer::Start()
{
2003-03-11 21:33:11 +00:00
m_bPaused = false;
}
2003-03-11 21:33:11 +00:00
void MenuTimer::SetText( int iSeconds )
{
2003-11-07 21:33:27 +00:00
const int iDigit1 = (int)(iSeconds)/10;
const int iDigit2 = (int)(iSeconds)%10;
2003-03-11 21:33:11 +00:00
m_textDigit1.SetText( ssprintf("%d",iDigit1) );
m_textDigit2.SetText( ssprintf("%d",iDigit2) );
2003-03-17 23:24:00 +00:00
}