diff --git a/stepmania/src/Profile.cpp b/stepmania/src/Profile.cpp index c6cfc4c3e5..fbfc3e0b1e 100644 --- a/stepmania/src/Profile.cpp +++ b/stepmania/src/Profile.cpp @@ -195,6 +195,64 @@ int Profile::GetTotalNumSongsPassed() const return iTotal; } +int Profile::GetTotalStepsWithTopGrade( StepsType st, Difficulty d, Grade g ) const +{ + int iCount = 0; + + FOREACH_CONST( Song*, SONGMAN->GetAllSongs(), pSong ) + { + if( (*pSong)->m_SelectionDisplay == Song::SHOW_NEVER ) + continue; // skip + + FOREACH_CONST( Steps*, (*pSong)->GetAllSteps(), pSteps ) + { + if( (*pSteps)->m_StepsType != st ) + continue; // skip + + if( (*pSteps)->GetDifficulty() != d ) + continue; // skip + + const HighScoreList &hsl = GetStepsHighScoreList( *pSong, *pSteps ); + if( hsl.vHighScores.empty() ) + continue; // skip + + if( hsl.vHighScores[0].grade == g ) + iCount++; + } + } + + return iCount; +} + +int Profile::GetTotalTrailsWithTopGrade( StepsType st, CourseDifficulty d, Grade g ) const +{ + int iCount = 0; + + // add course high scores + vector vCourses; + SONGMAN->GetAllCourses( vCourses, false ); + FOREACH_CONST( Course*, vCourses, pCourse ) + { + // Don't count any course that has any entries that change over time. + if( !(*pCourse)->AllSongsAreFixed() ) + continue; + + vector vTrails; + Trail* pTrail = (*pCourse)->GetTrail( st, d ); + if( pTrail == NULL ) + continue; + + const HighScoreList &hsl = GetCourseHighScoreList( *pCourse, pTrail ); + if( hsl.vHighScores.empty() ) + continue; // skip + + if( hsl.vHighScores[0].grade == g ) + iCount++; + } + + return iCount; +} + float Profile::GetSongsPossible( StepsType st, Difficulty dc ) const { int iTotalSteps = 0; @@ -290,6 +348,19 @@ float Profile::GetSongsPercentComplete( StepsType st, Difficulty dc ) const return GetSongsActual(st,dc) / GetSongsPossible(st,dc); } +float Profile::GetSongsPercentCompleteAllDifficulties( StepsType st ) const +{ + float fActual = 0; + float fPossible = 0; + FOREACH_Difficulty( d ) + { + fActual += GetSongsActual(st,d); + fPossible += GetSongsPossible(st,d); + } + return fActual / fPossible; +} + + float Profile::GetCoursesPossible( StepsType st, CourseDifficulty cd ) const { int iTotalTrails = 0; @@ -371,6 +442,18 @@ float Profile::GetCoursesPercentComplete( StepsType st, CourseDifficulty cd ) co return GetCoursesActual(st,cd) / GetCoursesPossible(st,cd); } +float Profile::GetCoursesPercentCompleteAllDifficulties( StepsType st ) const +{ + float fActual = 0; + float fPossible = 0; + FOREACH_CourseDifficulty( d ) + { + fActual += GetCoursesActual(st,d); + fPossible += GetCoursesPossible(st,d); + } + return fActual / fPossible; +} + CString Profile::GetProfileDisplayNameFromDir( CString sDir ) { Profile profile; @@ -1699,7 +1782,10 @@ public: static int GetSaved( T* p, lua_State *L ) { p->m_SavedLuaData.PushSelf(L); return 1; } static int GetTotalNumSongsPlayed( T* p, lua_State *L ) { lua_pushnumber(L, p->m_iNumTotalSongsPlayed ); return 1; } static int IsCodeUnlocked( T* p, lua_State *L ) { lua_pushboolean(L, p->IsCodeUnlocked(IArg(1)) ); return 1; } - + static int GetTotalStepsWithTopGrade( T* p, lua_State *L ) { lua_pushnumber(L, p->GetTotalStepsWithTopGrade((StepsType)IArg(1),(Difficulty)IArg(2),(Grade)IArg(3)) ); return 1; } + static int GetTotalTrailsWithTopGrade( T* p, lua_State *L ) { lua_pushnumber(L, p->GetTotalTrailsWithTopGrade((StepsType)IArg(1),(CourseDifficulty)IArg(2),(Grade)IArg(3)) ); return 1; } + static int GetSongsPercentCompleteAllDifficulties( T* p, lua_State *L ) { lua_pushnumber(L, p->GetSongsPercentCompleteAllDifficulties((StepsType)IArg(1)) ); return 1; } + static int GetCoursesPercentCompleteAllDifficulties( T* p, lua_State *L ) { lua_pushnumber(L, p->GetCoursesPercentCompleteAllDifficulties((StepsType)IArg(1)) ); return 1; } static void Register(lua_State *L) { @@ -1715,6 +1801,10 @@ public: ADD_METHOD( GetSaved ) ADD_METHOD( GetTotalNumSongsPlayed ) ADD_METHOD( IsCodeUnlocked ) + ADD_METHOD( GetTotalStepsWithTopGrade ) + ADD_METHOD( GetTotalTrailsWithTopGrade ) + ADD_METHOD( GetSongsPercentCompleteAllDifficulties ) + ADD_METHOD( GetCoursesPercentCompleteAllDifficulties ) Luna::Register( L ); } }; diff --git a/stepmania/src/Profile.h b/stepmania/src/Profile.h index 48550dd95a..cba69ff53d 100644 --- a/stepmania/src/Profile.h +++ b/stepmania/src/Profile.h @@ -67,12 +67,16 @@ public: CString GetDisplayTotalCaloriesBurnedToday() const; // remove me and use Lua instead float GetCaloriesBurnedToday() const; int GetTotalNumSongsPassed() const; + int GetTotalStepsWithTopGrade( StepsType st, Difficulty d, Grade g ) const; + int GetTotalTrailsWithTopGrade( StepsType st, CourseDifficulty d, Grade g ) const; float GetSongsPossible( StepsType st, Difficulty dc ) const; float GetCoursesPossible( StepsType st, CourseDifficulty cd ) const; float GetSongsActual( StepsType st, Difficulty dc ) const; float GetCoursesActual( StepsType st, CourseDifficulty cd ) const; float GetSongsPercentComplete( StepsType st, Difficulty dc ) const; float GetCoursesPercentComplete( StepsType st, CourseDifficulty cd ) const; + float GetSongsPercentCompleteAllDifficulties( StepsType st ) const; + float GetCoursesPercentCompleteAllDifficulties( StepsType st ) const; static CString GetProfileDisplayNameFromDir( CString sDir ); int GetSongNumTimesPlayed( const Song* pSong ) const; int GetSongNumTimesPlayed( const SongID& songID ) const;