diff --git a/stepmania/src/NoteDataWithScoring.cpp b/stepmania/src/NoteDataWithScoring.cpp index 70b2e944a2..dd82d6084c 100644 --- a/stepmania/src/NoteDataWithScoring.cpp +++ b/stepmania/src/NoteDataWithScoring.cpp @@ -28,6 +28,35 @@ void NoteDataWithScoring::Init() m_fHoldNoteLife.clear(); } +int NoteDataWithScoring::GetMaxCombo() const +{ + int iNumSuccessfulTapNotes = 0; + int fEndBeat = GetMaxBeat()+1; + + unsigned iStartIndex = BeatToNoteRow( (float)0 ); + unsigned iEndIndex = BeatToNoteRow( fEndBeat ); + + int combo = 0; + int maxcombo = 0; + + for( unsigned i=iStartIndex; iGetTapNote(t, i) != TAP_EMPTY ) + if (GetTapNoteScore(t, i) >= TNS_GREAT) + combo++; + else + { + if (combo > maxcombo) maxcombo = combo; + combo = 0; + } + } + } + + return max(combo, maxcombo); +} + int NoteDataWithScoring::GetNumTapNotesWithScore( TapNoteScore tns, const float fStartBeat, float fEndBeat ) const { int iNumSuccessfulTapNotes = 0; @@ -164,7 +193,7 @@ float NoteDataWithScoring::GetActualRadarValue( RadarCategory rv, float fSongSec float NoteDataWithScoring::GetActualStreamRadarValue( float fSongSeconds ) const { - // density of steps +/* // density of steps int iNumSuccessfulNotes = GetNumTapNotesWithScore(TNS_MARVELOUS) + GetNumTapNotesWithScore(TNS_PERFECT) + @@ -173,11 +202,24 @@ float NoteDataWithScoring::GetActualStreamRadarValue( float fSongSeconds ) const float fNotesPerSecond = iNumSuccessfulNotes/fSongSeconds; float fReturn = fNotesPerSecond / 7; return min( fReturn, 1.0f ); + */ + + int MaxCombo = GetMaxCombo(); + float TotalSteps = GetNumTapNotes(); + + return min( (float)MaxCombo/TotalSteps, 1.0f); } float NoteDataWithScoring::GetActualVoltageRadarValue( float fSongSeconds ) const { - float fAvgBPS = GetLastBeat() / fSongSeconds; + // voltage is essentialy perfects divided by # of steps + float totalnotes = GetNumTapNotes(); + float perfects = GetNumTapNotesWithScore(TNS_PERFECT) + GetNumTapNotesWithScore(TNS_MARVELOUS); + + float result = perfects/totalnotes; + return result; + +/* float fAvgBPS = GetLastBeat() / fSongSeconds; // peak density of steps float fMaxDensitySoFar = 0; @@ -198,6 +240,7 @@ float NoteDataWithScoring::GetActualVoltageRadarValue( float fSongSeconds ) cons float fReturn = fMaxDensitySoFar*fAvgBPS/10; return min( fReturn, 1.0f ); + */ } float NoteDataWithScoring::GetActualAirRadarValue( float fSongSeconds ) const @@ -207,13 +250,17 @@ float NoteDataWithScoring::GetActualAirRadarValue( float fSongSeconds ) const GetNumDoublesWithScore(TNS_MARVELOUS) + GetNumDoublesWithScore(TNS_PERFECT) + GetNumDoublesWithScore(TNS_GREAT)/2; - float fReturn = iNumDoubles / fSongSeconds; +// float fReturn = iNumDoubles / fSongSeconds; + int iTotalDoubles = GetNumDoubles(); + + if (iTotalDoubles == 0) return 1.0f; // no jumps in song + float fReturn = (float)iNumDoubles / iTotalDoubles; return min( fReturn, 1.0f ); } float NoteDataWithScoring::GetActualChaosRadarValue( float fSongSeconds ) const { - // count number of triplets +/* // count number of triplets int iNumChaosNotesCompleted = 0; for( unsigned r=0; rAddChild( &m_sprPossibleBar[p][r] ); m_sprActualBar[p][r].Load( THEME->GetPathToG(ssprintf("ScreenEvaluation bar actual p%d",p+1)) ); - m_sprActualBar[p][r].SetWidth( m_sprActualBar[p][r].GetUnzoomedWidth() * stageStats.fRadarActual[p][r] ); + // should be out of the possible bar, not actual (whatever value that is at) + m_sprActualBar[p][r].SetWidth( m_sprPossibleBar[p][r].GetUnzoomedWidth() * stageStats.fRadarActual[p][r] ); + + float value = (float)100 * m_sprActualBar[p][r].GetUnzoomedWidth() / m_sprPossibleBar[p][r].GetUnzoomedWidth(); + LOG->Trace("Radar bar %d of 5 - %f percent", r, value); + m_sprActualBar[p][r].SetName( ssprintf("BarActual%dP%d",r+1,p+1) ); UtilSetXYAndOnCommand( m_sprActualBar[p][r], "ScreenEvaluation" ); - if( stageStats.fRadarActual[p][r] == stageStats.fRadarPossible[p][r] ) + + // .99999 is fairly close to 1.00, so we use that + if( stageStats.fRadarActual[p][r] > 0.99999f ) m_sprActualBar[p][r].Command( BAR_ACTUAL_MAX_COMMAND ); this->AddChild( &m_sprActualBar[p][r] ); }