From 3ae2ffeceb69b9642d41d20b4a9784cc83e294a1 Mon Sep 17 00:00:00 2001 From: "born a rick, raised a morty, died a jerry" Date: Fri, 26 Jun 2020 22:57:34 -0400 Subject: [PATCH 001/355] switch to per column offset plot filtering --- Themes/Til Death/BGAnimations/offsetplot.lua | 50 +++++++++++++------- 1 file changed, 32 insertions(+), 18 deletions(-) diff --git a/Themes/Til Death/BGAnimations/offsetplot.lua b/Themes/Til Death/BGAnimations/offsetplot.lua index 41f1ed164d..5a7f4f01cd 100644 --- a/Themes/Til Death/BGAnimations/offsetplot.lua +++ b/Themes/Til Death/BGAnimations/offsetplot.lua @@ -35,6 +35,9 @@ local middleColumn = 1.5 -- middle column for 4k but accounting for trackvector local handspecific = false local left = false +local down = false +local up = false +local right = false local middle = false local function fitX(x) -- Scale time values to fit within plot width. @@ -155,14 +158,17 @@ local o = if not handspecific then -- moving from none to left handspecific = true left = true - elseif handspecific and left then -- moving from left to middle - if oddColumns then - middle = true - end + elseif handspecific and left then + down = true left = false - elseif handspecific and middle then -- moving from middle to right - middle = false - elseif handspecific and not left then -- moving from right to none + elseif handspecific and down then + down = false + up = true + elseif handspecific and up then + up = false + right = true + elseif handspecific and right then -- moving from right to none + right = false handspecific = false end MESSAGEMAN:Broadcast("JudgeDisplayChanged") @@ -316,19 +322,25 @@ o[#o + 1] = -- remember that time i removed redundancy in this code 2 days ago and then did this -mina if ntt[i] ~= "TapNoteType_Mine" then if handspecific and left then - if ctt[i] < middleColumn then + if ctt[i] == 0 then setOffsetVerts(verts, x, y, cullur) else setOffsetVerts(verts, x, y, cullurFaded) -- highlight left end - elseif handspecific and middle then - if ctt[i] == middleColumn then + elseif handspecific and down then + if ctt[i] == 1 then setOffsetVerts(verts, x, y, cullur) else - setOffsetVerts(verts, x, y, cullurFaded) -- highlight middle + setOffsetVerts(verts, x, y, cullurFaded) end - elseif handspecific then - if ctt[i] > middleColumn then + elseif handspecific and up then + if ctt[i] == 2 then + setOffsetVerts(verts, x, y, cullur) + else + setOffsetVerts(verts, x, y, cullurFaded) + end + elseif handspecific and right then + if ctt[i] == 3 then setOffsetVerts(verts, x, y, cullur) else setOffsetVerts(verts, x, y, cullurFaded) -- highlight right @@ -352,11 +364,13 @@ o[#o + 1] = if #ntt > 0 then if handspecific then if left then - self:settext(translated_info["Left"]) - elseif middle then - self:settext(translated_info["Middle"]) - else - self:settext(translated_info["Right"]) + self:settext("left") + elseif down then + self:settext("down") + elseif up then + self:settext("up") + elseif right then + self:settext("right") end else self:settext(translated_info["Down"]) From 9a288d5228a575fe0dfbf7ef49a1e497041ad8fe Mon Sep 17 00:00:00 2001 From: James Date: Mon, 6 Jul 2020 00:48:13 -0400 Subject: [PATCH 002/355] Remove libssh2 requirement Curl will build as many features as possible based on the packages that are installed on your system. It so happens that Github Actions has libssh2 installed by default on mac. Curl finds libssh2, and builds with it, even though etterna doesn't strictly need it. --- extern/CMakeLists.txt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/extern/CMakeLists.txt b/extern/CMakeLists.txt index 9706facb01..d403d216e6 100644 --- a/extern/CMakeLists.txt +++ b/extern/CMakeLists.txt @@ -13,8 +13,10 @@ set(BUILD_SHARED_LIBS OFF) # Tell CMake to prefer static libs # External Libraries ## Curl Specific Options +set(CMAKE_USE_LIBSSH2 OFF CACHE BOOL "" FORCE) # Disable curl libssh2 +set(BUILD_CURL_EXE OFF CACHE BOOL "" FORCE) # Tell curl not to build standalone binary set(BUILD_TESTING OFF CACHE BOOL "" FORCE) # Disable curl testing -set(CMAKE_USE_OPENSSL ON CACHE BOOL "" FORCE) # Require OpenSSL +set(CMAKE_USE_OPENSSL ON CACHE BOOL "" FORCE) # Require OpenSSL set(HTTP_ONLY ON CACHE BOOL "" FORCE) # Disable all protocols except HTTP/S add_subdirectory(curl) From a8728a28dc70563000480cc9f9457cb5298d0f30 Mon Sep 17 00:00:00 2001 From: "born a rick, raised a morty, died a jerry" Date: Wed, 8 Jul 2020 01:12:56 -0400 Subject: [PATCH 003/355] make length sort use steps length, not music file length --- src/Etterna/Models/Songs/SongUtil.cpp | 34 ++++++++++++++++++++------- 1 file changed, 26 insertions(+), 8 deletions(-) diff --git a/src/Etterna/Models/Songs/SongUtil.cpp b/src/Etterna/Models/Songs/SongUtil.cpp index 72bc1d54a3..77051bb5e9 100644 --- a/src/Etterna/Models/Songs/SongUtil.cpp +++ b/src/Etterna/Models/Songs/SongUtil.cpp @@ -415,18 +415,36 @@ SongUtil::SortSongPointerArrayByBPM(vector& vpSongsInOut) } static bool -CompareSongPointersByLength(const Song* pSong1, const Song* pSong2) -{ - const float length1 = pSong1->m_fMusicLengthSeconds; - const float length2 = pSong2->m_fMusicLengthSeconds; +CompareSongPointersByLength(const Song* a, const Song* b) +{ + auto len_a = 0.F; + for (const auto& s : a->GetAllSteps()) { + // if we hit the current preferred difficulty just force use the value + if (s->GetDifficulty() == GAMESTATE->m_PreferredDifficulty) { + len_a = s->lastsecond; + break; + } + + len_a = s->lastsecond > len_a ? s->lastsecond : len_a; + } + + // OH NO COPY PASTE WHAT EVER WILL WE DO MAYBE USE A 10 LINE MACRO???? + auto len_b = 0.F; + for (const auto& s : b->GetAllSteps()) { + if (s->GetDifficulty() == GAMESTATE->m_PreferredDifficulty) { + len_b = s->lastsecond; + break; + } + + len_b = s->lastsecond > len_b ? s->lastsecond : len_b; + } - if (length1 < length2) + if (len_a < len_b) return true; - if (length1 > length2) + if (len_a > len_b) return false; - return CompareRStringsAsc(pSong1->GetSongFilePath(), - pSong2->GetSongFilePath()); + return CompareRStringsAsc(a->GetSongFilePath(), b->GetSongFilePath()); } void From 288c6a9e60edd484be9d188cbee322a87a6a53d5 Mon Sep 17 00:00:00 2001 From: "born a rick, raised a morty, died a jerry" Date: Wed, 8 Jul 2020 01:51:18 -0400 Subject: [PATCH 004/355] move the wifegradepercent function into grade.h so we can reuse it --- src/Etterna/Models/Misc/Grade.cpp | 55 ++++++++++++++++++++ src/Etterna/Models/Misc/Grade.h | 10 ++-- src/Etterna/Models/Misc/HighScore.cpp | 51 ++---------------- src/Etterna/Models/Misc/PlayerStageStats.cpp | 42 +-------------- 4 files changed, 63 insertions(+), 95 deletions(-) diff --git a/src/Etterna/Models/Misc/Grade.cpp b/src/Etterna/Models/Misc/Grade.cpp index 316a3e2e4d..dd96e84c60 100644 --- a/src/Etterna/Models/Misc/Grade.cpp +++ b/src/Etterna/Models/Misc/Grade.cpp @@ -5,6 +5,7 @@ #include "RageUtil/Misc/RageLog.h" #include "RageUtil/Utils/RageUtil.h" #include "Etterna/Singletons/ThemeManager.h" +#include "Etterna/Singletons/PrefsManager.h" LuaXType(Grade); @@ -86,3 +87,57 @@ StringToGrade(const std::string& sGrade) LOG->Warn("Invalid grade: %s", sGrade.c_str()); return Grade_Invalid; }; + +// get appropriated (for when we have scores but no highscore object to get +// wifegrades) -mina +Grade +GetGradeFromPercent(float pc) +{ + if (pc >= 0.99996F) { + return Grade_Tier01; + } + if (PREFSMAN->m_bUseMidGrades && pc >= 0.9998F) { + return Grade_Tier02; + } + if (PREFSMAN->m_bUseMidGrades && pc >= 0.9997F) { + return Grade_Tier03; + } + if (pc >= 0.99955F) { + return Grade_Tier04; + } + if (PREFSMAN->m_bUseMidGrades && pc >= 0.999F) { + return Grade_Tier05; + } + if (PREFSMAN->m_bUseMidGrades && pc >= 0.998F) { + return Grade_Tier06; + } + if (pc >= 0.997F) { + return Grade_Tier07; + } + if (PREFSMAN->m_bUseMidGrades && pc >= 0.99F) { + return Grade_Tier08; + } + if (PREFSMAN->m_bUseMidGrades && pc >= 0.965F) { + return Grade_Tier09; + } + if (pc >= 0.93F) { + return Grade_Tier10; + } + if (PREFSMAN->m_bUseMidGrades && pc >= 0.9F) { + return Grade_Tier11; + } + if (PREFSMAN->m_bUseMidGrades && pc >= 0.85F) { + return Grade_Tier12; + } + if (pc >= 0.8F) { + return Grade_Tier13; + } + if (pc >= 0.7F) { + return Grade_Tier14; + } + if (pc >= 0.6F) { + return Grade_Tier15; + } + + return Grade_Tier16; +} diff --git a/src/Etterna/Models/Misc/Grade.h b/src/Etterna/Models/Misc/Grade.h index 987d7557b1..3a178dc638 100644 --- a/src/Etterna/Models/Misc/Grade.h +++ b/src/Etterna/Models/Misc/Grade.h @@ -4,11 +4,6 @@ #include "EnumHelper.h" #include "ThemeMetric.h" -/** @brief The list of grading tiers available. - * - * TODO: Look into a more flexible system without a fixed number of grades. - * -Wolfman2000 - */ enum Grade { Grade_Tier01, /**< Usually an AAAAA */ @@ -44,7 +39,7 @@ enum Grade * @param g the grade to convert. * @return the string reprsentation. */ -static inline auto +static auto GradeToString(Grade g) -> std::string { ASSERT_M((g >= 0 && g < NUM_Grade) || g == Grade_Invalid, @@ -95,3 +90,6 @@ GetNextPossibleGrade(Grade g) -> Grade; (g) = GetNextPossibleGrade(g)) #endif + +auto +GetGradeFromPercent(float pc) -> Grade; diff --git a/src/Etterna/Models/Misc/HighScore.cpp b/src/Etterna/Models/Misc/HighScore.cpp index 2788c515c6..385ae70dca 100644 --- a/src/Etterna/Models/Misc/HighScore.cpp +++ b/src/Etterna/Models/Misc/HighScore.cpp @@ -152,58 +152,13 @@ HighScoreImpl::GetWifeGrade() const -> Grade return Grade_Failed; } - auto prc = fWifeScore; + auto pc = fWifeScore; if (PREFSMAN->m_bSortBySSRNorm) { - prc = fSSRNormPercent; + pc = fSSRNormPercent; } - if (prc >= 0.99996F) { - return Grade_Tier01; - } - if (PREFSMAN->m_bUseMidGrades && prc >= 0.9998F) { - return Grade_Tier02; - } - if (PREFSMAN->m_bUseMidGrades && prc >= 0.9997F) { - return Grade_Tier03; - } - if (prc >= 0.99955F) { - return Grade_Tier04; - } - if (PREFSMAN->m_bUseMidGrades && prc >= 0.999F) { - return Grade_Tier05; - } - if (PREFSMAN->m_bUseMidGrades && prc >= 0.998F) { - return Grade_Tier06; - } - if (prc >= 0.997F) { - return Grade_Tier07; - } - if (PREFSMAN->m_bUseMidGrades && prc >= 0.99F) { - return Grade_Tier08; - } - if (PREFSMAN->m_bUseMidGrades && prc >= 0.965F) { - return Grade_Tier09; - } - if (prc >= 0.93F) { - return Grade_Tier10; - } - if (PREFSMAN->m_bUseMidGrades && prc >= 0.9F) { - return Grade_Tier11; - } - if (PREFSMAN->m_bUseMidGrades && prc >= 0.85F) { - return Grade_Tier12; - } - if (prc >= 0.8F) { - return Grade_Tier13; - } - if (prc >= 0.7F) { - return Grade_Tier14; - } - if (prc >= 0.6F) { - return Grade_Tier15; - } - return Grade_Tier16; + return GetGradeFromPercent(pc); } void diff --git a/src/Etterna/Models/Misc/PlayerStageStats.cpp b/src/Etterna/Models/Misc/PlayerStageStats.cpp index 0cba42e47d..56b077177f 100644 --- a/src/Etterna/Models/Misc/PlayerStageStats.cpp +++ b/src/Etterna/Models/Misc/PlayerStageStats.cpp @@ -38,9 +38,6 @@ static ThemeMetric g_MineHitIncrementsMissCombo( const float LESSON_PASS_THRESHOLD = 0.8f; -Grade -GetGradeFromPercent(float fPercent); - void PlayerStageStats::InternalInit() { @@ -189,44 +186,6 @@ PlayerStageStats::AddStats(const PlayerStageStats& other) } } -// get appropriated (for when we have scores but no highscore object to get -// wifegrades) -mina -Grade -GetGradeFromPercent(float fPercent) -{ - if (fPercent >= 0.99996f) - return Grade_Tier01; - if (PREFSMAN->m_bUseMidGrades && fPercent >= 0.9998f) - return Grade_Tier02; - if (PREFSMAN->m_bUseMidGrades && fPercent >= 0.9997f) - return Grade_Tier03; - if (fPercent >= 0.99955f) - return Grade_Tier04; - if (PREFSMAN->m_bUseMidGrades && fPercent >= 0.999f) - return Grade_Tier05; - if (PREFSMAN->m_bUseMidGrades && fPercent >= 0.998f) - return Grade_Tier06; - if (fPercent >= 0.997f) - return Grade_Tier07; - if (PREFSMAN->m_bUseMidGrades && fPercent >= 0.99f) - return Grade_Tier08; - if (PREFSMAN->m_bUseMidGrades && fPercent >= 0.965f) - return Grade_Tier09; - if (fPercent >= 0.93f) - return Grade_Tier10; - if (PREFSMAN->m_bUseMidGrades && fPercent >= 0.9f) - return Grade_Tier11; - if (PREFSMAN->m_bUseMidGrades && fPercent >= 0.85f) - return Grade_Tier12; - if (fPercent >= 0.8f) - return Grade_Tier13; - if (fPercent >= 0.7f) - return Grade_Tier14; - if (fPercent >= 0.6f) - return Grade_Tier15; - return Grade_Tier16; -} - Grade PlayerStageStats::GetWifeGrade() { @@ -241,6 +200,7 @@ PlayerStageStats::GetGrade(float p) { return GetGradeFromPercent(p); } + Grade PlayerStageStats::GetGrade() const { From b3c2724f6d2bc7aa103e4abbf287c6fdfa90dede Mon Sep 17 00:00:00 2001 From: "born a rick, raised a morty, died a jerry" Date: Wed, 8 Jul 2020 02:28:50 -0400 Subject: [PATCH 005/355] actually make length sort sort length make actually --- src/Etterna/Models/Songs/SongUtil.cpp | 32 ++++++++++++++++++++++----- 1 file changed, 27 insertions(+), 5 deletions(-) diff --git a/src/Etterna/Models/Songs/SongUtil.cpp b/src/Etterna/Models/Songs/SongUtil.cpp index 77051bb5e9..9ef7fa43e7 100644 --- a/src/Etterna/Models/Songs/SongUtil.cpp +++ b/src/Etterna/Models/Songs/SongUtil.cpp @@ -419,24 +419,29 @@ CompareSongPointersByLength(const Song* a, const Song* b) { auto len_a = 0.F; for (const auto& s : a->GetAllSteps()) { + const auto& len = + s->GetTimingData()->GetElapsedTimeFromBeat(a->GetLastBeat()); // if we hit the current preferred difficulty just force use the value if (s->GetDifficulty() == GAMESTATE->m_PreferredDifficulty) { - len_a = s->lastsecond; + len_a = len; break; } - len_a = s->lastsecond > len_a ? s->lastsecond : len_a; + len_a = len > len_a ? len : len_a; } // OH NO COPY PASTE WHAT EVER WILL WE DO MAYBE USE A 10 LINE MACRO???? auto len_b = 0.F; for (const auto& s : b->GetAllSteps()) { + const auto& len = + s->GetTimingData()->GetElapsedTimeFromBeat(b->GetLastBeat()); + if (s->GetDifficulty() == GAMESTATE->m_PreferredDifficulty) { - len_b = s->lastsecond; + len_b = len; break; } - len_b = s->lastsecond > len_b ? s->lastsecond : len_b; + len_b = len > len_b ? len : len_b; } if (len_a < len_b) @@ -468,6 +473,7 @@ CompDescending(const pair& a, const pair& b) { return a.second < b.second; } + static bool CompAscending(const pair& a, const pair& b) { @@ -677,7 +683,23 @@ SongUtil::GetSectionNameFromSongAndSort(const Song* pSong, SortOrder so) return std::string(); case SORT_LENGTH: { const auto iSortLengthSize = 60; - auto iMaxLength = static_cast(pSong->m_fMusicLengthSeconds); + + auto len_a = 0.F; + // should probably be an actual util function because copy pasted + // from length sort above + for (const auto& s : pSong->GetAllSteps()) { + const auto& len = s->GetTimingData()->GetElapsedTimeFromBeat( + pSong->GetLastBeat()); + + if (s->GetDifficulty() == GAMESTATE->m_PreferredDifficulty) { + len_a = len; + break; + } + + len_a = len > len_a ? len : len_a; + } + + auto iMaxLength = static_cast(len_a); iMaxLength += (iSortLengthSize - (iMaxLength % iSortLengthSize) - 1); const auto iMinLength = iMaxLength - (iSortLengthSize - 1); From fa53de0956f40269e35fd1dffea02abf4a9810f9 Mon Sep 17 00:00:00 2001 From: "born a rick, raised a morty, died a jerry" Date: Wed, 8 Jul 2020 03:02:12 -0400 Subject: [PATCH 006/355] add getbestwifescore to sort grades by that should work but doesn't --- src/Etterna/Models/Misc/Profile.cpp | 38 +++++++++++++++---------- src/Etterna/Models/Misc/Profile.h | 1 + src/Etterna/Models/Songs/SongUtil.cpp | 6 ++-- src/Etterna/Singletons/ScoreManager.cpp | 9 ++++-- src/Etterna/Singletons/ScoreManager.h | 14 ++++++++- 5 files changed, 46 insertions(+), 22 deletions(-) diff --git a/src/Etterna/Models/Misc/Profile.cpp b/src/Etterna/Models/Misc/Profile.cpp index 4ef33a2d1f..a79f7b4dd5 100644 --- a/src/Etterna/Models/Misc/Profile.cpp +++ b/src/Etterna/Models/Misc/Profile.cpp @@ -163,8 +163,8 @@ Profile::SetDefaultModifiers(const Game* pGameType, m_sDefaultModifiers[pGameType->m_szName] = sModifiers; } -Grade -Profile::GetBestGrade(const Song* pSong, StepsType st) const +auto +Profile::GetBestGrade(const Song* pSong, StepsType st) const -> Grade { auto gradeBest = Grade_Invalid; if (pSong != nullptr) { @@ -181,24 +181,32 @@ Profile::GetBestGrade(const Song* pSong, StepsType st) const } } } - // If no grade was found for the current style/stepstype - if (!hasCurrentStyleSteps) { - // Get the best grade among all steps - const auto& allSteps = pSong->GetAllSteps(); - for (const auto& stepsPtr : allSteps) { - if (stepsPtr->m_StepsType == - st) // Skip already checked steps of type st - continue; - const auto dcg = - SCOREMAN->GetBestGradeFor(stepsPtr->GetChartKey()); - if (gradeBest >= dcg) { - gradeBest = dcg; + } + + return gradeBest; +} + +auto +Profile::GetBestWifeScore(const Song* pSong, StepsType st) const -> float +{ + auto scorebest = 0.F; + if (pSong != nullptr) { + auto hasCurrentStyleSteps = false; + FOREACH_ENUM_N(Difficulty, 6, i) + { + auto* pSteps = SongUtil::GetStepsByDifficulty(pSong, st, i); + if (pSteps != nullptr) { + hasCurrentStyleSteps = true; + const auto wsb = + SCOREMAN->GetBestWifeScoreFor(pSteps->GetChartKey()); + if (scorebest >= wsb) { + scorebest = wsb; } } } } - return gradeBest; + return scorebest; } void diff --git a/src/Etterna/Models/Misc/Profile.h b/src/Etterna/Models/Misc/Profile.h index 2b513eb49e..bc3e832afb 100644 --- a/src/Etterna/Models/Misc/Profile.h +++ b/src/Etterna/Models/Misc/Profile.h @@ -277,6 +277,7 @@ class Profile // this actually does use scoreman atm auto GetBestGrade(const Song* pSong, StepsType st) const -> Grade; + auto GetBestWifeScore(const Song* pSong, StepsType st) const -> float; // Screenshot Data std::vector m_vScreenshots; diff --git a/src/Etterna/Models/Songs/SongUtil.cpp b/src/Etterna/Models/Songs/SongUtil.cpp index 9ef7fa43e7..135627361b 100644 --- a/src/Etterna/Models/Songs/SongUtil.cpp +++ b/src/Etterna/Models/Songs/SongUtil.cpp @@ -486,18 +486,18 @@ SongUtil::SortSongPointerArrayByGrades(vector& vpSongsInOut, { /* Optimize by pre-writing a string to compare, since doing * GetNumNotesWithGrade inside the sort is too slow. */ - typedef pair val; + typedef pair val; vector vals; vals.reserve(vpSongsInOut.size()); const Profile* pProfile = PROFILEMAN->GetProfile(PLAYER_1); for (auto* pSong : vpSongsInOut) { - ASSERT(pProfile != NULL); + ASSERT(pProfile != nullptr); auto g = static_cast(pProfile->GetBestGrade( pSong, GAMESTATE->GetCurrentStyle(GAMESTATE->GetMasterPlayerNumber()) ->m_StepsType)); - vals.push_back(val(pSong, g)); + vals.emplace_back(val(pSong, g)); } sort( diff --git a/src/Etterna/Singletons/ScoreManager.cpp b/src/Etterna/Singletons/ScoreManager.cpp index 2118377b36..820897a248 100644 --- a/src/Etterna/Singletons/ScoreManager.cpp +++ b/src/Etterna/Singletons/ScoreManager.cpp @@ -67,6 +67,7 @@ ScoresAtRate::AddScore(HighScore& hs) -> HighScore* { auto& key = hs.GetScoreKey(); bestGrade = std::min(hs.GetWifeGrade(), bestGrade); + bestWifeScore = std::max(hs.GetWifeScore(), bestWifeScore); scores.emplace(key, hs); if ((PBptr == nullptr) || @@ -195,6 +196,7 @@ auto ScoresForChart::AddScore(HighScore& hs) -> HighScore* { bestGrade = std::min(hs.GetWifeGrade(), bestGrade); + bestWifeScore = std::max(hs.GetWifeScore(), bestWifeScore); auto rate = hs.GetMusicRate(); auto key = RateToKey(rate); @@ -823,7 +825,8 @@ ScoreManager::SortTopSSRPtrsForGame(Skillset ss, const string& profileID) { TopSSRsForGame.clear(); for (auto& i : pscores[profileID]) { - if (!SONGMAN->IsChartLoaded(i.first) || !SONGMAN->GetStepsByChartkey(i.first)->IsPlayableForCurrentGame()) { + if (!SONGMAN->IsChartLoaded(i.first) || + !SONGMAN->GetStepsByChartkey(i.first)->IsPlayableForCurrentGame()) { continue; } for (auto& hs : i.second.GetAllPBPtrs()) { @@ -1152,8 +1155,8 @@ class LunaScoreManager : public Luna static auto GetTopSSRHighScoreForGame(T* p, lua_State* L) -> int { - HighScore* ths = - p->GetTopSSRHighScoreForGame(IArg(1) - 1, Enum::Check(L, 2)); + HighScore* ths = p->GetTopSSRHighScoreForGame( + IArg(1) - 1, Enum::Check(L, 2)); if (ths != nullptr) { ths->PushSelf(L); } else { diff --git a/src/Etterna/Singletons/ScoreManager.h b/src/Etterna/Singletons/ScoreManager.h index 1a4cf653a7..fa814c7ddc 100644 --- a/src/Etterna/Singletons/ScoreManager.h +++ b/src/Etterna/Singletons/ScoreManager.h @@ -22,6 +22,7 @@ struct ScoresAtRate // -technically- your pb could be a fail grade so use "bestgrade" -mina Grade bestGrade; + float bestWifeScore = 0.F; auto AddScore(HighScore& hs) -> HighScore*; @@ -47,6 +48,7 @@ struct ScoresForChart ScoresForChart(); Grade bestGrade = Grade_Invalid; // best grade for any rate + float bestWifeScore = 0.F; auto GetPBAt(float rate) -> HighScore*; auto GetPBUpTo(float rate) -> HighScore*; @@ -135,6 +137,17 @@ class ScoreManager return Grade_Invalid; } + [[nodiscard]] auto GetBestWifeScoreFor( + const std::string& ck, + const std::string& profileID = + PROFILEMAN->GetProfile(PLAYER_1)->m_sProfileID) const -> float + { + if (KeyHasScores(ck, profileID)) { + return pscores.at(profileID).at(ck).bestWifeScore; + } + return Grade_Invalid; + } + // for scores achieved during this session // now returns top score status because i'm bad at coding --lurker auto AddScore(const HighScore& hs_, @@ -176,7 +189,6 @@ class ScoreManager auto GetTopSSRHighScore(unsigned int rank, int ss) -> HighScore*; auto GetTopSSRHighScoreForGame(unsigned int rank, int ss) -> HighScore*; - [[nodiscard]] auto KeyHasScores( const std::string& ck, const std::string& profileID = From ca6b8f648c7fdbfe383a4245985566ce66a8dcda Mon Sep 17 00:00:00 2001 From: "born a rick, raised a morty, died a jerry" Date: Wed, 8 Jul 2020 03:32:55 -0400 Subject: [PATCH 007/355] remove preferred/recent/popular sorts from game, remove extra stage info --- .../ScreenSelectMusic overlay/currentsort.lua | 3 - Themes/_fallback/metrics.ini | 4 +- src/Etterna/Actor/Menus/MusicWheel.cpp | 28 +--- .../Models/Misc/GameConstantsAndTypes.cpp | 12 +- .../Models/Misc/GameConstantsAndTypes.h | 12 +- src/Etterna/Models/Songs/SongUtil.cpp | 5 - src/Etterna/Singletons/SongManager.cpp | 154 ++---------------- src/Etterna/Singletons/SongManager.h | 11 -- 8 files changed, 23 insertions(+), 206 deletions(-) diff --git a/Themes/Til Death/BGAnimations/ScreenSelectMusic overlay/currentsort.lua b/Themes/Til Death/BGAnimations/ScreenSelectMusic overlay/currentsort.lua index d6cce512d5..8f2bcf4bd0 100644 --- a/Themes/Til Death/BGAnimations/ScreenSelectMusic overlay/currentsort.lua +++ b/Themes/Til Death/BGAnimations/ScreenSelectMusic overlay/currentsort.lua @@ -23,17 +23,14 @@ local frameX = SCREEN_WIDTH - 5 local frameY = 15 local sortTable = { - SortOrder_Preferred = THEME:GetString("SortOrder", "Preferred"), SortOrder_Group = THEME:GetString("SortOrder", "Group"), SortOrder_Title = THEME:GetString("SortOrder", "Title"), SortOrder_BPM = THEME:GetString("SortOrder", "BPM"), - SortOrder_Popularity = THEME:GetString("SortOrder", "Popularity"), SortOrder_TopGrades = THEME:GetString("SortOrder", "TopGrades"), SortOrder_Artist = THEME:GetString("SortOrder", "Artist"), SortOrder_Genre = THEME:GetString("SortOrder", "Genre"), SortOrder_ModeMenu = THEME:GetString("SortOrder", "ModeMenu"), SortOrder_Length = THEME:GetString("SortOrder", "Length"), - SortOrder_Recent = THEME:GetString("SortOrder", "Recent"), SortOrder_Favorites = THEME:GetString("SortOrder", "Favorites"), SortOrder_Overall = THEME:GetString("SortOrder", "Overall"), SortOrder_Stream = THEME:GetString("SortOrder", "Stream"), diff --git a/Themes/_fallback/metrics.ini b/Themes/_fallback/metrics.ini index a25de05b19..c1601cdbcc 100644 --- a/Themes/_fallback/metrics.ini +++ b/Themes/_fallback/metrics.ini @@ -602,12 +602,10 @@ RecentSongsToShow=30 UseEasyMarkerFlag=false -ModeMenuChoiceNames="Preferred,Group,Title,Bpm,Popularity,TopGrades,Artist,Genre,Recent,Favorites,Overall,Stream,Jumpstream,Handstream,Stamina,JackSpeed,Chordjack,Technical,Length" -ChoicePreferred="sort,Preferred" +ModeMenuChoiceNames="Group,Title,Bpm,TopGrades,Artist,Genre,Recent,Favorites,Overall,Stream,Jumpstream,Handstream,Stamina,JackSpeed,Chordjack,Technical,Length" ChoiceGroup="sort,Group" ChoiceTitle="sort,Title" ChoiceBpm="sort,BPM" -ChoicePopularity="sort,Popularity" ChoiceTopGrades="sort,TopGrades" ChoiceArtist="sort,Artist" ChoiceGenre="sort,Genre" diff --git a/src/Etterna/Actor/Menus/MusicWheel.cpp b/src/Etterna/Actor/Menus/MusicWheel.cpp index 2fa818b4cb..1c447bc731 100644 --- a/src/Etterna/Actor/Menus/MusicWheel.cpp +++ b/src/Etterna/Actor/Menus/MusicWheel.cpp @@ -376,13 +376,6 @@ MusicWheel::GetSongList(vector& arraySongs, SortOrder so) const case SORT_FAVORITES: SONGMAN->GetFavoriteSongs(apAllSongs); break; - case SORT_PREFERRED: - SONGMAN->GetPreferredSortSongs(apAllSongs); - break; - case SORT_POPULARITY: - // todo: make this work -poco - // apAllSongs = SONGMAN->GetPopularSongs(); - // break; case SORT_GROUP: // if we're not using sections with a preferred song group, and // there is a group to load, only load those songs. -aj @@ -803,8 +796,6 @@ MusicWheel::BuildWheelItemDatas( // sort the songs switch (so) { case SORT_FAVORITES: - case SORT_PREFERRED: - // obey order specified by the preferred sort list break; case SORT_GROUP: SongUtil::SortSongPointerArrayByGroupAndTitle(arraySongs); @@ -821,14 +812,6 @@ MusicWheel::BuildWheelItemDatas( case SORT_BPM: SongUtil::SortSongPointerArrayByBPM(arraySongs); break; - case SORT_POPULARITY: - if (static_cast(arraySongs.size()) > - MOST_PLAYED_SONGS_TO_SHOW) - arraySongs.erase(arraySongs.begin() + - MOST_PLAYED_SONGS_TO_SHOW, - arraySongs.end()); - bUseSections = false; - break; case SORT_TOP_GRADES: SongUtil::SortSongPointerArrayByGrades(arraySongs, true); break; @@ -838,12 +821,6 @@ MusicWheel::BuildWheelItemDatas( case SORT_GENRE: SongUtil::SortSongPointerArrayByGenre(arraySongs); break; - case SORT_RECENT: - if (static_cast(arraySongs.size()) > RECENT_SONGS_TO_SHOW) - arraySongs.erase(arraySongs.begin() + RECENT_SONGS_TO_SHOW, - arraySongs.end()); - bUseSections = false; - break; case SORT_Overall: SongUtil::SortSongPointerArrayByGroupAndMSD(arraySongs, Skill_Overall); @@ -910,10 +887,11 @@ MusicWheel::BuildWheelItemDatas( * sort. */ switch (so) { case SORT_FAVORITES: - case SORT_PREFERRED: - case SORT_TOP_GRADES: case SORT_BPM: break; // don't sort by section + case SORT_TOP_GRADES: + SongUtil::SortSongPointerArrayByWifeScore(arraySongs, so); + break; default: SongUtil::SortSongPointerArrayBySectionName(arraySongs, so); break; diff --git a/src/Etterna/Models/Misc/GameConstantsAndTypes.cpp b/src/Etterna/Models/Misc/GameConstantsAndTypes.cpp index 85ddee4a57..7dcd50d81f 100644 --- a/src/Etterna/Models/Misc/GameConstantsAndTypes.cpp +++ b/src/Etterna/Models/Misc/GameConstantsAndTypes.cpp @@ -93,12 +93,12 @@ static const char* GameplayModeNames[] = { XToString(GameplayMode); LuaXType(GameplayMode); -static const char* SortOrderNames[] = { - "Preferred", "Group", "Title", "BPM", "Popularity", - "TopGrades", "Artist", "Genre", "ModeMenu", "Recent", - "Favorites", "Overall", "Stream", "Jumpstream", "Handstream", - "Stamina", "JackSpeed", "Chordjack", "Technical", "Length" -}; +static const char* SortOrderNames[] = { "Group", "Title", "BPM", + "TopGrades", "Artist", "Genre", + "ModeMenu", "Favorites", "Overall", + "Stream", "Jumpstream", "Handstream", + "Stamina", "JackSpeed", "Chordjack", + "Technical", "Length" }; XToString(SortOrder); StringToX(SortOrder); LuaXType(SortOrder); diff --git a/src/Etterna/Models/Misc/GameConstantsAndTypes.h b/src/Etterna/Models/Misc/GameConstantsAndTypes.h index b869f94763..4539719d93 100644 --- a/src/Etterna/Models/Misc/GameConstantsAndTypes.h +++ b/src/Etterna/Models/Misc/GameConstantsAndTypes.h @@ -161,18 +161,13 @@ LuaDeclareType(PlayMode); */ enum SortOrder { - // song sorts - SORT_PREFERRED, /**< Sort by the user's preferred settings. */ SORT_GROUP, /**< Sort by the groups the Songs are in. */ SORT_TITLE, /**< Sort by the Song's title. */ SORT_BPM, /**< Sort by the Song's BPM. */ - SORT_POPULARITY, /**< Sort by how popular the Song is. */ SORT_TOP_GRADES, /**< Sort by the highest grades earned on a Song. */ SORT_ARTIST, /**< Sort by the name of the artist of the Song. */ SORT_GENRE, /**< Sort by the Song's genre. */ - // - SORT_MODE_MENU, /**< Have access to the menu for choosing the sort. */ - SORT_RECENT, + SORT_MODE_MENU, /**< Have access to the menu for choosing the sort. */ SORT_FAVORITES, SORT_Overall, SORT_Stream, @@ -186,8 +181,7 @@ enum SortOrder NUM_SortOrder, SortOrder_Invalid }; -/** @brief Only allow certain sort modes to be selectable. */ -const SortOrder MAX_SELECTABLE_SORT = static_cast(SORT_RECENT - 1); + /** * @brief Turn the sort order into a proper string. * @param so the sort order. @@ -218,7 +212,7 @@ LuaDeclareType(SortOrder); inline auto IsSongSort(SortOrder so) -> bool { - return so >= SORT_PREFERRED && so <= SORT_GENRE; + return so >= SORT_GROUP && so <= SORT_GENRE; } /** @brief The list of tap note scores available during play. */ diff --git a/src/Etterna/Models/Songs/SongUtil.cpp b/src/Etterna/Models/Songs/SongUtil.cpp index 135627361b..5222be5723 100644 --- a/src/Etterna/Models/Songs/SongUtil.cpp +++ b/src/Etterna/Models/Songs/SongUtil.cpp @@ -626,8 +626,6 @@ SongUtil::GetSectionNameFromSongAndSort(const Song* pSong, SortOrder so) switch (so) { case SORT_FAVORITES: - case SORT_PREFERRED: - return SONGMAN->SongToPreferredSortSectionName(pSong); case SORT_GROUP: case SORT_Overall: case SORT_Stream: @@ -678,9 +676,6 @@ SongUtil::GetSectionNameFromSongAndSort(const Song* pSong, SortOrder so) } return std::string(); } - case SORT_POPULARITY: - case SORT_RECENT: - return std::string(); case SORT_LENGTH: { const auto iSortLengthSize = 60; diff --git a/src/Etterna/Singletons/SongManager.cpp b/src/Etterna/Singletons/SongManager.cpp index f8d93ab649..7a3be54ad9 100644 --- a/src/Etterna/Singletons/SongManager.cpp +++ b/src/Etterna/Singletons/SongManager.cpp @@ -22,7 +22,6 @@ #include "Etterna/Globals/SpecialFiles.h" #include "Etterna/Models/StepsAndStyles/Steps.h" #include "Etterna/Models/StepsAndStyles/StepsUtil.h" -#include "Etterna/Models/StepsAndStyles/Style.h" #include "ThemeManager.h" #include "Etterna/Models/Misc/TitleSubstitution.h" #include "arch/LoadingWindow/LoadingWindow.h" @@ -1108,32 +1107,6 @@ SongManager::GetFavoriteSongs(vector& songs) const } } -void -SongManager::GetPreferredSortSongs(vector& AddTo) const -{ - if (m_vPreferredSongSort.empty()) { - AddTo.insert(AddTo.end(), m_pSongs.begin(), m_pSongs.end()); - return; - } - - FOREACH_CONST(PreferredSortSection, m_vPreferredSongSort, v) - AddTo.insert(AddTo.end(), v->vpSongs.begin(), v->vpSongs.end()); -} - -std::string -SongManager::SongToPreferredSortSectionName(const Song* pSong) const -{ - FOREACH_CONST(PreferredSortSection, m_vPreferredSongSort, v) - { - FOREACH_CONST(Song*, v->vpSongs, s) - { - if (*s == pSong) - return v->sName; - } - } - return std::string(); -} - int SongManager::GetNumSongs() const { @@ -1272,94 +1245,6 @@ CompareNotesPointersForExtra(const Steps* n1, const Steps* n2) return StepsUtil::CompareNotesPointersByRadarValues(n1, n2); } -void -SongManager::GetExtraStageInfo(bool bExtra2, - const Style* sd, - Song*& pSongOut, - Steps*& pStepsOut) -{ - std::string sGroup = GAMESTATE->m_sPreferredSongGroup; - if (sGroup == GROUP_ALL) { - if (GAMESTATE->m_pCurSong == nullptr) { - // This normally shouldn't happen, but it's helpful to - // permit it for testing. - LuaHelpers::ReportScriptErrorFmt("GetExtraStageInfo() called in " - "GROUP_ALL, but " - "GAMESTATE->m_pCurSong == NULL"); - GAMESTATE->m_pCurSong.Set(GetRandomSong()); - } - sGroup = GAMESTATE->m_pCurSong->m_sGroupName; - } - - ASSERT_M(sGroup != "", - ssprintf("%p '%s' '%s'", - GAMESTATE->m_pCurSong.Get(), - GAMESTATE->m_pCurSong - ? GAMESTATE->m_pCurSong->GetSongDir().c_str() - : "", - GAMESTATE->m_pCurSong - ? GAMESTATE->m_pCurSong->m_sGroupName.c_str() - : "")); - - // Choose a hard song for the extra stage - Song* pExtra1Song = nullptr; // the absolute hardest Song and Steps. - // Use this for extra stage 1. - Steps* pExtra1Notes = nullptr; - Song* pExtra2Song = nullptr; // a medium-hard Song and Steps. Use this - // for extra stage 2. - Steps* pExtra2Notes = nullptr; - - const auto& apSongs = GetSongs(sGroup); - for (unsigned s = 0; s < apSongs.size(); s++) // foreach song - { - auto pSong = apSongs[s]; - - vector apSteps; - SongUtil::GetSteps(pSong, apSteps, sd->m_StepsType); - for (unsigned n = 0; n < apSteps.size(); n++) // foreach Steps - { - auto pSteps = apSteps[n]; - - if (pExtra1Notes == nullptr || - CompareNotesPointersForExtra( - pExtra1Notes, - pSteps)) // pSteps is harder than pHardestNotes - { - pExtra1Song = pSong; - pExtra1Notes = pSteps; - } - - // for extra 2, we don't want to choose the hardest notes - // possible. So, we'll disgard Steps with meter > 8 - // (assuming dance) - if (bExtra2 && pSteps->GetMeter() > EXTRA_STAGE2_DIFFICULTY_MAX) - continue; // skip - if (pExtra2Notes == nullptr || - CompareNotesPointersForExtra( - pExtra2Notes, - pSteps)) // pSteps is harder than pHardestNotes - { - pExtra2Song = pSong; - pExtra2Notes = pSteps; - } - } - } - - if (pExtra2Song == nullptr && pExtra1Song != nullptr) { - pExtra2Song = pExtra1Song; - pExtra2Notes = pExtra1Notes; - } - - // If there are any notes at all that match this StepsType, - // everything should be filled out. Also, it's guaranteed that there - // is at least one Steps that matches the StepsType because the - // player had to play something before reaching the extra stage! - ASSERT(pExtra2Song && pExtra1Song && pExtra2Notes && pExtra1Notes); - - pSongOut = (bExtra2 ? pExtra2Song : pExtra1Song); - pStepsOut = (bExtra2 ? pExtra2Notes : pExtra1Notes); -} - Song* SongManager::GetRandomSong() { @@ -1674,24 +1559,19 @@ class LunaSongManager : public Luna p->UpdatePreferredSort(SArg(1), "PreferredCourses.txt"); COMMON_RETURN_SELF; } + static int GetAllSongs(T* p, lua_State* L) { const auto& v = p->GetAllSongs(); LuaHelpers::CreateTableFromArray(v, L); return 1; } + static int DifferentialReload(T* p, lua_State* L) { lua_pushnumber(L, p->DifferentialReload()); return 1; } - static int GetPreferredSortSongs(T* p, lua_State* L) - { - vector v; - p->GetPreferredSortSongs(v); - LuaHelpers::CreateTableFromArray(v, L); - return 1; - } static int FindSong(T* p, lua_State* L) { @@ -1702,6 +1582,7 @@ class LunaSongManager : public Luna lua_pushnil(L); return 1; } + static int GetRandomSong(T* p, lua_State* L) { auto pS = p->GetRandomSong(); @@ -1711,21 +1592,25 @@ class LunaSongManager : public Luna lua_pushnil(L); return 1; } + static int GetNumSongs(T* p, lua_State* L) { lua_pushnumber(L, p->GetNumSongs()); return 1; } + static int GetNumAdditionalSongs(T* p, lua_State* L) { lua_pushnumber(L, p->GetNumAdditionalSongs()); return 1; } + static int GetNumSongGroups(T* p, lua_State* L) { lua_pushnumber(L, p->GetNumSongGroups()); return 1; } + /* Note: this could now be implemented as Luna::GetSong */ static int GetSongFromSteps(T* p, lua_State* L) { @@ -1743,19 +1628,6 @@ class LunaSongManager : public Luna return 1; } - static int GetExtraStageInfo(T* p, lua_State* L) - { - auto bExtra2 = BArg(1); - const Style* pStyle = Luna