From 14a24f6f64cc58100dd3da69658a87de3b06cc7b Mon Sep 17 00:00:00 2001 From: Glenn Maynard Date: Sun, 5 Oct 2003 00:30:55 +0000 Subject: [PATCH] Support eval-style percents --- stepmania/src/PercentageDisplay.cpp | 57 +++++++++++++++++++++++------ stepmania/src/PercentageDisplay.h | 3 ++ 2 files changed, 49 insertions(+), 11 deletions(-) diff --git a/stepmania/src/PercentageDisplay.cpp b/stepmania/src/PercentageDisplay.cpp index 8742f880bb..2ab96a6b97 100644 --- a/stepmania/src/PercentageDisplay.cpp +++ b/stepmania/src/PercentageDisplay.cpp @@ -10,32 +10,58 @@ #define DANCE_POINT_DIGITS THEME->GetMetricI(m_sName,"DancePointsDigits") #define PERCENT_DECIMAL_PLACES THEME->GetMetricI(m_sName,"PercentDecimalPlaces") #define PERCENT_TOTAL_SIZE THEME->GetMetricI(m_sName,"PercentTotalSize") +#define PERCENT_USE_REMAINDER THEME->GetMetricB(m_sName,"PercentUseRemainder") PercentageDisplay::PercentageDisplay() { - this->AddChild( &m_textPercent ); } void PercentageDisplay::Load( PlayerNumber pn ) { m_PlayerNumber = pn; - m_Last = 0; - - m_textPercent.SetName( ssprintf("PercentP%i", pn+1) ); - m_textPercent.LoadFromNumbers( THEME->GetPathToN(m_sName + " text") ); - SET_XY_AND_ON_COMMAND( m_textPercent ); + m_Last = -1; if( PREFSMAN->m_bDancePointsForOni ) - m_textPercent.SetText( " " ); + m_textPercent.SetName( ssprintf("DancePointsP%i", pn+1) ); else - m_textPercent.SetText( ssprintf( "%0*.*f%%", PERCENT_TOTAL_SIZE, PERCENT_DECIMAL_PLACES, 0 ) ); + m_textPercent.SetName( ssprintf("PercentP%i", pn+1) ); + + m_textPercent.LoadFromNumbers( THEME->GetPathToN(m_sName + " text") ); + SET_XY_AND_ON_COMMAND( m_textPercent ); + this->AddChild( &m_textPercent ); + + if( !PREFSMAN->m_bDancePointsForOni && PERCENT_USE_REMAINDER ) + { + m_textPercentRemainder.SetName( ssprintf("PercentRemainderP%d",pn+1) ); + m_textPercentRemainder.LoadFromNumbers( THEME->GetPathToN(m_sName + " remainder") ); + SET_XY_AND_ON_COMMAND( m_textPercentRemainder ); + m_textPercentRemainder.SetText( "456" ); + this->AddChild( &m_textPercentRemainder ); + } + + Refresh(); +} + +void PercentageDisplay::TweenOffScreen() +{ + OFF_COMMAND( m_textPercent ); + if( PREFSMAN->m_bDancePointsForOni && PERCENT_USE_REMAINDER ) + OFF_COMMAND( m_textPercentRemainder ); } void PercentageDisplay::Update( float fDeltaTime ) +{ + ActorFrame::Update( fDeltaTime ); + + Refresh(); +} + +void PercentageDisplay::Refresh() { const int iActualDancePoints = GAMESTATE->m_CurStageStats.iActualDancePoints[m_PlayerNumber]; if( iActualDancePoints == m_Last ) return; + m_Last = iActualDancePoints; CString sNumToDisplay; @@ -44,12 +70,21 @@ void PercentageDisplay::Update( float fDeltaTime ) int iPossibleDancePoints = GAMESTATE->m_CurStageStats.iPossibleDancePoints[m_PlayerNumber]; iPossibleDancePoints = max( 1, iPossibleDancePoints ); float fPercentDancePoints = iActualDancePoints / (float)iPossibleDancePoints + 0.00001f; // correct for rounding errors + fPercentDancePoints = max( fPercentDancePoints, 0 ); - float fNumToDisplay = max( 0, fPercentDancePoints*100 ); - sNumToDisplay = ssprintf( "%0*.*f%%", PERCENT_TOTAL_SIZE, PERCENT_DECIMAL_PLACES, fNumToDisplay ); + if( PERCENT_USE_REMAINDER ) + { + int iPercentWhole = int(fPercentDancePoints*100); + int iPercentRemainder = int( (fPercentDancePoints*100 - int(fPercentDancePoints*100)) * 10 ); + sNumToDisplay = ssprintf( "%02d", iPercentWhole ); + m_textPercentRemainder.SetText( ssprintf(".%01d%%", iPercentRemainder) ); + } else { + float fNumToDisplay = max( 0, fPercentDancePoints*100 ); + sNumToDisplay = ssprintf( "%0*.*f%%", PERCENT_TOTAL_SIZE, PERCENT_DECIMAL_PLACES, fNumToDisplay ); + } } else - sNumToDisplay = ssprintf( "%*d", DANCE_POINT_DIGITS, iActualDancePoints ); + sNumToDisplay = ssprintf( "%*d", DANCE_POINT_DIGITS, max( 0, iActualDancePoints ) ); m_textPercent.SetText( sNumToDisplay ); } diff --git a/stepmania/src/PercentageDisplay.h b/stepmania/src/PercentageDisplay.h index 74173b509e..200503172d 100644 --- a/stepmania/src/PercentageDisplay.h +++ b/stepmania/src/PercentageDisplay.h @@ -11,11 +11,14 @@ public: PercentageDisplay(); void Load( PlayerNumber pn ); void Update( float fDeltaTime ); + void TweenOffScreen(); private: + void Refresh(); PlayerNumber m_PlayerNumber; int m_Last; BitmapText m_textPercent; + BitmapText m_textPercentRemainder; }; #endif