diff --git a/stepmania/src/HighScore.cpp b/stepmania/src/HighScore.cpp index 45588851bf..ac41128c37 100644 --- a/stepmania/src/HighScore.cpp +++ b/stepmania/src/HighScore.cpp @@ -405,6 +405,29 @@ public: }; LUA_REGISTER_CLASS( HighScore ) + +class LunaHighScoreList: public Luna +{ +public: + static int GetHighScores( T* p, lua_State *L ) + { + lua_newtable(L); + for( int i = 0; i < (int) p->vHighScores.size(); ++i ) + { + p->vHighScores[i].PushSelf(L); + lua_rawseti( L, -2, i+1 ); + } + + return 1; + } + + LunaHighScoreList() + { + ADD_METHOD( GetHighScores ); + } +}; + +LUA_REGISTER_CLASS( HighScoreList ) // lua end /* diff --git a/stepmania/src/HighScore.h b/stepmania/src/HighScore.h index 0cca8fcf8c..ca4dec1e52 100644 --- a/stepmania/src/HighScore.h +++ b/stepmania/src/HighScore.h @@ -97,6 +97,10 @@ public: vector vHighScores; Grade HighGrade; + + // Lua + void PushSelf( lua_State *L ); + private: int iNumTimesPlayed; DateTime dtLastPlayed; // meaningless if iNumTimesPlayed == 0 diff --git a/stepmania/src/Profile.cpp b/stepmania/src/Profile.cpp index 917d606d6c..77a2b9c89f 100644 --- a/stepmania/src/Profile.cpp +++ b/stepmania/src/Profile.cpp @@ -1952,6 +1952,29 @@ class LunaProfile: public Luna { public: static int GetDisplayName( T* p, lua_State *L ) { lua_pushstring(L, p->m_sDisplayName ); return 1; } + static int GetHighScoreList( T* p, lua_State *L ) + { + if( LuaBinding::CheckLuaObjectType(L, 1, "Song") ) + { + const Song *pSong = Luna::check(L,1); + const Steps *pSteps = Luna::check(L,2); + HighScoreList &hsl = p->GetStepsHighScoreList( pSong, pSteps ); + hsl.PushSelf( L ); + return 1; + } + else if( LuaBinding::CheckLuaObjectType(L, 1, "Course") ) + { + const Course *pCourse = Luna::check(L,1); + const Trail *pTrail = Luna::check(L,2); + HighScoreList &hsl = p->GetCourseHighScoreList( pCourse, pTrail ); + hsl.PushSelf( L ); + return 1; + } + + luaL_typerror( L, 1, "Song or Course" ); + return 0; + } + static int GetCharacter( T* p, lua_State *L ) { p->GetCharacter()->PushSelf(L); return 1; } static int GetWeightPounds( T* p, lua_State *L ) { lua_pushnumber(L, p->m_iWeightPounds ); return 1; } static int SetWeightPounds( T* p, lua_State *L ) { p->m_iWeightPounds = IArg(1); return 0; } @@ -2013,6 +2036,7 @@ public: LunaProfile() { ADD_METHOD( GetDisplayName ); + ADD_METHOD( GetHighScoreList ); ADD_METHOD( GetCharacter ); ADD_METHOD( GetWeightPounds ); ADD_METHOD( SetWeightPounds ); diff --git a/stepmania/src/StageStats.cpp b/stepmania/src/StageStats.cpp index 1cf93a60ac..d1dbf28c78 100644 --- a/stepmania/src/StageStats.cpp +++ b/stepmania/src/StageStats.cpp @@ -272,6 +272,27 @@ class LunaStageStats: public Luna public: static int GetPlayerStageStats( T* p, lua_State *L ) { p->m_player[Enum::Check(L, 1)].PushSelf(L); return 1; } static int GetMultiPlayerStageStats( T* p, lua_State *L ) { p->m_multiPlayer[Enum::Check(L, 1)].PushSelf(L); return 1; } + static int GetPlayedSongs( T* p, lua_State *L ) + { + lua_newtable(L); + for( int i = 0; i < (int) p->m_vpPlayedSongs.size(); ++i ) + { + p->m_vpPlayedSongs[i]->PushSelf(L); + lua_rawseti( L, -2, i+1 ); + } + return 1; + } + static int GetPossibleSongs( T* p, lua_State *L ) + { + lua_newtable(L); + for( int i = 0; i < (int) p->m_vpPossibleSongs.size(); ++i ) + { + p->m_vpPossibleSongs[i]->PushSelf(L); + lua_rawseti( L, -2, i+1 ); + } + return 1; + + } static int GetGameplaySeconds( T* p, lua_State *L ) { lua_pushnumber(L, p->m_fGameplaySeconds); return 1; } static int OnePassed( T* p, lua_State *L ) { lua_pushboolean(L, p->OnePassed()); return 1; } static int AllFailed( T* p, lua_State *L ) { lua_pushboolean(L, p->AllFailed()); return 1; } @@ -280,6 +301,8 @@ public: { ADD_METHOD( GetPlayerStageStats ); ADD_METHOD( GetMultiPlayerStageStats ); + ADD_METHOD( GetPlayedSongs ); + ADD_METHOD( GetPossibleSongs ); ADD_METHOD( GetGameplaySeconds ); ADD_METHOD( OnePassed ); ADD_METHOD( AllFailed ); diff --git a/stepmania/src/StatsManager.cpp b/stepmania/src/StatsManager.cpp index b9f818da68..036ec02850 100644 --- a/stepmania/src/StatsManager.cpp +++ b/stepmania/src/StatsManager.cpp @@ -218,8 +218,18 @@ class LunaStatsManager: public Luna { public: static int GetCurStageStats( T* p, lua_State *L ) { p->m_CurStageStats.PushSelf(L); return 1; } - static int GetAccumPlayedStageStats( T* p, lua_State *L ) { p->GetAccumPlayedStageStats().PushSelf(L); return 1; } + static int GetPlayedStageStats( T* p, lua_State *L ) + { + int iAgo = IArg(1); + int iIndex = p->m_vPlayedStageStats.size() - iAgo; + if( iIndex < 0 || iIndex >= (int) p->m_vPlayedStageStats.size() ) + return 0; + + p->m_vPlayedStageStats[iIndex].PushSelf(L); + return 1; + } static int Reset( T* p, lua_State *L ) { p->Reset(); return 0; } + static int GetAccumPlayedStageStats( T* p, lua_State *L ) { p->GetAccumPlayedStageStats().PushSelf(L); return 1; } static int GetFinalGrade( T* p, lua_State *L ) { PlayerNumber pn = Enum::Check(L, 1); @@ -285,6 +295,7 @@ public: LunaStatsManager() { ADD_METHOD( GetCurStageStats ); + ADD_METHOD( GetPlayedStageStats ); ADD_METHOD( GetAccumPlayedStageStats ); ADD_METHOD( Reset ); ADD_METHOD( GetFinalGrade );