diff --git a/src/SongManager.cpp b/src/SongManager.cpp index a729e71bee..63e3ba5713 100644 --- a/src/SongManager.cpp +++ b/src/SongManager.cpp @@ -147,35 +147,47 @@ void Chart::FromKey(const string& ck) { Song* song = SONGMAN->GetSongByChartkey(ck); if (song) { Steps* steps = SONGMAN->GetStepsByChartkey(ck); + key = ck; + lastpack = song->GetSongDir(); lastsong = song->GetDisplayMainTitle(); lastdiff = steps->GetDifficulty(); loaded = true; songptr = song; stepsptr = steps; - key = ck; LOG->Trace(songptr->GetDisplayMainTitle()); } loaded = false; } +XNode* Chart::CreateNode() const { + XNode* ch = new XNode("Chart"); + ch->AppendAttr("Key", key); + ch->AppendAttr("Pack", lastpack); + ch->AppendAttr("Song", lastsong); + ch->AppendAttr("Steps", DifficultyToString(lastdiff)); + ch->AppendAttr("Rate", ssprintf("%.3f",rate)); + return ch; +} + +void Chart::LoadFromNode(const XNode* node) { + ASSERT(node->GetName() == "Chart"); + RString s; + node->GetAttrValue("Pack", lastpack); + node->GetAttrValue("Song", lastsong); + //node->GetAttrValue("Steps", s); lastdiff = StringToDifficulty(s); + node->GetAttrValue("Rate", s); rate = StringToFloat(s); + node->GetAttrValue("Key", s); key = s; + + // check if this chart is loaded and overwrite any last-seen values with updated ones + FromKey(key); +} + XNode* Playlist::CreateNode() const { XNode* pl = new XNode("Playlist"); pl->AppendAttr("Name", name); - FOREACH_CONST(Chart, chartlist, ch) { - XNode* chart = new XNode(ch->key); - Song* song = SONGMAN->GetSongByChartkey(ch->key); - if (song) { - chart->AppendAttr("Pack", song->m_sGroupName); - chart->AppendAttr("Song", song->GetDisplayMainTitle()); - - } - else { - chart->AppendAttr("Pack", ch->lastpack); - chart->AppendAttr("Song", ch->lastsong); - } - pl->AppendChild(chart); - } + FOREACH_CONST(Chart, chartlist, ch) + pl->AppendChild(ch->CreateNode()); return pl; } @@ -184,15 +196,7 @@ void Playlist::LoadFromNode(const XNode* node) { node->GetAttrValue("Name", name); FOREACH_CONST_Child(node, chart) { Chart ch; - ch.key = chart->GetName(); - chart->GetAttrValue("Pack", ch.lastpack); - chart->GetAttrValue("Song", ch.lastsong); - - Song* song = SONGMAN->GetSongByChartkey(ch.key); - if (song) { - ch.lastpack = song->m_sGroupName; - ch.lastsong = song->GetDisplayMainTitle(); - } + ch.LoadFromNode(chart); chartlist.emplace_back(ch); } diff --git a/src/SongManager.h b/src/SongManager.h index 5d8db13b89..fc648e8da0 100644 --- a/src/SongManager.h +++ b/src/SongManager.h @@ -34,13 +34,15 @@ struct Chart { string key; RString lastsong; RString lastpack; - Difficulty lastdiff; - + Difficulty lastdiff = Difficulty_Invalid; + float rate = 1.f; Song* songptr; Steps* stepsptr; - bool loaded; + bool loaded = false; void FromKey(const string& ck); + XNode * CreateNode() const; + void LoadFromNode(const XNode * node); }; struct Playlist {