diff --git a/stepmania/src/Combo.cpp b/stepmania/src/Combo.cpp index 3c89778ef8..ccb18e19ea 100644 --- a/stepmania/src/Combo.cpp +++ b/stepmania/src/Combo.cpp @@ -8,51 +8,54 @@ Combo::Combo() { - this->AddChild( &m_sprComboLabel ); - this->AddChild( &m_sprMissesLabel ); - this->AddChild( &m_textNumber ); + m_iLastSeenCombo = -1; } void Combo::Load( PlayerNumber pn ) { + ASSERT( m_SubActors.empty() ); // don't load twice + m_PlayerNumber = pn; - SHOW_COMBO_AT.Load(m_sName,"ShowComboAt"); - LABEL_X.Load(m_sName,"LabelX"); - LABEL_Y.Load(m_sName,"LabelY"); - LABEL_ON_COMMAND.Load(m_sName,"LabelOnCommand"); - NUMBER_X.Load(m_sName,"NumberX"); - NUMBER_Y.Load(m_sName,"NumberY"); - NUMBER_ON_COMMAND.Load(m_sName,"NumberOnCommand"); - NUMBER_MIN_ZOOM.Load(m_sName,"NumberMinZoom"); - NUMBER_MAX_ZOOM.Load(m_sName,"NumberMaxZoom"); - NUMBER_MAX_ZOOM_AT.Load(m_sName,"NumberMaxZoomAt"); - PULSE_COMMAND.Load(m_sName,"PulseCommand"); - FULL_COMBO_GREATS_COMMAND.Load(m_sName,"FullComboGreatsCommand"); - FULL_COMBO_PERFECTS_COMMAND.Load(m_sName,"FullComboPerfectsCommand"); - FULL_COMBO_MARVELOUSES_COMMAND.Load(m_sName,"FullComboMarvelousesCommand"); - FULL_COMBO_BROKEN_COMMAND.Load(m_sName,"FullComboBrokenCommand"); - SHOW_MISS_COMBO.Load(m_sName,"ShowMissCombo"); + SHOW_COMBO_AT .Load(m_sName,"ShowComboAt"); + LABEL_X .Load(m_sName,"LabelX"); + LABEL_Y .Load(m_sName,"LabelY"); + LABEL_ON_COMMAND .Load(m_sName,"LabelOnCommand"); + NUMBER_X .Load(m_sName,"NumberX"); + NUMBER_Y .Load(m_sName,"NumberY"); + NUMBER_ON_COMMAND .Load(m_sName,"NumberOnCommand"); + NUMBER_MIN_ZOOM .Load(m_sName,"NumberMinZoom"); + NUMBER_MAX_ZOOM .Load(m_sName,"NumberMaxZoom"); + NUMBER_MAX_ZOOM_AT .Load(m_sName,"NumberMaxZoomAt"); + PULSE_COMMAND .Load(m_sName,"PulseCommand"); + FULL_COMBO_GREATS_COMMAND .Load(m_sName,"FullComboGreatsCommand"); + FULL_COMBO_PERFECTS_COMMAND .Load(m_sName,"FullComboPerfectsCommand"); + FULL_COMBO_MARVELOUSES_COMMAND .Load(m_sName,"FullComboMarvelousesCommand"); + FULL_COMBO_BROKEN_COMMAND .Load(m_sName,"FullComboBrokenCommand"); + SHOW_MISS_COMBO .Load(m_sName,"ShowMissCombo"); + + m_sprMilestone.Load( THEME->GetPathG(m_sName,"milestone") ); + this->AddChild( m_sprMilestone ); m_sprComboLabel.Load( THEME->GetPathG(m_sName,"label") ); - m_sprComboLabel.SetShadowLength( 4 ); - m_sprComboLabel.StopAnimating(); - m_sprComboLabel.SetXY( LABEL_X, LABEL_Y ); - m_sprComboLabel.RunCommands( LABEL_ON_COMMAND ); - m_sprComboLabel.SetHidden( true ); + m_sprComboLabel->StopAnimating(); + m_sprComboLabel->SetXY( LABEL_X, LABEL_Y ); + m_sprComboLabel->RunCommands( LABEL_ON_COMMAND ); + m_sprComboLabel->SetHidden( true ); + this->AddChild( m_sprComboLabel ); m_sprMissesLabel.Load( THEME->GetPathG(m_sName,"misses") ); - m_sprMissesLabel.SetShadowLength( 4 ); - m_sprMissesLabel.StopAnimating(); - m_sprMissesLabel.SetXY( LABEL_X, LABEL_Y ); - m_sprMissesLabel.RunCommands( LABEL_ON_COMMAND ); - m_sprMissesLabel.SetHidden( true ); + m_sprMissesLabel->StopAnimating(); + m_sprMissesLabel->SetXY( LABEL_X, LABEL_Y ); + m_sprMissesLabel->RunCommands( LABEL_ON_COMMAND ); + m_sprMissesLabel->SetHidden( true ); + this->AddChild( m_sprMissesLabel ); m_textNumber.LoadFromFont( THEME->GetPathF(m_sName,"numbers") ); - m_textNumber.SetShadowLength( 4 ); m_textNumber.SetXY( NUMBER_X, NUMBER_Y ); m_textNumber.RunCommands( NUMBER_ON_COMMAND ); m_textNumber.SetHidden( true ); + this->AddChild( &m_textNumber ); } void Combo::SetCombo( int iCombo, int iMisses ) @@ -63,14 +66,27 @@ void Combo::SetCombo( int iCombo, int iMisses ) if( (iNum < (int)SHOW_COMBO_AT) || (bMisses && !(bool)SHOW_MISS_COMBO) ) { - m_sprComboLabel.SetHidden( true ); - m_sprMissesLabel.SetHidden( true ); + m_sprComboLabel->SetHidden( true ); + m_sprMissesLabel->SetHidden( true ); m_textNumber.SetHidden( true ); return; } - m_sprComboLabel.SetHidden( bMisses ); - m_sprMissesLabel.SetHidden( !bMisses ); + if( m_iLastSeenCombo == -1 ) // first update, don't set bIsMilestone=true + m_iLastSeenCombo = iCombo; + + bool bIsMilestone = false; + for( int i=m_iLastSeenCombo+1; i<=iCombo; i++ ) + { + if( i <= 1000 ) + bIsMilestone |= ((i % 100) == 0); + else + bIsMilestone |= ((i % 500) == 0); + } + m_iLastSeenCombo = iCombo; + + m_sprComboLabel->SetHidden( bMisses ); + m_sprMissesLabel->SetHidden( !bMisses ); m_textNumber.SetHidden( false ); CString txt = ssprintf("%d", iNum); @@ -80,14 +96,17 @@ void Combo::SetCombo( int iCombo, int iMisses ) m_textNumber.SetText( txt ); float fNumberZoom = SCALE(iNum,0.f,(float)NUMBER_MAX_ZOOM_AT,(float)NUMBER_MIN_ZOOM,(float)NUMBER_MAX_ZOOM); CLAMP( fNumberZoom, (float)NUMBER_MIN_ZOOM, (float)NUMBER_MAX_ZOOM ); - m_textNumber.StopTweening(); + m_textNumber.FinishTweening(); m_textNumber.SetZoom( fNumberZoom ); m_textNumber.RunCommands( PULSE_COMMAND ); - Sprite &sprLabel = bMisses ? m_sprMissesLabel : m_sprComboLabel; + AutoActor &sprLabel = bMisses ? m_sprMissesLabel : m_sprComboLabel; - sprLabel.StopTweening(); - sprLabel.RunCommands( PULSE_COMMAND ); + sprLabel->FinishTweening(); + sprLabel->RunCommands( PULSE_COMMAND ); + + if( bIsMilestone ) + m_sprMilestone->PlayCommand( "Milestone" ); // don't show a colored combo until 1/4 of the way through the song bool bPastMidpoint = GAMESTATE->GetCourseSongIndex()>0 || @@ -97,28 +116,28 @@ void Combo::SetCombo( int iCombo, int iMisses ) { if( STATSMAN->m_CurStageStats.m_player[m_PlayerNumber].FullComboOfScore(TNS_MARVELOUS) ) { - sprLabel.RunCommands( FULL_COMBO_MARVELOUSES_COMMAND ); + sprLabel->RunCommands( FULL_COMBO_MARVELOUSES_COMMAND ); m_textNumber.RunCommands( FULL_COMBO_MARVELOUSES_COMMAND ); } else if( bPastMidpoint && STATSMAN->m_CurStageStats.m_player[m_PlayerNumber].FullComboOfScore(TNS_PERFECT) ) { - sprLabel.RunCommands( FULL_COMBO_PERFECTS_COMMAND ); + sprLabel->RunCommands( FULL_COMBO_PERFECTS_COMMAND ); m_textNumber.RunCommands( FULL_COMBO_PERFECTS_COMMAND ); } else if( bPastMidpoint && STATSMAN->m_CurStageStats.m_player[m_PlayerNumber].FullComboOfScore(TNS_GREAT) ) { - sprLabel.RunCommands( FULL_COMBO_GREATS_COMMAND ); + sprLabel->RunCommands( FULL_COMBO_GREATS_COMMAND ); m_textNumber.RunCommands( FULL_COMBO_GREATS_COMMAND ); } else { - sprLabel.RunCommands( FULL_COMBO_BROKEN_COMMAND ); + sprLabel->RunCommands( FULL_COMBO_BROKEN_COMMAND ); m_textNumber.RunCommands( FULL_COMBO_BROKEN_COMMAND ); } } else { - sprLabel.RunCommands( FULL_COMBO_BROKEN_COMMAND ); + sprLabel->RunCommands( FULL_COMBO_BROKEN_COMMAND ); m_textNumber.RunCommands( FULL_COMBO_BROKEN_COMMAND ); } } diff --git a/stepmania/src/Combo.h b/stepmania/src/Combo.h index fc148c318f..fc6069634a 100644 --- a/stepmania/src/Combo.h +++ b/stepmania/src/Combo.h @@ -4,10 +4,9 @@ #define COMBO_H #include "ActorFrame.h" -#include "Sprite.h" +#include "AutoActor.h" #include "BitmapText.h" #include "PlayerNumber.h" -#include "GameConstantsAndTypes.h" // for TapNoteScore #include "ThemeMetric.h" @@ -33,7 +32,6 @@ protected: ThemeMetric NUMBER_MAX_ZOOM_AT; ThemeMetric PULSE_COMMAND; ThemeMetric TWEEN_SECONDS; - ThemeMetric FULL_COMBO_GREATS_COMMAND; ThemeMetric FULL_COMBO_PERFECTS_COMMAND; ThemeMetric FULL_COMBO_MARVELOUSES_COMMAND; @@ -42,9 +40,12 @@ protected: PlayerNumber m_PlayerNumber; - Sprite m_sprComboLabel; - Sprite m_sprMissesLabel; + AutoActor m_sprMilestone; + AutoActor m_sprComboLabel; + AutoActor m_sprMissesLabel; BitmapText m_textNumber; + + int m_iLastSeenCombo; }; #endif