diff --git a/src/band3/meta_band/SongSortByRank.cpp b/src/band3/meta_band/SongSortByRank.cpp index 4407e4c56..19f5faff7 100644 --- a/src/band3/meta_band/SongSortByRank.cpp +++ b/src/band3/meta_band/SongSortByRank.cpp @@ -1,4 +1,82 @@ #include "meta_band/SongSortByRank.h" +#include "meta/Sorting.h" +#include "meta_band/BandSongMgr.h" +#include "meta_band/MusicLibrary.h" +#include "meta_band/ProfileMgr.h" +#include "meta_band/SongSortNode.h" +#include "net_band/RockCentral.h" +#include "os/Debug.h" +#include "stl/pointers/_vector.h" RankCmp::RankCmp(int val, const char *name, RankCmp::RankType ty) - : mVal(val), mSongName(name), mType(ty) {} \ No newline at end of file + : mVal(val), mSongName(name), mType(ty) {} + + + +int RankCmp::Compare(const SongSortCmp *s, SongNodeType nodeType) const { + RankCmp *cmp = (RankCmp *)s; + switch(nodeType) { + case kNodeShortcut: + case kNodeHeader: + if(cmp->mType) + if (mType == kPercentile){ + return (mType - mType % 10) - (cmp->mType % 10); + } + else return 0; + case kNodeSong: + case kNodeStoreSong: + if(mType == cmp->mType) { + if (mType == kPercentile) { + if(cmp->mVal != mVal) { + return cmp->mVal - mVal; + } + return AlphaKeyStrCmp(mSongName, cmp->mSongName, true); + } + return mVal - cmp->mVal; + } + default: + if(nodeType != kNodeSong && nodeType != kNodeStoreSong){ + MILO_FAIL("invalid type of node comparison.\n"); + return 0; + } + } +} + +SongSortByRank::~SongSortByRank() { + +} + +void SongSortByRank::Clear() { + mRankings.clear(); + mDataResults.Clear(); +} + +bool SongSortByRank::IsReady() const { + return !mRankings.empty(); +} + +void SongSortByRank::MakeReady() { + RequestSongRankingInfo(); +} + +void SongSortByRank::CancelMakeReady() { + CancelSongRankingRequest(); + if(!mRankings.empty()) + mRankings.clear(); + mDataResults.Clear(); +} + +void SongSortByRank::RequestSongRankingInfo() { + Profile *prof = TheProfileMgr.GetPrimaryProfile(); + if(prof) { + stlpmtx_std::vector something; + ScoreType sType = TheMusicLibrary->ActiveScoreType(); + TheSongMgr.GetRankedSongs(something, true, true); + TheRockCentral.GetMultipleRankingsForPlayer(prof, sType, something, mDataResults, this); + } +} + +void SongSortByRank::CancelSongRankingRequest() { + TheRockCentral.CancelOutstandingCalls(this); +} + diff --git a/src/band3/meta_band/SongSortByRank.h b/src/band3/meta_band/SongSortByRank.h index 0d668bdb6..805319d72 100644 --- a/src/band3/meta_band/SongSortByRank.h +++ b/src/band3/meta_band/SongSortByRank.h @@ -25,7 +25,7 @@ class RankCmp : public SongSortCmp { class SongSortByRank : public SongSort { public: SongSortByRank() { mShortName = by_rank; } - virtual ~SongSortByRank() {} + virtual ~SongSortByRank(); virtual DataNode Handle(DataArray *, bool); virtual void Clear(); virtual bool IsReady() const; @@ -36,6 +36,9 @@ class SongSortByRank : public SongSort { virtual OwnedSongSortNode *NewSongNode(SongRecord *) const; virtual StoreSongSortNode *NewSongNode(class StoreOffer *) const; + void RequestSongRankingInfo(); + void CancelSongRankingRequest(); + std::map mRankings; // 0x3c DataResultList mDataResults; // 0x54 }; diff --git a/src/band3/meta_band/StoreRootPanel.cpp b/src/band3/meta_band/StoreRootPanel.cpp index c2fa8a428..7b63bda8e 100644 --- a/src/band3/meta_band/StoreRootPanel.cpp +++ b/src/band3/meta_band/StoreRootPanel.cpp @@ -1,4 +1,6 @@ #include "StoreRootPanel.h" +#include "utl/Str.h" +#include "utl/TextStream.h" StoreRootPanel::StoreRootPanel() {} StoreRootPanel::~StoreRootPanel() { @@ -25,6 +27,14 @@ BEGIN_HANDLERS(StoreRootPanel) HANDLE_CHECK(149) END_HANDLERS -int InitStoreOverlay() { +void InitStoreOverlay() { gStoreUIOverlay = RndOverlay::Find(store, false); +} + +void UpdateStoreOverlay() { + + if (gStoreUIOverlay && gStoreUIOverlay->mShowing != false) { + gStoreUIOverlay->Clear(); + //I have no idea what DAT_80D17CBC is + } } \ No newline at end of file diff --git a/src/band3/meta_band/StoreRootPanel.h b/src/band3/meta_band/StoreRootPanel.h index 9bf12326f..b9e709a25 100644 --- a/src/band3/meta_band/StoreRootPanel.h +++ b/src/band3/meta_band/StoreRootPanel.h @@ -27,5 +27,6 @@ class StoreRootPanel : public UIPanel { DataArray *mUGCMetadata; }; -int InitStoreOverlay(); +void InitStoreOverlay(); +void UpdateStoreOverlay(); extern RndOverlay *gStoreUIOverlay; \ No newline at end of file diff --git a/src/band3/meta_band/StoreSongSortNode.cpp b/src/band3/meta_band/StoreSongSortNode.cpp new file mode 100644 index 000000000..c25876235 --- /dev/null +++ b/src/band3/meta_band/StoreSongSortNode.cpp @@ -0,0 +1,62 @@ +#include "StoreSongSortNode.h" +#include "meta_band/BandSongMgr.h" +#include "meta_band/SongSortNode.h" +#include "obj/Data.h" +#include "obj/ObjMacros.h" +#include "utl/Symbols2.h" + +StoreSongSortNode::StoreSongSortNode(SongSortCmp *cmp, StoreOffer* off) : SongSortNode(cmp) { + + unk34 = off->ShortName(); +} + +StoreSongSortNode::~StoreSongSortNode(){ + +} + +bool StoreSongSortNode::IsEnabled() const { + return IsActive(); +} + +const char *StoreSongSortNode::GetAlbumArtPath() { + return "ui/image/song_select_random_keep.png"; +} + +const char *StoreSongSortNode::GetTitle() const { + return unk38->OfferName(); +} + +const char *StoreSongSortNode::GetArtist() const { + return unk38->Artist(); +} + +bool StoreSongSortNode::GetIsCover() const { + return unk38->IsCover(); +} + +const char *StoreSongSortNode::GetAlbum() const { + return unk38->AlbumName(); +} + +int StoreSongSortNode::GetTotalMs() const { + return 0; +} + +int StoreSongSortNode::GetTier(Symbol sym) const { + float f1 = unk38->PartRank(sym); + return TheSongMgr.RankTier(f1, sym); +} + +SongNodeType StoreSongSortNode::GetType() const { + return kNodeStoreSong; +} + +Symbol StoreSongSortNode::GetToken() const { + return unk34; +} + +BEGIN_HANDLERS(StoreSongSortNode) + +HANDLE_SUPERCLASS(SongSortNode) +HANDLE_CHECK(76) +END_HANDLERS \ No newline at end of file diff --git a/src/band3/meta_band/StoreSongSortNode.h b/src/band3/meta_band/StoreSongSortNode.h index e3a99ad0e..3061ee08e 100644 --- a/src/band3/meta_band/StoreSongSortNode.h +++ b/src/band3/meta_band/StoreSongSortNode.h @@ -18,6 +18,6 @@ class StoreSongSortNode : public SongSortNode { virtual const char *GetAlbum() const; virtual int GetTier(Symbol) const; - int unk34; - int unk38; + Symbol unk34; + StoreOffer *unk38; }; \ No newline at end of file diff --git a/src/system/track/TrackWidgetImp.h b/src/system/track/TrackWidgetImp.h index 8f4e27c2b..472e16e03 100644 --- a/src/system/track/TrackWidgetImp.h +++ b/src/system/track/TrackWidgetImp.h @@ -80,7 +80,7 @@ class TrackWidgetImp : public TrackWidgetImpBase { virtual void RemoveUntil(float f1, float f2) { DoRemoveUntil(Instances(), f1, f2); } virtual std::list &Instances() = 0; virtual void RemoveInstances( - std::list &list, std::list::iterator start, std::list::iterator end + std::list &list, typename std::list::iterator start, typename std::list::iterator end ) { list.erase(start, end); SetDirty(true); @@ -104,8 +104,8 @@ class TrackWidgetImp : public TrackWidgetImpBase { void DoRemoveAt(std::list &insts, float f1, float f2, float f3) { if (!insts.empty()) { - std::list::iterator it5c = insts.end(); - std::list::iterator it = insts.begin(); + typename std::list::iterator it5c = insts.end(); + typename std::list::iterator it = insts.begin(); for (; it != insts.end(); ++it) { if (IsFabsZero(it->mXfm.v.y - f1)) { if (f3 < 0 || Abs(it->mXfm.v.x - f2) <= f3) { @@ -132,7 +132,7 @@ class TrackWidgetImp : public TrackWidgetImpBase { void DoRemoveUntil(std::list &insts, float f1, float f2) { if (!insts.empty()) { - std::list::iterator it = insts.begin(); + typename std::list::iterator it = insts.begin(); for (; it != insts.end() && f2 * it->mXfm.m.y.y + it->mXfm.v.y < f1; ++it) { } if (it != insts.end()) {