diff --git a/Themes/_fallback/Languages/en.ini b/Themes/_fallback/Languages/en.ini index 5f99159de5..fa9cb03999 100644 --- a/Themes/_fallback/Languages/en.ini +++ b/Themes/_fallback/Languages/en.ini @@ -842,6 +842,7 @@ Edit time signature=Edit time signature (not working yet) Edit time signature (top)=Edit time signature (beats per measure) Edit time signature (bottom)=Edit time signature (single beat note value) Edit tickcount=Edit tickcount +Edit combo=Edit combo Editor options=Options EditorShowBGChangesPlay=Show Backgrounds Effect=Effect @@ -1207,6 +1208,7 @@ Enter a new Delay value.=Enter a new Delay value. Enter a new Time Signature numerator value.=Enter the number of beats per measure. Enter a new Time Signature denominator value.=Enter the note value that represents one beat. Enter a new Tickcount value.=Enter a new Tickcount value. +Enter a new Combo value.=Enter a new Combo value. Enter a new artist transliteration.=Enter a new artist transliteration. Enter a new artist.=Enter a new artist. Enter a new genre.=Enter a new genre. diff --git a/Themes/_fallback/metrics.ini b/Themes/_fallback/metrics.ini index 572fe4f868..6b3767cb57 100644 --- a/Themes/_fallback/metrics.ini +++ b/Themes/_fallback/metrics.ini @@ -956,18 +956,21 @@ StopColor=color("0.8,0.8,0,1") DelayColor=color("0,0.8,0.8,1") TimeSignatureColor=color("1,0.55,0,1") TickcountColor=color("0,1,0,1") +ComboColor=color("0.55,1,0,1") # BPMIsLeftSide=true StopIsLeftSide=true DelayIsLeftSide=true TimeSignatureIsLeftSide=true TickcountIsLeftSide=false +ComboIsLeftSide=false # BPMOffsetX=60 StopOffsetX=10 DelayOffsetX=10 TimeSignatureOffsetX=30 TickcountOffsetX=10 +ComboOffsetX=30 [PlayerStageStats] # Original CVS Grading diff --git a/src/NoteField.cpp b/src/NoteField.cpp index d91cc5ca70..ed70b133be 100644 --- a/src/NoteField.cpp +++ b/src/NoteField.cpp @@ -424,16 +424,19 @@ static ThemeMetric STOP_COLOR ( "NoteField", "StopColor" ); static ThemeMetric DELAY_COLOR ( "NoteField", "DelayColor" ); static ThemeMetric TIME_SIGNATURE_COLOR ( "NoteField", "TimeSignatureColor" ); static ThemeMetric TICKCOUNT_COLOR ( "NoteField", "TickcountColor" ); +static ThemeMetric COMBO_COLOR ( "NoteField", "ComboColor" ); static ThemeMetric BPM_IS_LEFT_SIDE ( "NoteField", "BPMIsLeftSide" ); static ThemeMetric STOP_IS_LEFT_SIDE ( "NoteField", "StopIsLeftSide" ); static ThemeMetric DELAY_IS_LEFT_SIDE ( "NoteField", "DelayIsLeftSide" ); static ThemeMetric TIME_SIGNATURE_IS_LEFT_SIDE ( "NoteField", "TimeSignatureIsLeftSide" ); static ThemeMetric TICKCOUNT_IS_LEFT_SIDE ( "NoteField", "TickcountIsLeftSide" ); +static ThemeMetric COMBO_IS_LEFT_SIDE ( "NoteField", "ComboIsLeftSide" ); static ThemeMetric BPM_OFFSETX ( "NoteField", "BPMOffsetX" ); static ThemeMetric STOP_OFFSETX ( "NoteField", "StopOffsetX" ); static ThemeMetric DELAY_OFFSETX ( "NoteField", "DelayOffsetX" ); static ThemeMetric TIME_SIGNATURE_OFFSETX ( "NoteField", "TimeSignatureOffsetX" ); static ThemeMetric TICKCOUNT_OFFSETX ( "NoteField", "TickcountOffsetX" ); +static ThemeMetric COMBO_OFFSETX ( "NoteField", "ComboOffsetX" ); void NoteField::DrawBPMText( const float fBeat, const float fBPM ) { @@ -512,6 +515,23 @@ void NoteField::DrawTickcountText( const float fBeat, int iTicks ) m_textMeasureNumber.Draw(); } +void NoteField::DrawComboText( const float fBeat, int iCombo ) +{ + const float fYOffset = ArrowEffects::GetYOffset( m_pPlayerState, 0, fBeat ); + const float fYPos = ArrowEffects::GetYPos( m_pPlayerState, 0, fYOffset, m_fYReverseOffsetPixels ); + const float fZoom = ArrowEffects::GetZoom( m_pPlayerState ); + const float xBase = GetWidth()/2.f; + const float xOffset = COMBO_OFFSETX * fZoom; + + m_textMeasureNumber.SetZoom( fZoom ); + m_textMeasureNumber.SetHorizAlign( COMBO_IS_LEFT_SIDE ? align_right : align_left ); + m_textMeasureNumber.SetDiffuse( COMBO_COLOR ); + m_textMeasureNumber.SetGlow( RageColor(1,1,1,RageFastCos(RageTimer::GetTimeSinceStartFast()*2)/2+0.5f) ); + m_textMeasureNumber.SetText( ssprintf("%d", iCombo) ); + m_textMeasureNumber.SetXY( (COMBO_IS_LEFT_SIDE ? -xBase - xOffset : xBase + xOffset), fYPos ); + m_textMeasureNumber.Draw(); +} + void NoteField::DrawAttackText( const float fBeat, const Attack &attack ) { const float fYOffset = ArrowEffects::GetYOffset( m_pPlayerState, 0, fBeat ); @@ -776,6 +796,19 @@ void NoteField::DrawPrimitives() DrawTickcountText( fBeat, tTickcountSegments[i].m_iTicks ); } } + + // Combo text + const vector &tComboSegments = GAMESTATE->m_pCurSong->m_Timing.m_ComboSegments; + for( unsigned i=0; i= iFirstRowToDraw && + tComboSegments[i].m_iStartRow <= iLastRowToDraw) + { + float fBeat = NoteRowToBeat(tComboSegments[i].m_iStartRow); + if( IS_ON_SCREEN(fBeat) ) + DrawComboText( fBeat, tComboSegments[i].m_iCombo ); + } + } // todo: add warp text -aj diff --git a/src/NoteField.h b/src/NoteField.h index 4a9723288f..eade904c95 100644 --- a/src/NoteField.h +++ b/src/NoteField.h @@ -59,6 +59,7 @@ protected: void DrawFreezeText( const float fBeat, const float fBPM, const float bDelay ); void DrawTimeSignatureText( const float fBeat, int iNumerator, int iDenominator ); void DrawTickcountText( const float fBeat, int iTicks ); + void DrawComboText( const float fBeat, int iCombo ); void DrawAttackText( const float fBeat, const Attack &attack ); void DrawBGChangeText( const float fBeat, const RString sNewBGName ); float GetWidth() const; diff --git a/src/ScreenEdit.cpp b/src/ScreenEdit.cpp index 8bad6e7fd9..5f6a366e9c 100644 --- a/src/ScreenEdit.cpp +++ b/src/ScreenEdit.cpp @@ -78,6 +78,7 @@ AutoScreenMessage( SM_BackFromDelayChange ); AutoScreenMessage( SM_BackFromTimeSignatureNumeratorChange ); AutoScreenMessage( SM_BackFromTimeSignatureDenominatorChange ); AutoScreenMessage( SM_BackFromTickcountChange ); +AutoScreenMessage( SM_BackFromComboChange ); AutoScreenMessage( SM_DoSaveAndExit ); AutoScreenMessage( SM_DoExit ); AutoScreenMessage( SM_SaveSuccessful ); @@ -578,7 +579,8 @@ static MenuDef g_TimingDataInformation( MenuRowDef( ScreenEdit::delay, "Edit delay", true, EditMode_Full, true, true, 0, NULL ), MenuRowDef( ScreenEdit::time_signature_numerator, "Edit time signature (top)", true, EditMode_Full, true, true, 0, NULL ), MenuRowDef( ScreenEdit::time_signature_denominator, "Edit time signature (bottom)", true, EditMode_Full, true, true, 0, NULL ), - MenuRowDef( ScreenEdit::tickcount, "Edit tickcount", true, EditMode_Full, true, true, 0, NULL ) + MenuRowDef( ScreenEdit::tickcount, "Edit tickcount", true, EditMode_Full, true, true, 0, NULL ), + MenuRowDef( ScreenEdit::combo, "Edit combo", true, EditMode_Full, true, true, 0, NULL ) ); enum { song_bganimation, song_movie, song_bitmap, global_bganimation, global_movie, global_movie_song_group, global_movie_song_group_and_genre, dynamic_random, baked_random, none }; @@ -2651,6 +2653,15 @@ void ScreenEdit::HandleScreenMessage( const ScreenMessage SM ) } SetDirty( true ); } + else if ( SM == SM_BackFromComboChange ) + { + int iCombo = atoi( ScreenTextEntry::s_sLastAnswer ); + if ( iCombo >= 0 ) + { + m_pSong->m_Timing.SetComboAtBeat( GAMESTATE->m_fSongBeat, iCombo ); + } + SetDirty( true ); + } else if( SM == SM_BackFromBGChange ) { HandleBGChangeChoice( (BGChangeChoice)ScreenMiniMenu::s_iLastRowCode, ScreenMiniMenu::s_viLastAnswers ); @@ -3169,6 +3180,7 @@ void ScreenEdit::HandleMainMenuChoice( MainMenuChoice c, const vector &iAns g_TimingDataInformation.rows[time_signature_numerator].SetOneUnthemedChoice( ssprintf("%d", pTime.GetTimeSignatureNumeratorAtBeat( fBeat ) ) ); g_TimingDataInformation.rows[time_signature_denominator].SetOneUnthemedChoice( ssprintf("%d", pTime.GetTimeSignatureDenominatorAtBeat( fBeat ) ) ); g_TimingDataInformation.rows[tickcount].SetOneUnthemedChoice( ssprintf("%d", pTime.GetTickcountAtBeat( fBeat ) ) ); + g_TimingDataInformation.rows[combo].SetOneUnthemedChoice( ssprintf("%d", pTime.GetComboAtBeat( fBeat ) ) ); EditMiniMenu( &g_TimingDataInformation, SM_BackFromTimingDataInformation ); } @@ -3620,6 +3632,7 @@ static LocalizedString ENTER_DELAY_VALUE ( "ScreenEdit", "Enter a new Delay va static LocalizedString ENTER_TIME_SIGNATURE_NUMERATOR_VALUE ( "ScreenEdit", "Enter a new Time Signature numerator value." ); static LocalizedString ENTER_TIME_SIGNATURE_DENOMINATOR_VALUE ( "ScreenEdit", "Enter a new Time Signature denominator value." ); static LocalizedString ENTER_TICKCOUNT_VALUE ( "ScreenEdit", "Enter a new Tickcount value." ); +static LocalizedString ENTER_COMBO_VALUE ( "ScreenEdit", "Enter a new Combo value." ); void ScreenEdit::HandleTimingDataInformationChoice( TimingDataInformationChoice c, const vector &iAnswers ) { switch( c ) @@ -3676,6 +3689,14 @@ void ScreenEdit::HandleTimingDataInformationChoice( TimingDataInformationChoice 2 ); break; + case combo: + ScreenTextEntry::TextEntry( + SM_BackFromComboChange, + ENTER_COMBO_VALUE, + ssprintf( "%d", m_pSong->m_Timing.GetComboAtBeat( GAMESTATE->m_fSongBeat ) ), + 4 + ); + break; } } diff --git a/src/ScreenEdit.h b/src/ScreenEdit.h index f4f38717f7..f32e6940ac 100644 --- a/src/ScreenEdit.h +++ b/src/ScreenEdit.h @@ -448,6 +448,7 @@ public: time_signature_numerator, time_signature_denominator, tickcount, + combo, NUM_TIMING_DATA_INFORMATION_CHOICES }; diff --git a/src/TimingData.cpp b/src/TimingData.cpp index c6dacd4c9d..3e03b64351 100644 --- a/src/TimingData.cpp +++ b/src/TimingData.cpp @@ -227,14 +227,7 @@ float TimingData::GetDelayAtRow( int iRow ) const int TimingData::GetComboAtRow( int iNoteRow ) const { - for( unsigned i=0; i