From 6403754c09c46d6e08e80590f4d17fc47754d19b Mon Sep 17 00:00:00 2001 From: "born a rick, raised a morty, died a jerry" Date: Fri, 8 May 2020 00:28:39 -0400 Subject: [PATCH] move calctest stuff to songman and kill some rstring use in profile load --- src/Etterna/Models/Misc/Profile.h | 7 +- src/Etterna/Models/Misc/XMLProfile.cpp | 116 +++++------------- src/Etterna/Models/Misc/XMLProfile.h | 11 +- .../Screen/Others/ScreenSelectMusic.cpp | 22 +--- src/Etterna/Singletons/ScoreManager.cpp | 23 ---- src/Etterna/Singletons/SongManager.cpp | 100 +++++++++++++++ src/Etterna/Singletons/SongManager.h | 6 +- 7 files changed, 141 insertions(+), 144 deletions(-) diff --git a/src/Etterna/Models/Misc/Profile.h b/src/Etterna/Models/Misc/Profile.h index 9f25e36c1b..b2ef07f5c1 100644 --- a/src/Etterna/Models/Misc/Profile.h +++ b/src/Etterna/Models/Misc/Profile.h @@ -17,13 +17,14 @@ #include #include +using std::string; class XNode; struct lua_State; struct Playlist; // Current file versions -extern const RString ETT_XML; +extern const string ETT_XML; /** * @brief The filename where one can edit their personal profile data. @@ -44,7 +45,7 @@ extern const RString EDITABLE_INI; * to their own profile for use in the game unless they also have the "don't * share" file. DontShare contains a piece of information that we can * construct using STATS_XML but the user can't construct using STATS_XML. */ -extern const RString DONT_SHARE_SIG; +extern const string DONT_SHARE_SIG; extern const RString PUBLIC_KEY_FILE; extern const RString SCREENSHOTS_SUBDIR; @@ -197,8 +198,6 @@ class Profile // Profile Playlists map allplaylists; - map calctestlists; - // Editable data RString m_sDisplayName; // Dont edit this. Should be unique (Is it?) diff --git a/src/Etterna/Models/Misc/XMLProfile.cpp b/src/Etterna/Models/Misc/XMLProfile.cpp index 1a63b37481..7dadb283f7 100644 --- a/src/Etterna/Models/Misc/XMLProfile.cpp +++ b/src/Etterna/Models/Misc/XMLProfile.cpp @@ -22,10 +22,12 @@ #include "Etterna/Singletons/SongManager.h" #include "Etterna/Models/StepsAndStyles/Steps.h" -const RString ETT_XML = "Etterna.xml"; -const RString ETT_XML_GZ = "Etterna.xml.gz"; +using std::string; + +const string ETT_XML = "Etterna.xml"; +const string ETT_XML_GZ = "Etterna.xml.gz"; /** @brief The filename containing the signature for ETT_XML's signature. */ -const RString DONT_SHARE_SIG = "DontShare.sig"; +const string DONT_SHARE_SIG = "DontShare.sig"; static Preference g_bProfileDataCompress("ProfileDataCompress", false); // Loading and saving @@ -75,12 +77,11 @@ static Preference g_bProfileDataCompress("ProfileDataCompress", false); } ProfileLoadResult -XMLProfile::LoadEttFromDir(RString dir) +XMLProfile::LoadEttFromDir(string dir) { - dir += PROFILEMAN->GetStatsPrefix(); - profiledir = dir; + profiledir = dir + PROFILEMAN->GetStatsPrefix(); loadingProfile->IsEtternaProfile = true; - RString fn = dir + ETT_XML; + string fn = profiledir.append(ETT_XML); int iError; unique_ptr pFile(FILEMAN->Open(fn, RageFile::READ, iError)); @@ -101,15 +102,16 @@ XMLProfile::LoadEttFromDir(RString dir) } bool -XMLProfile::SaveEttXmlToDir(RString sDir, const Profile* profile) const +XMLProfile::SaveEttXmlToDir(string sDir, const Profile* profile) const { LOG->Trace("Saving Etterna Profile to: %s", sDir.c_str()); unique_ptr xml(SaveEttXmlCreateNode(profile)); - sDir += PROFILEMAN->GetStatsPrefix(); + string pDir = sDir + PROFILEMAN->GetStatsPrefix(); // Save Etterna.xml - RString fn = sDir + ETT_XML; + string fn = pDir.append(ETT_XML); + string fngz = pDir.append(ETT_XML_GZ); { - RString sError; + string sError; RageFile f; if (!f.Open(fn, RageFile::WRITE)) { LuaHelpers::ReportScriptErrorFmt("Couldn't open %s for writing: %s", @@ -129,19 +131,18 @@ XMLProfile::SaveEttXmlToDir(RString sDir, const Profile* profile) const /* After successfully saving ETT_XML_GZ, remove any stray * ETT_XML. */ - if (FILEMAN->IsAFile(sDir + ETT_XML)) - FILEMAN->Remove(sDir + ETT_XML); + if (FILEMAN->IsAFile(fn)) + FILEMAN->Remove(fn); } else { if (!XmlFileUtil::SaveToFile(xml.get(), f, "", false)) return false; /* After successfully saving ETT_XML, remove any stray * ETT_XML_GZ. */ - if (FILEMAN->IsAFile(sDir + ETT_XML_GZ)) - FILEMAN->Remove(sDir + ETT_XML_GZ); + if (FILEMAN->IsAFile(fngz)) + FILEMAN->Remove(fngz); } } - return true; } @@ -207,57 +208,6 @@ XMLProfile::SavePlaylistsCreateNode(const Profile* profile) const return playlists; } -XNode* -XMLProfile::SaveCalcTestCreateNode(const Profile* profile) const -{ - CHECKPOINT_M("Saving the Calc Test node."); - - XNode* calctestlists = new XNode("CalcTest"); - auto& pls = profile->calctestlists; - FOREACHM_CONST(Skillset, CalcTestList, pls, i) - calctestlists->AppendChild(i->second.CreateNode()); - return calctestlists; -} - -void -XMLProfile::LoadCalcTestNode(const XNode* pNode) const -{ - CHECKPOINT_M("Loading the Calc Test node."); - - FOREACH_CONST_Child(pNode, chartlist) // "For Each Skillset - { - int ssI; - chartlist->GetAttrValue("Skillset", ssI); - Skillset ss = (Skillset)ssI; - CalcTestList tl; - tl.skillset = ss; - FOREACH_CONST_Child(chartlist, uhh) // For Each Chartlist (oops) - { - FOREACH_CONST_Child(uhh, entry) // For Each Chart - { - RString key; - float target; - float rate; - entry->GetAttrValue("Key", key); - entry->GetAttrValue("Target", target); - entry->GetAttrValue("Rate", rate); - pair pf(target, rate); - tl.filemapping[key.c_str()] = pf; - } - } - loadingProfile->calctestlists[ss] = tl; - if (SONGMAN->testChartList.count(ss)) { - for (auto c : tl.filemapping) { - // this replaces any duplicates in order of profile load - // so ... dont duplicate them i guess - // but anything that isnt duplicate is added - SONGMAN->testChartList[ss].filemapping[c.first] = c.second; - } - } else - SONGMAN->testChartList[ss] = tl; - } -} - void XMLProfile::LoadFavoritesFromNode(const XNode* pNode) { @@ -289,7 +239,7 @@ GoalsForChart::LoadFromNode(const XNode* pNode) doot.LoadFromNode(sg); Add(doot); } - RString chartkey; + string chartkey; pNode->GetAttrValue("Key", chartkey); for (auto& goal : goals) goal.chartkey = chartkey; @@ -300,7 +250,7 @@ XMLProfile::LoadScoreGoalsFromNode(const XNode* pNode) { CHECKPOINT_M("Loading the scoregoals node."); - RString ck; + string ck; FOREACH_CONST_Child(pNode, chgoals) { chgoals->GetAttrValue("Key", ck); @@ -431,18 +381,15 @@ XMLProfile::SaveEttGeneralDataCreateNode(const Profile* profile) const } void -XMLProfile::MoveBackupToDir(const RString& sFromDir, const RString& sToDir) +XMLProfile::MoveBackupToDir(string sFromDir, string sToDir) { - if (FILEMAN->IsAFile(sFromDir + ETT_XML) && - FILEMAN->IsAFile(sFromDir + ETT_XML + SIGNATURE_APPEND)) { - FILEMAN->Move(sFromDir + ETT_XML, sToDir + ETT_XML); - FILEMAN->Move(sFromDir + ETT_XML + SIGNATURE_APPEND, - sToDir + ETT_XML + SIGNATURE_APPEND); - } else if (FILEMAN->IsAFile(sFromDir + ETT_XML_GZ) && - FILEMAN->IsAFile(sFromDir + ETT_XML_GZ + SIGNATURE_APPEND)) { - FILEMAN->Move(sFromDir + ETT_XML_GZ, sToDir + ETT_XML); - FILEMAN->Move(sFromDir + ETT_XML_GZ + SIGNATURE_APPEND, - sToDir + ETT_XML + SIGNATURE_APPEND); + string frompath = sFromDir.append(ETT_XML); + string fromsig = frompath.append(SIGNATURE_APPEND); + string topath = sToDir.append(ETT_XML); + string tosig = topath.append(SIGNATURE_APPEND); + if (FILEMAN->IsAFile(frompath) && FILEMAN->IsAFile(fromsig)) { + FILEMAN->Move(frompath, topath); + FILEMAN->Move(fromsig, tosig); } } @@ -452,7 +399,7 @@ XMLProfile::LoadEttGeneralDataFromNode(const XNode* pNode) CHECKPOINT_M("Loading the general node."); ASSERT(pNode->GetName() == "GeneralData"); - RString s; + string s; const XNode* pTemp; pNode->GetChildValue("DisplayName", loadingProfile->m_sDisplayName); @@ -609,10 +556,6 @@ XMLProfile::LoadEttXmlFromNode(const XNode* xml) if (play) LoadPlaylistsFromNode(play); - const XNode* calctest = xml->GetChild("CalcTest"); - if (calctest) - LoadCalcTestNode(calctest); - const XNode* scores = xml->GetChild("PlayerScores"); if (scores) LoadEttScoresFromNode(scores); @@ -635,9 +578,6 @@ XMLProfile::SaveEttXmlCreateNode(const Profile* profile) const if (!profile->allplaylists.empty()) xml->AppendChild(SavePlaylistsCreateNode(profile)); - if (!profile->calctestlists.empty()) - xml->AppendChild(SaveCalcTestCreateNode(profile)); - if (!profile->goalmap.empty()) xml->AppendChild(SaveScoreGoalsCreateNode(profile)); diff --git a/src/Etterna/Models/Misc/XMLProfile.h b/src/Etterna/Models/Misc/XMLProfile.h index 8322619db8..0b1021c708 100644 --- a/src/Etterna/Models/Misc/XMLProfile.h +++ b/src/Etterna/Models/Misc/XMLProfile.h @@ -12,11 +12,11 @@ class XNode; class XMLProfile { public: - static void MoveBackupToDir(const RString& sFromDir, const RString& sToDir); + static void MoveBackupToDir(std::string sFromDir, std::string sToDir); // Etterna profile - ProfileLoadResult LoadEttFromDir(RString dir); - bool SaveEttXmlToDir(RString sDir, const Profile* profile) const; + ProfileLoadResult LoadEttFromDir(std::string dir); + bool SaveEttXmlToDir(std::string sDir, const Profile* profile) const; void SetLoadingProfile(Profile* p) { loadingProfile = p; } private: @@ -41,12 +41,9 @@ class XMLProfile XNode* SavePermaMirrorCreateNode(const Profile* profile) const; XNode* SaveScoreGoalsCreateNode(const Profile* profile) const; XNode* SavePlaylistsCreateNode(const Profile* profile) const; - XNode* SaveCalcTestCreateNode(const Profile* profile) const; - void LoadCalcTestNode(const XNode* pNode) const; - XNode* SaveScreenshotDataCreateNode(const Profile* profile) const; - RString profiledir; + std::string profiledir; }; #endif diff --git a/src/Etterna/Screen/Others/ScreenSelectMusic.cpp b/src/Etterna/Screen/Others/ScreenSelectMusic.cpp index a4e84b8933..f446ee713c 100644 --- a/src/Etterna/Screen/Others/ScreenSelectMusic.cpp +++ b/src/Etterna/Screen/Others/ScreenSelectMusic.cpp @@ -1072,20 +1072,11 @@ ScreenSelectMusic::HandleScreenMessage(const ScreenMessage SM) tl.filemapping[ck] = pf; SONGMAN->testChartList[ss] = tl; } - if (pProfile->calctestlists.count(ss)) { - pair pf(target, 1.f); - pProfile->calctestlists[ss].filemapping[ck] = pf; - } else { - CalcTestList tl; - tl.skillset = ss; - pair pf(target, 1.f); - tl.filemapping[ck] = pf; - pProfile->calctestlists[ss] = tl; - } SCREENMAN->SystemMessage( ssprintf("added %s to %s at rate 1.0", ck.c_str(), SkillsetToString(ss).c_str())); + SONGMAN->SaveCalcTestXmlToDir(); float woo = GAMESTATE->m_pCurSteps->DoATestThing(target, ss); } @@ -1111,21 +1102,12 @@ ScreenSelectMusic::HandleScreenMessage(const ScreenMessage SM) tl.filemapping[ck] = pf; SONGMAN->testChartList[ss] = tl; } - if (pProfile->calctestlists.count(ss)) { - pair pf(target, rate); - pProfile->calctestlists[ss].filemapping[ck] = pf; - } else { - CalcTestList tl; - tl.skillset = ss; - pair pf(target, rate); - tl.filemapping[ck] = pf; - pProfile->calctestlists[ss] = tl; - } SCREENMAN->SystemMessage( ssprintf("added %s to %s at rate %f", ck.c_str(), SkillsetToString(ss).c_str(), rate)); + SONGMAN->SaveCalcTestXmlToDir(); float woo = GAMESTATE->m_pCurSteps->DoATestThing(target, ss); } diff --git a/src/Etterna/Singletons/ScoreManager.cpp b/src/Etterna/Singletons/ScoreManager.cpp index 38c19c0a51..fa0fdc81ea 100644 --- a/src/Etterna/Singletons/ScoreManager.cpp +++ b/src/Etterna/Singletons/ScoreManager.cpp @@ -653,29 +653,6 @@ ScoreManager::RegisterScoreInProfile(HighScore* hs_, const string& profileID) AllProfileScores[profileID].emplace_back(hs_); } -XNode* -CalcTestList::CreateNode() const -{ - XNode* pl = new XNode("CalcTestList"); - pl->AppendAttr("Skillset", skillset); - - XNode* cl = new XNode("Chartlist"); - for (const auto p : filemapping) { - XNode* chart = new XNode("Chart"); - chart->AppendAttr("Key", p.first); - chart->AppendAttr("Target", p.second.first); - chart->AppendAttr("Rate", p.second.second); - cl->AppendChild(chart); - } - - if (!cl->ChildrenEmpty()) - pl->AppendChild(cl); - else - delete cl; - - return pl; -} - // Write scores to xml XNode* ScoresAtRate::CreateNode(const int& rate) const diff --git a/src/Etterna/Singletons/SongManager.cpp b/src/Etterna/Singletons/SongManager.cpp index a75237dbea..bb9c1e3660 100644 --- a/src/Etterna/Singletons/SongManager.cpp +++ b/src/Etterna/Singletons/SongManager.cpp @@ -39,6 +39,8 @@ #include "NetworkSyncManager.h" #include +using std::string; + // AUTOMATED CALC TEST STUFF FIND BETTER PLACE TO PUT // chart key and rough desired output value static unordered_map js_test = { @@ -174,6 +176,7 @@ SongManager::InitAll(LoadingWindow* ld) m_GroupsToNeverCache.insert(*group); } InitSongsFromDisk(ld); + LoadCalcTestNode(); } static LocalizedString RELOADING("SongManager", "Reloading..."); @@ -1685,6 +1688,103 @@ makePlaylist(const RString& answer) PROFILEMAN->SaveProfile(PLAYER_1); } } +static const string calctest_XML = "CalcTestList"; + +XNode* +CalcTestList::CreateNode() const +{ + XNode* pl = new XNode("CalcTestList"); + pl->AppendAttr("Skillset", skillset); + + XNode* cl = new XNode("Chartlist"); + for (const auto p : filemapping) { + XNode* chart = new XNode("Chart"); + Chart loot; + loot.FromKey(p.first); + chart->AppendAttr("aKey", p.first); + chart->AppendAttr("zSong", loot.lastsong); + chart->AppendAttr("cTarget", ssprintf("%.2f", p.second.first)); + chart->AppendAttr("bRate", ssprintf("%.2f", p.second.second)); + cl->AppendChild(chart); + } + + if (!cl->ChildrenEmpty()) + pl->AppendChild(cl); + else + delete cl; + + return pl; +} + +void + SongManager::LoadCalcTestNode() const +{ + string fn = "Save/" + calctest_XML; + int iError; + unique_ptr pFile(FILEMAN->Open(fn, RageFile::READ, iError)); + if (pFile.get() == NULL) { + LOG->Trace("Error opening %s: %s", fn.c_str(), strerror(iError)); + return; + } + + XNode xml; + if (!XmlFileUtil::LoadFromFileShowErrors(xml, *pFile.get())) + return; + + CHECKPOINT_M("Loading the Calc Test node."); + + FOREACH_CONST_Child(&xml, chartlist) // "For Each Skillset + { + int ssI; + chartlist->GetAttrValue("Skillset", ssI); + Skillset ss = (Skillset)ssI; + CalcTestList tl; + tl.skillset = ss; + FOREACH_CONST_Child(chartlist, uhh) // For Each Chartlist (oops) + { + FOREACH_CONST_Child(uhh, entry) // For Each Chart + { + RString key; + float target; + float rate; + entry->GetAttrValue("aKey", key); + entry->GetAttrValue("bRate", rate); + entry->GetAttrValue("cTarget", target); + pair pf(target, rate); + tl.filemapping[key.c_str()] = pf; + } + } + SONGMAN->testChartList[ss] = tl; + } +} + +XNode* +SongManager::SaveCalcTestCreateNode() const +{ + CHECKPOINT_M("Saving the Calc Test node."); + + XNode* calctestlists = new XNode("CalcTest"); + FOREACHM_CONST(Skillset, CalcTestList, testChartList, i) + calctestlists->AppendChild(i->second.CreateNode()); + return calctestlists; +} + +void +SongManager::SaveCalcTestXmlToDir() const +{ + string fn = "Save/" + calctest_XML; + // calc test hardcode stuff cuz ASDKLFJASKDJLFHASHDFJ + unique_ptr xml(SaveCalcTestCreateNode()); + string err; + RageFile f; + if (!f.Open(fn, RageFile::WRITE)) { + LuaHelpers::ReportScriptErrorFmt( + "Couldn't open %s for writing: %s", fn.c_str(), f.GetError().c_str()); + return; + } + XmlFileUtil::SaveToFile(xml.get(), f, "", false); +} + // lua start #include "Etterna/Models/Lua/LuaBinding.h" diff --git a/src/Etterna/Singletons/SongManager.h b/src/Etterna/Singletons/SongManager.h index 1ce76d034f..5a61540c7f 100644 --- a/src/Etterna/Singletons/SongManager.h +++ b/src/Etterna/Singletons/SongManager.h @@ -174,9 +174,11 @@ class SongManager void FinalizeSong(Song* pNewSong, const RString& dir); - // combined test list for all profiles + // calc test stuff + XNode* SaveCalcTestCreateNode() const; + void LoadCalcTestNode() const; + void SaveCalcTestXmlToDir() const; map testChartList; - protected: void LoadStepManiaSongDir(RString sDir, LoadingWindow* ld); void LoadDWISongDir(const RString& sDir);