From c97f2d23d7e3c19c7e9bb54324cf6f5ef88c83fd Mon Sep 17 00:00:00 2001 From: jsenior10 Date: Sun, 6 Jul 2025 12:32:40 +0100 Subject: [PATCH 1/9] Change InitStoreOverlay() return type --- src/band3/meta_band/StoreRootPanel.cpp | 2 +- src/band3/meta_band/StoreRootPanel.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/band3/meta_band/StoreRootPanel.cpp b/src/band3/meta_band/StoreRootPanel.cpp index c2fa8a428..f6259ed32 100644 --- a/src/band3/meta_band/StoreRootPanel.cpp +++ b/src/band3/meta_band/StoreRootPanel.cpp @@ -25,6 +25,6 @@ BEGIN_HANDLERS(StoreRootPanel) HANDLE_CHECK(149) END_HANDLERS -int InitStoreOverlay() { +void InitStoreOverlay() { gStoreUIOverlay = RndOverlay::Find(store, false); } \ No newline at end of file diff --git a/src/band3/meta_band/StoreRootPanel.h b/src/band3/meta_band/StoreRootPanel.h index 9bf12326f..5eec74c7b 100644 --- a/src/band3/meta_band/StoreRootPanel.h +++ b/src/band3/meta_band/StoreRootPanel.h @@ -27,5 +27,5 @@ class StoreRootPanel : public UIPanel { DataArray *mUGCMetadata; }; -int InitStoreOverlay(); +void InitStoreOverlay(); extern RndOverlay *gStoreUIOverlay; \ No newline at end of file From d5aade5493d5487b9a5cea063e3747eca4a0408c Mon Sep 17 00:00:00 2001 From: jsenior10 Date: Sun, 6 Jul 2025 16:10:41 +0100 Subject: [PATCH 2/9] most of StoreSongSortNode --- src/band3/meta_band/StoreRootPanel.cpp | 10 ++++ src/band3/meta_band/StoreRootPanel.h | 1 + src/band3/meta_band/StoreSongSortNode.cpp | 62 +++++++++++++++++++++++ src/band3/meta_band/StoreSongSortNode.h | 4 +- src/system/track/TrackWidgetImp.h | 8 +-- 5 files changed, 79 insertions(+), 6 deletions(-) create mode 100644 src/band3/meta_band/StoreSongSortNode.cpp diff --git a/src/band3/meta_band/StoreRootPanel.cpp b/src/band3/meta_band/StoreRootPanel.cpp index f6259ed32..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() { @@ -27,4 +29,12 @@ END_HANDLERS 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 5eec74c7b..b9e709a25 100644 --- a/src/band3/meta_band/StoreRootPanel.h +++ b/src/band3/meta_band/StoreRootPanel.h @@ -28,4 +28,5 @@ class StoreRootPanel : public UIPanel { }; 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()) { From d3ed5686bcdc33134237826c106a630f63fc852b Mon Sep 17 00:00:00 2001 From: jsenior10 Date: Mon, 7 Jul 2025 20:15:21 +0100 Subject: [PATCH 3/9] Some of SongSortByRank --- src/band3/meta_band/SongSortByRank.cpp | 80 +++++++++++++++++++++++++- src/band3/meta_band/SongSortByRank.h | 6 +- 2 files changed, 84 insertions(+), 2 deletions(-) diff --git a/src/band3/meta_band/SongSortByRank.cpp b/src/band3/meta_band/SongSortByRank.cpp index 4407e4c56..d0ca89516 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(!this->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..8cb56bb3d 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,10 @@ 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 + float mDelayedStartTime; }; From fbb9c1ae7191352edc18d85691ce638505f79f4c Mon Sep 17 00:00:00 2001 From: jsenior10 Date: Mon, 7 Jul 2025 20:25:09 +0100 Subject: [PATCH 4/9] useless variable --- src/band3/meta_band/SongSortByRank.h | 1 - 1 file changed, 1 deletion(-) diff --git a/src/band3/meta_band/SongSortByRank.h b/src/band3/meta_band/SongSortByRank.h index 8cb56bb3d..805319d72 100644 --- a/src/band3/meta_band/SongSortByRank.h +++ b/src/band3/meta_band/SongSortByRank.h @@ -41,5 +41,4 @@ class SongSortByRank : public SongSort { std::map mRankings; // 0x3c DataResultList mDataResults; // 0x54 - float mDelayedStartTime; }; From 94f1b5212a6053ce9f380aceeffe755de3b51126 Mon Sep 17 00:00:00 2001 From: jsenior10 Date: Mon, 7 Jul 2025 20:27:45 +0100 Subject: [PATCH 5/9] cleaning --- src/band3/meta_band/SongSortByRank.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/band3/meta_band/SongSortByRank.cpp b/src/band3/meta_band/SongSortByRank.cpp index d0ca89516..19f5faff7 100644 --- a/src/band3/meta_band/SongSortByRank.cpp +++ b/src/band3/meta_band/SongSortByRank.cpp @@ -61,7 +61,7 @@ void SongSortByRank::MakeReady() { void SongSortByRank::CancelMakeReady() { CancelSongRankingRequest(); - if(!this->mRankings.empty()) + if(!mRankings.empty()) mRankings.clear(); mDataResults.Clear(); } From 56e68f6b9659a0064a6286e19e3501a58170789d Mon Sep 17 00:00:00 2001 From: jsenior10 Date: Sun, 17 Aug 2025 05:17:18 +0100 Subject: [PATCH 6/9] some of bufstreamnand --- src/band3/meta_band/SongSortByRank.cpp | 24 +++++ src/band3/meta_band/SongSortByRank.h | 2 + src/band3/meta_band/StoreMainPanel.cpp | 6 +- src/band3/meta_band/StoreMainPanel.h | 23 +++++ src/system/os/Memcard.h | 29 ++++++ src/system/utl/BufStreamNAND.cpp | 120 +++++++++++++++++++++++++ src/system/utl/BufStreamNAND.h | 41 +++++++++ 7 files changed, 244 insertions(+), 1 deletion(-) create mode 100644 src/band3/meta_band/StoreMainPanel.h create mode 100644 src/system/utl/BufStreamNAND.cpp create mode 100644 src/system/utl/BufStreamNAND.h diff --git a/src/band3/meta_band/SongSortByRank.cpp b/src/band3/meta_band/SongSortByRank.cpp index 19f5faff7..1e7ae4187 100644 --- a/src/band3/meta_band/SongSortByRank.cpp +++ b/src/band3/meta_band/SongSortByRank.cpp @@ -1,12 +1,17 @@ #include "meta_band/SongSortByRank.h" #include "meta/Sorting.h" +#include "meta/StoreOffer.h" #include "meta_band/BandSongMgr.h" #include "meta_band/MusicLibrary.h" #include "meta_band/ProfileMgr.h" #include "meta_band/SongSortNode.h" +#include "meta_band/StoreSongSortNode.h" #include "net_band/RockCentral.h" +#include "net_band/RockCentralMsgs.h" +#include "obj/ObjMacros.h" #include "os/Debug.h" #include "stl/pointers/_vector.h" +#include "utl/Symbols4.h" RankCmp::RankCmp(int val, const char *name, RankCmp::RankType ty) : mVal(val), mSongName(name), mType(ty) {} @@ -80,3 +85,22 @@ void SongSortByRank::CancelSongRankingRequest() { TheRockCentral.CancelOutstandingCalls(this); } +StoreSongSortNode SongSortByRank::*NewSongNode(StoreOffer *offer) { + const char *name = offer->OfferName(); + //RankCmp *cmp = new +} + +DataNode SongSortByRank::OnMsg(RockCentralOpCompleteMsg const &msg) { + if(msg.Success()) { + for(int i = 0; i < mDataResults.mDataResultList.size(); i++) { + DataResult *res = mDataResults.GetDataResult(i); + //res->GetDataResultValue("SongSortByRank.cpp", ); + } + } +} + +BEGIN_HANDLERS(SongSortByRank) +HANDLE_MESSAGE(RockCentralOpCompleteMsg) +HANDLE_SUPERCLASS(SongSort) +HANDLE_CHECK(0x13E) +END_HANDLERS \ No newline at end of file diff --git a/src/band3/meta_band/SongSortByRank.h b/src/band3/meta_band/SongSortByRank.h index 805319d72..0f76d0c0b 100644 --- a/src/band3/meta_band/SongSortByRank.h +++ b/src/band3/meta_band/SongSortByRank.h @@ -2,6 +2,7 @@ #include "meta_band/SongSort.h" #include "meta_band/SongSortNode.h" #include "net_band/DataResults.h" +#include "net_band/RockCentralMsgs.h" #include "utl/Symbols.h" class RankCmp : public SongSortCmp { @@ -36,6 +37,7 @@ class SongSortByRank : public SongSort { virtual OwnedSongSortNode *NewSongNode(SongRecord *) const; virtual StoreSongSortNode *NewSongNode(class StoreOffer *) const; + DataNode OnMsg(RockCentralOpCompleteMsg const&); void RequestSongRankingInfo(); void CancelSongRankingRequest(); diff --git a/src/band3/meta_band/StoreMainPanel.cpp b/src/band3/meta_band/StoreMainPanel.cpp index 9d26eaf8a..56be8c037 100644 --- a/src/band3/meta_band/StoreMainPanel.cpp +++ b/src/band3/meta_band/StoreMainPanel.cpp @@ -1,3 +1,7 @@ #include "meta/StorePackedMetadata.h" +#include "StoreMainPanel.h" -DECOMP_FORCEFUNC(StoreMainPanel, StoreMetadataManager, GetString(0)) \ No newline at end of file +DECOMP_FORCEFUNC(StoreMainPanel, StoreMetadataManager, GetString(0)) + +StoreMainPanel::~StoreMainPanel() { +}; \ No newline at end of file diff --git a/src/band3/meta_band/StoreMainPanel.h b/src/band3/meta_band/StoreMainPanel.h new file mode 100644 index 000000000..298633dfc --- /dev/null +++ b/src/band3/meta_band/StoreMainPanel.h @@ -0,0 +1,23 @@ +#pragma once + +#include "meta/StoreArtLoaderPanel.h" +#include "obj/Data.h" +#include "utl/Str.h" + +class StoreMainPanel : StoreArtLoaderPanel { + class NewReleaseEntry { + public: + String mStrName; // 0x0 + String mText1; // 0xC + String mText2; // 0x18 + Symbol mRequiredOffer; // 0x24 + }; + + public: + StoreMainPanel(); + ~StoreMainPanel(); + //NewReleaseEntry + + DataArray *mPendingConfigData; // 0x6C + float mTimeNextEvent; // +}; \ No newline at end of file diff --git a/src/system/os/Memcard.h b/src/system/os/Memcard.h index f31d2bc8e..be8f29364 100644 --- a/src/system/os/Memcard.h +++ b/src/system/os/Memcard.h @@ -8,6 +8,35 @@ enum AccessType { }; enum CreateType { }; +enum MCResult { + kMCNoError, + kMCNoCard, + kMCNotFormatted, + kMCDifferentCard, + kMCReadWriteFailed, + kMCCorrupt, + kMCNotEnoughSpace, + kMCFileExists, + kMCFileNotFound, + kMCMultipleFilesFound, + kMCObsoleteVersion, + kMCNewerVersion, + kMCGeneralError, + kMCUnsupported, + kMCAlreadyFormatted, + kMCInsufficientInodes, + kMCSystemCorrupt, + kMCAccessError, + kMCMaxedSysMem, + kMCSystemMemCorrupt, + kMCUnknownError, + kMCNoEntriesError, + kMCNoFilesError, + kMCNoPermission, + kMCDeprecated, + kMCNotOwner, + kMCMax +}; class MCFile { public: diff --git a/src/system/utl/BufStreamNAND.cpp b/src/system/utl/BufStreamNAND.cpp new file mode 100644 index 000000000..0e978c545 --- /dev/null +++ b/src/system/utl/BufStreamNAND.cpp @@ -0,0 +1,120 @@ +#include "BufStreamNAND.h" +#include "math/SHA1.h" +#include "math/StreamChecksum.h" +#include "meta/FixedSizeSaveableStream.h" +#include "os/Debug.h" +#include "os/Memcard.h" +#include "revolution/nand/nand.h" +#include "rndwii/Rnd.h" +#include "utl/BinStream.h" +#include "utl/Symbol.h" + +BufStreamNAND::BufStreamNAND(void *v1, int i1, char* buffer, bool b1) + : FixedSizeSaveableStream(v1, i1, b1), mBuffer(buffer), mChecksum(0), mBytesChecksummed(0), mSize(i1), mFilePath(), mFileOpen(0) { + +} + +BufStreamNAND::~BufStreamNAND() { + +} + +int BufStreamNAND::Tell() { + return mRunningTell; +} + +void BufStreamNAND::SetResult(MCResult result) { + mResult = result; +} + +int BufStreamNAND::GetResult() { + return mResult; +} + +bool BufStreamNAND::Fail() { + return mFail; +} + +EofType BufStreamNAND::Eof() { + return (EofType)(mSize == mTell); +} + +void BufStreamNAND::Clear() { + mFail = mBuffer == 0; + mTell = 0; + mRunningTell = 0; + mChunkSize = 0x40000; + unk80 = 0; + mResult = kMCNoError; + MILO_ASSERT(fmod(mSize, 4.503601775116288e15 - 4.503601774854144e15), 0x39); +} + +int BufStreamNAND::Open() { + s32 file; + MCResult result; + SetGPHangDetectEnabled(0, "Open"); + if(!mFileOpen) { + file = NANDOpen(mFilePath, mFileInfo, 3); + result = HandleResultNAND(file); + if(result) + mFail = 1; + else + mFileOpen = 1; + } + SetGPHangDetectEnabled(1, "Open"); + + return file; +} + +int BufStreamNAND::Close() { + s32 file; + MCResult result; + SetGPHangDetectEnabled(0, "Close"); + if(mFileOpen) { + //NANDGetLength(mFileInfo, u32 *) // stack variable epic + file = NANDClose(mFileInfo); + result = HandleResultNAND(file); + if(result) + mFail = 1; + else + mFileOpen = 1; + } + SetGPHangDetectEnabled(0, "Close"); + return result; +} + +bool BufStreamNAND::FinishStream() { + int result = Close(); + if(result) { + mFail = 1; + } + return result; +} + +void BufStreamNAND::ReadImpl(void *v1, int i1) { + // v5 = ui2 + unsigned int temp; + if(!mFail) { + if((mTell + i1) > mChunkSize || !mRunningTell) + LoadBufferFromNAND(); + + if((mRunningTell + i1) > mSize || (mTell + i1) > mChunkSize) { + temp = mSize - mTell; + mFail = 1; + } + // init_proc(&mBuffer[mTell], temp) + mRunningTell += temp; + if(mChecksum) { + if(!mFail) { + mChecksum->Update((unsigned char*)v1, temp); + mBytesChecksummed += temp; + } + } + } +} + +void BufStreamNAND::DeleteChecksum() { + if(mChecksum) { + delete(mChecksum); + } + mChecksum = 0; +} \ No newline at end of file diff --git a/src/system/utl/BufStreamNAND.h b/src/system/utl/BufStreamNAND.h new file mode 100644 index 000000000..fb8282b7f --- /dev/null +++ b/src/system/utl/BufStreamNAND.h @@ -0,0 +1,41 @@ +#pragma once + +#include "math/StreamChecksum.h" +#include "meta/FixedSizeSaveableStream.h" +#include "os/Memcard.h" +#include "revolution/nand/nand.h" +#include "stdint.h" +#include "utl/BinStream.h" + +class BufStreamNAND : public FixedSizeSaveableStream { +public: + BufStreamNAND(void*, int, char*, bool); + ~BufStreamNAND(); + int Tell(); + void SetResult(MCResult); + int GetResult(); + bool Fail(); + EofType Eof(); + void ReadImpl(void*, int); + int LoadBufferFromNAND(); + void Clear(); + int Open(); + MCResult HandleResultNAND(s32 l1); + bool FinishStream(); + int Close(); + void DeleteChecksum(); + + char *mBuffer; // 0x68 + int mTell; // 0x70 + int mSize; // 0x74 + int mRunningTell; // 0x78 + MCResult mResult; // 0xC4 + NANDFileInfo *mFileInfo; // 0xC8 + bool mFail; // 0x6C + int mChunkSize; // 0x7C + StreamChecksum *mChecksum; // 0x154 + int mBytesChecksummed; // 0x158 + bool unk80; // 0x80; + bool mFileOpen; // 0x81 + char mFilePath[64]; // 0x82 +}; \ No newline at end of file From 8bb63901351f952960d05925bdc809a925e71a06 Mon Sep 17 00:00:00 2001 From: jsenior10 Date: Sun, 17 Aug 2025 07:05:12 +0100 Subject: [PATCH 7/9] more bufstreamnand --- src/system/utl/BufStreamNAND.cpp | 102 ++++++++++++++++++++++++++++--- src/system/utl/BufStreamNAND.h | 7 ++- 2 files changed, 98 insertions(+), 11 deletions(-) diff --git a/src/system/utl/BufStreamNAND.cpp b/src/system/utl/BufStreamNAND.cpp index 0e978c545..de33d738f 100644 --- a/src/system/utl/BufStreamNAND.cpp +++ b/src/system/utl/BufStreamNAND.cpp @@ -1,4 +1,5 @@ #include "BufStreamNAND.h" +#include "PowerPC_EABI_Support/Runtime/__mem.h" #include "math/SHA1.h" #include "math/StreamChecksum.h" #include "meta/FixedSizeSaveableStream.h" @@ -51,16 +52,16 @@ void BufStreamNAND::Clear() { int BufStreamNAND::Open() { s32 file; MCResult result; - SetGPHangDetectEnabled(0, "Open"); + SetGPHangDetectEnabled(false, "Open"); if(!mFileOpen) { file = NANDOpen(mFilePath, mFileInfo, 3); result = HandleResultNAND(file); if(result) - mFail = 1; + mFail = true; else - mFileOpen = 1; + mFileOpen = true; } - SetGPHangDetectEnabled(1, "Open"); + SetGPHangDetectEnabled(true, "Open"); return file; } @@ -68,24 +69,24 @@ int BufStreamNAND::Open() { int BufStreamNAND::Close() { s32 file; MCResult result; - SetGPHangDetectEnabled(0, "Close"); + SetGPHangDetectEnabled(false, "Close"); if(mFileOpen) { //NANDGetLength(mFileInfo, u32 *) // stack variable epic file = NANDClose(mFileInfo); result = HandleResultNAND(file); if(result) - mFail = 1; + mFail = true; else - mFileOpen = 1; + mFileOpen = true; } - SetGPHangDetectEnabled(0, "Close"); + SetGPHangDetectEnabled(true, "Close"); return result; } bool BufStreamNAND::FinishStream() { int result = Close(); if(result) { - mFail = 1; + mFail = true; } return result; } @@ -99,7 +100,7 @@ void BufStreamNAND::ReadImpl(void *v1, int i1) { if((mRunningTell + i1) > mSize || (mTell + i1) > mChunkSize) { temp = mSize - mTell; - mFail = 1; + mFail = true; } // init_proc(&mBuffer[mTell], temp) mRunningTell += temp; @@ -112,9 +113,90 @@ void BufStreamNAND::ReadImpl(void *v1, int i1) { } } +int BufStreamNAND::Pad(int size) { + MILO_ASSERT(size > mSize, 0x170); + int result = 0; + + while(size > mRunningTell) { + mTell = size - mRunningTell; + + if(mTell > mChunkSize) + mTell = mChunkSize; + mRunningTell += mTell; + + result = SaveBufferToNAND(0); + if(result) { + mFail = true; + return result; + } + } + return result; +} + +int BufStreamNAND::PadToEnd() { + return Pad(mSize); +} + void BufStreamNAND::DeleteChecksum() { if(mChecksum) { delete(mChecksum); } mChecksum = 0; +} + +int BufStreamNAND::LoadBufferFromNAND() { + SetGPHangDetectEnabled(false, "LoadBufferFromNAND"); + s32 file = Open(); + DoSeek(0, kSeekCur); + int v3 = mChunkSize; + int v4 = mRunningTell; + int v5 = mSize; + + if(v4 + v3 > v5) + v3 = v5 - v4; + s32 res = NANDRead(mFileInfo, mBuffer, v3); + + if(res == v3) { + mTell = 0; + SetGPHangDetectEnabled(true, "LoadBufferFromNAND"); + return file; + } + else { + mFail = true; + MCResult result = HandleResultNAND(res); + SetGPHangDetectEnabled(true, "LoadBufferFromNAND"); + return result; + } +} + +int BufStreamNAND::SaveBufferToNAND(bool b1) { + SetGPHangDetectEnabled(false, "SaveBufferToNAND"); + s32 file = Open(); + s32 write = NANDWrite(mFileInfo, mBuffer, mTell); + if(write == mTell) { + memset(mBuffer, 0, mChunkSize); + mTell = 0; + if(b1 && mRunningTell == mSize && (file = Close()) != 0) { + mFail = true; + SetGPHangDetectEnabled(true, "SaveBufferToNAND"); + return file; + } + else { + SetGPHangDetectEnabled(true, "SaveBufferToNAND"); + return file; + } + } + else { + mFail = true; + MCResult result = HandleResultNAND(write); + SetGPHangDetectEnabled(true, "SaveBufferToNAND"); + return result; + } +} + +bool BufStreamNAND::FinishWrite() { + bool result = SaveBufferToNAND(false); + if(result) + mFail = true; + return result; } \ No newline at end of file diff --git a/src/system/utl/BufStreamNAND.h b/src/system/utl/BufStreamNAND.h index fb8282b7f..6dc5ae3d0 100644 --- a/src/system/utl/BufStreamNAND.h +++ b/src/system/utl/BufStreamNAND.h @@ -20,10 +20,15 @@ class BufStreamNAND : public FixedSizeSaveableStream { int LoadBufferFromNAND(); void Clear(); int Open(); - MCResult HandleResultNAND(s32 l1); + MCResult HandleResultNAND(s32); bool FinishStream(); int Close(); void DeleteChecksum(); + int Pad(int); + int PadToEnd(); + int SaveBufferToNAND(bool); + int DoSeek(int, BinStream::SeekType); + bool FinishWrite(); char *mBuffer; // 0x68 int mTell; // 0x70 From 4fb69612ae3a6bbb974edb2999a2ca3ffe60d3db Mon Sep 17 00:00:00 2001 From: jsenior10 Date: Sun, 17 Aug 2025 21:39:48 +0100 Subject: [PATCH 8/9] more bufstreamnand + cleanup --- src/system/meta/MemcardMgr_Wii.cpp | 8 ++++++-- src/system/meta/MemcardMgr_Wii.h | 3 ++- src/system/utl/BufStreamNAND.cpp | 27 ++++++++++++++++++--------- src/system/utl/BufStreamNAND.h | 1 + 4 files changed, 27 insertions(+), 12 deletions(-) diff --git a/src/system/meta/MemcardMgr_Wii.cpp b/src/system/meta/MemcardMgr_Wii.cpp index 56b1a909a..8230fb3a5 100644 --- a/src/system/meta/MemcardMgr_Wii.cpp +++ b/src/system/meta/MemcardMgr_Wii.cpp @@ -3,7 +3,11 @@ MemcardMgr TheMemcardMgr; MemcardMgr::MemcardMgr() - : unka4(0), unka8(0), unkac(0), unkb9(0), unkbc(-1), unkc0(0), unkcc(0), unkd0(0), + : unka4(0), unka8(0), unkac(0), mIsWriteMode(0), unkbc(-1), unkc0(0), unkcc(0), unkd0(0), unkd4(-1), unkd8(-1), unkdc(0) {} -MemcardMgr::~MemcardMgr() {} \ No newline at end of file +MemcardMgr::~MemcardMgr() {} + +bool MemcardMgr::IsWriteMode() { + return (mIsWriteMode >> 1) & 1; +} \ No newline at end of file diff --git a/src/system/meta/MemcardMgr_Wii.h b/src/system/meta/MemcardMgr_Wii.h index 8bf5f1aa0..7c301906e 100644 --- a/src/system/meta/MemcardMgr_Wii.h +++ b/src/system/meta/MemcardMgr_Wii.h @@ -10,6 +10,7 @@ class MemcardMgr : public MsgSource, public ThreadCallback { virtual ~MemcardMgr(); virtual int ThreadStart(); virtual void ThreadDone(int); + bool IsWriteMode(); bool unk20; char unk21[64]; @@ -20,7 +21,7 @@ class MemcardMgr : public MsgSource, public ThreadCallback { int unkb0; int unkb4; bool unkb8; - bool unkb9; + bool mIsWriteMode; // 0xB9 int unkbc; int unkc0; // mState int unkc4; diff --git a/src/system/utl/BufStreamNAND.cpp b/src/system/utl/BufStreamNAND.cpp index de33d738f..4cfff01f7 100644 --- a/src/system/utl/BufStreamNAND.cpp +++ b/src/system/utl/BufStreamNAND.cpp @@ -1,14 +1,7 @@ #include "BufStreamNAND.h" -#include "PowerPC_EABI_Support/Runtime/__mem.h" -#include "math/SHA1.h" -#include "math/StreamChecksum.h" -#include "meta/FixedSizeSaveableStream.h" -#include "os/Debug.h" -#include "os/Memcard.h" -#include "revolution/nand/nand.h" +#include "meta/MemcardMgr_Wii.h" #include "rndwii/Rnd.h" -#include "utl/BinStream.h" -#include "utl/Symbol.h" + BufStreamNAND::BufStreamNAND(void *v1, int i1, char* buffer, bool b1) : FixedSizeSaveableStream(v1, i1, b1), mBuffer(buffer), mChecksum(0), mBytesChecksummed(0), mSize(i1), mFilePath(), mFileOpen(0) { @@ -199,4 +192,20 @@ bool BufStreamNAND::FinishWrite() { if(result) mFail = true; return result; +} + +int BufStreamNAND::DoSeek(int i1, BinStream::SeekType seekType) { + +} + +void BufStreamNAND::SeekImpl(int i1, BinStream::SeekType seekType) { + if(TheMemcardMgr.IsWriteMode() && SaveBufferToNAND(false) != 0) + mFail = true; + else { + DoSeek(i1, seekType); + if(!TheMemcardMgr.IsWriteMode() && LoadBufferFromNAND()) { + mFail = true; + } + } + } \ No newline at end of file diff --git a/src/system/utl/BufStreamNAND.h b/src/system/utl/BufStreamNAND.h index 6dc5ae3d0..86a81413c 100644 --- a/src/system/utl/BufStreamNAND.h +++ b/src/system/utl/BufStreamNAND.h @@ -29,6 +29,7 @@ class BufStreamNAND : public FixedSizeSaveableStream { int SaveBufferToNAND(bool); int DoSeek(int, BinStream::SeekType); bool FinishWrite(); + void SeekImpl(int, BinStream::SeekType); char *mBuffer; // 0x68 int mTell; // 0x70 From 381523a88df402e9e17f24206d315c6748b90414 Mon Sep 17 00:00:00 2001 From: jsenior10 Date: Sun, 17 Aug 2025 21:57:44 +0100 Subject: [PATCH 9/9] More cleanup --- src/band3/meta_band/SongSortByRank.cpp | 9 --------- 1 file changed, 9 deletions(-) diff --git a/src/band3/meta_band/SongSortByRank.cpp b/src/band3/meta_band/SongSortByRank.cpp index 1e7ae4187..e764a1282 100644 --- a/src/band3/meta_band/SongSortByRank.cpp +++ b/src/band3/meta_band/SongSortByRank.cpp @@ -1,17 +1,8 @@ #include "meta_band/SongSortByRank.h" #include "meta/Sorting.h" -#include "meta/StoreOffer.h" -#include "meta_band/BandSongMgr.h" #include "meta_band/MusicLibrary.h" #include "meta_band/ProfileMgr.h" -#include "meta_band/SongSortNode.h" -#include "meta_band/StoreSongSortNode.h" #include "net_band/RockCentral.h" -#include "net_band/RockCentralMsgs.h" -#include "obj/ObjMacros.h" -#include "os/Debug.h" -#include "stl/pointers/_vector.h" -#include "utl/Symbols4.h" RankCmp::RankCmp(int val, const char *name, RankCmp::RankType ty) : mVal(val), mSongName(name), mType(ty) {}