From ac8bffd1a2568815619fd2e40c0578650e70b7ee Mon Sep 17 00:00:00 2001 From: ihatecompvir Date: Fri, 26 Jan 2024 22:12:56 -0800 Subject: [PATCH 01/11] WIP refactor for game origin icon system --- include/SetlistHooks.h | 3 + include/SongSort.h | 5 ++ include/ports.h | 7 +++ include/rb3/BandLabel.h | 1 + include/rb3/FilePath.h | 15 +++++ include/rb3/MusicLibrary.h | 11 ++++ include/rb3/Object.h | 3 + include/rb3/Rnd/RndMat.h | 55 +++++++++++++++++ include/rb3/Rnd/RndTex.h | 51 ++++++++++++++++ include/rb3/SortNode.h | 45 +++++++++++--- include/rb3/String.h | 2 + include/rb3/UI/UIListSlot.h | 10 +++ include/rb3_include.h | 3 + source/SetlistHooks.c | 118 +++++++++++++++++++++++------------- source/_functions.c | 10 +++ source/rb3enhanced.c | 11 +++- 16 files changed, 299 insertions(+), 51 deletions(-) create mode 100644 include/rb3/FilePath.h create mode 100644 include/rb3/Rnd/RndMat.h create mode 100644 include/rb3/Rnd/RndTex.h create mode 100644 include/rb3/UI/UIListSlot.h diff --git a/include/SetlistHooks.h b/include/SetlistHooks.h index 51d1e34..c6092a1 100644 --- a/include/SetlistHooks.h +++ b/include/SetlistHooks.h @@ -3,8 +3,11 @@ Hooks for modifying the setlist/song selection screen. */ +#include "rb3/MusicLibrary.h" #include "rb3/BandLabel.h" #include "rb3/SortNode.h" +#include "rb3/Rnd/RndMat.h" void SetSongAndArtistNameHook(BandLabel *label, SortNode *sortNode); void SetSongNameFromNodeHook(BandLabel *label, SortNode *sortNode); +RndMat *MusicLibraryMatHook(MusicLibrary *thisMusicLibrary, int unk, int unk2, int *listSlot); diff --git a/include/SongSort.h b/include/SongSort.h index 120274e..5c2e10b 100644 --- a/include/SongSort.h +++ b/include/SongSort.h @@ -6,6 +6,11 @@ #include "rb3/Symbol.h" #include "rb3/SongSortByRecentEntry.h" +typedef struct _SongSortMgr +{ + int *vtable; +} SongSortMgr; + SongSortByRecentEntry *SongSortByRecentHook(int *songSortByRecent, int *unk, char *songName, char *gameOrigin, int *unk2); Symbol *GetSymbolByGameOriginHook(Symbol *sym, int gameOrigin); int GetGameOriginBySymbolHook(Symbol sym); diff --git a/include/ports.h b/include/ports.h index e74abcf..79963ad 100644 --- a/include/ports.h +++ b/include/ports.h @@ -127,6 +127,13 @@ #define PORT_INITSONGMETADATA 0x827aa450 // InitSongMetadata #define PORT_UPDATEPRESENCE 0x82680430 // PresenceMgr::UpdatePresence #define PORT_STEPSEQUENCEJOBSETSTEP 0x82af92b8 // Quazal::StepSequenceJob::SetStep +#define PORT_RNDTEXNEWOBJECT 0x82273de0 // RndTex::NewObject +#define PORT_RNDMATNEWOBJECT 0x8240f5d0 // RndMat::NewObject +#define PORT_RNDTEXSETBITMAP 0x823ff678 // RndTex::SetBitmap +#define PORT_RNDTEXSETBITMAP2 0x823ff240 // RndTex::SetBitmap2 +#define PORT_FILEPATHCONSTRUCTOR 0x82270210 // FilePath::__ct +#define PORT_MUSICLIBRARYSETUILISTLABELS 0x8253cd90 // MusicLibrary::SetUIListLabels +#define PORT_MUSICLIBRARY_CT 0x825451c8 // MusicLibrary::__ct // instance addresses #define PORT_MODIFIERMGR_POINTER 0x82dfec08 // pointer to ModifierManager #define PORT_ROCKCENTRALGATEWAY 0x82cc8f60 // address of RockCentralGateway diff --git a/include/rb3/BandLabel.h b/include/rb3/BandLabel.h index 2c76a7e..b8b4e4c 100644 --- a/include/rb3/BandLabel.h +++ b/include/rb3/BandLabel.h @@ -17,5 +17,6 @@ typedef struct _BandLabel extern void SetSongAndArtistName(BandLabel *label, SortNode *unk); extern void SetSongNameFromNode(BandLabel *label, SortNode *unk); extern void BandLabelSetDisplayText(BandLabel *label, char *text, int unk); +extern int MusicLibraryMat(void *thisMusicLibrary, int unk, int unk2, int *listSlot); // returns the material for UIListMeshes in the music library #endif // _BANDLABEL_H \ No newline at end of file diff --git a/include/rb3/FilePath.h b/include/rb3/FilePath.h new file mode 100644 index 0000000..e57c02b --- /dev/null +++ b/include/rb3/FilePath.h @@ -0,0 +1,15 @@ +#ifndef _FILEPATH_H +#define _FILEPATH_H + +#include "String.h" + +typedef struct _FilePath +{ + String path; +} FilePath; + +// even though the structure of FilePath is very simplistic we need to use the constructor as it calls +// extra functions to properly construct paths and etc. +FilePath *FilePathConstructor(FilePath *thisFilePath, char *path); + +#endif // _FILEPATH_H \ No newline at end of file diff --git a/include/rb3/MusicLibrary.h b/include/rb3/MusicLibrary.h index ac6d99c..7ec79ce 100644 --- a/include/rb3/MusicLibrary.h +++ b/include/rb3/MusicLibrary.h @@ -3,7 +3,18 @@ #include "Symbol.h" +typedef struct _MusicLibrary +{ + char unk[0xfc]; + int unk2; +} MusicLibrary; + // Jumps to a given entry in the music library void MusicLibrarySelect(int theMusicLibrary, Symbol entryName, int sortType, int unk_r6); +int *MusicLibraryConstructor(int *thisMusicLibrary, int unk); +int *MusicLibraryConstructorHook(MusicLibrary *thisMusicLibrary, int unk); // + +//// i dont know what these are really called so i just put something lol +int MusicLibraryUnk1(int *unk, int unk2); #endif // _MUSICLIBRARY_H_ diff --git a/include/rb3/Object.h b/include/rb3/Object.h index 99e5a28..822c695 100644 --- a/include/rb3/Object.h +++ b/include/rb3/Object.h @@ -77,6 +77,9 @@ struct _Object char *note; char *name; + int *objectDir; + int *objRefHead; + int *objRefTail; }; #endif // _OBJECT_H \ No newline at end of file diff --git a/include/rb3/Rnd/RndMat.h b/include/rb3/Rnd/RndMat.h new file mode 100644 index 0000000..2a1c72e --- /dev/null +++ b/include/rb3/Rnd/RndMat.h @@ -0,0 +1,55 @@ +#ifndef _RNDMAT_H +#define _RNDMAT_H + +#include "rb3/Rnd/RndTex.h" +#include "rb3/Object.h" + +typedef struct _Color +{ + float r; + float g; + float b; + float a; +} Color; + +typedef enum _BlendMode +{ + BlendDest = 0, + BlendSrc = 1, + BlendAdd = 2, + BlendSrcAlpha = 3, + BlendSubtract = 4, + BlendMultiply = 5, + PreMultiplyAlpha = 6 +} BlendMode; + +typedef struct _RndMat +{ + Object object; + BlendMode blend; + Color diffuseColor; + int zMode; + int stencilMode; + int texGen; + int texWrap; + char pad2[0x40]; + ObjPtr_RndTex diffuseTex; + char intensify; + char useEnviron; + char preLit; + char alphaCut; + char alphaWrite; + char pad3[0x3]; + int alphaThreshold; + ObjPtr_RndTex nextPass; + float emissiveMultiplier; + Color specularColor; + Color specularColor2; + ObjPtr_RndTex normalMap; + ObjPtr_RndTex emissiveMap; + ObjPtr_RndTex specularMap; +} RndMat; + +RndMat *RndMatNewObject(); + +#endif // _RNDMAT_H \ No newline at end of file diff --git a/include/rb3/Rnd/RndTex.h b/include/rb3/Rnd/RndTex.h new file mode 100644 index 0000000..ee5bc75 --- /dev/null +++ b/include/rb3/Rnd/RndTex.h @@ -0,0 +1,51 @@ +#ifndef _RNDTEX_H +#define _RNDTEX_H + +#include "rb3/Object.h" + +typedef enum _BitmapType +{ + RGBA = 3, + DXT1 = 8, + DXT5 = 24, + ATI2 = 32, + TPL_CMP = 72, + TPL_CMP_ALPHA = 328, +} BitmapType; + +typedef struct _RndBitmap +{ + char pad[0x1c]; + +} RndBitmap; + +typedef struct _RndTex +{ + Object object; + RndBitmap bitmap; + float mipMapK; + int type; + int width; + int height; + int bpp; + String name; + int mipLevels; + int unk; + int unk2; +} RndTex; + +typedef struct _ObjPtr_RndTex +{ + int *vtable; + Object *object; + RndTex *tex; +} ObjPtr_RndTex; + +RndTex *RndTexNewObject(); +void RndTexSetBitmap(RndTex *thisRndTex, FilePath *path); +void RndTexSetBitmap2(RndTex *thisRndTex, int width, int height, int bpp, int type, int mips, int unk); + +void RndBitmapGenerateMips(RndBitmap *thisBitmap); +int RndBitmapNumMips(RndBitmap *thisBitmap); + +#endif // _RNDTEX_H \ No newline at end of file diff --git a/include/rb3/SortNode.h b/include/rb3/SortNode.h index 0a5a0db..cff3559 100644 --- a/include/rb3/SortNode.h +++ b/include/rb3/SortNode.h @@ -1,26 +1,55 @@ #ifndef _SORTNODE_H #define _SORTNODE_H +#include "Object.h" +#include "Symbol.h" #include "SongMetadata.h" -typedef struct _Unknown2 +typedef struct _SortNode SortNode; + +typedef int (*ReturnsZero_t)(); +typedef void (*OnlyReturns_t)(); +typedef int (*GetNodeType_t)(); +typedef Symbol (*GetToken_t)(); +typedef int (*GetSongCount_t)(SortNode *thisSortNode); +typedef Symbol (*OnSelect_t)(SortNode *thisSortNode); +typedef Symbol (*Select_t)(SortNode *thisSortNode); + +typedef struct _SortNodeVtable +{ + Object_vtable objectVtable; + GetNodeType_t getNodeType; + GetToken_t getToken; + GetSongCount_t getSongCount; + ReturnsZero_t returnsZero1; + OnlyReturns_t onlyReturns1; + OnSelect_t onSelect; + Select_t select; + OnlyReturns_t onlyReturns2; + // there is more here but not really relevant atm + +} SortNodeVtable; + +typedef struct _SongRecord { + int *vtable; #ifdef RB3E_WII char unknown[0xfc]; #else - char unknown[0x108]; + char unknown[0x104]; #endif SongMetadata *metaData; -} Unknown2; +} SongRecord; -typedef struct _SortNode +struct _SortNode { + SortNodeVtable *vtable; #ifdef RB3E_WII - char something[0x34]; + char something[0x30]; #else - char something[0x40]; + char something[0x3c]; #endif - Unknown2 *somethingElse; -} SortNode; + SongRecord *record; +}; #endif // _SORTNODE_H \ No newline at end of file diff --git a/include/rb3/String.h b/include/rb3/String.h index b1973f3..7c3e5b2 100644 --- a/include/rb3/String.h +++ b/include/rb3/String.h @@ -8,4 +8,6 @@ typedef struct _String char *buf; } String; +int StringConstructor(int *thisFactory, String *str); + #endif // _STRING_H \ No newline at end of file diff --git a/include/rb3/UI/UIListSlot.h b/include/rb3/UI/UIListSlot.h new file mode 100644 index 0000000..af82073 --- /dev/null +++ b/include/rb3/UI/UIListSlot.h @@ -0,0 +1,10 @@ +#ifndef _UILISTSLOT_H +#define _UILISTSLOT_H + +typedef struct _UIListSlot +{ + char unk[0x6c]; + char *name; +} UIListSlot; + +#endif // _UILISTSLOT_H \ No newline at end of file diff --git a/include/rb3_include.h b/include/rb3_include.h index d786164..af8484b 100644 --- a/include/rb3_include.h +++ b/include/rb3_include.h @@ -14,6 +14,7 @@ #include "rb3/Data.h" #include "rb3/DirLoader.h" #include "rb3/File.h" +#include "rb3/FilePath.h" #include "rb3/FileStream.h" #include "rb3/Game.h" #include "rb3/GameGem.h" @@ -41,6 +42,8 @@ // rnd headers #include "rb3/Rnd/RndPropAnim.h" +#include "rb3/Rnd/RndMat.h" +#include "rb3/Rnd/RndTex.h" // UI headers #include "rb3/UI/UIPanel.h" diff --git a/source/SetlistHooks.c b/source/SetlistHooks.c index 6f1fd85..1acbc96 100644 --- a/source/SetlistHooks.c +++ b/source/SetlistHooks.c @@ -9,47 +9,53 @@ #include "config.h" #include "ports.h" #include "rb3/BandLabel.h" +#include "rb3/FilePath.h" +#include "rb3/MusicLibrary.h" +#include "rb3/UI/UIListSlot.h" #include "rb3/UI/UIPanel.h" +#include "SongSort.h" #include "rb3/SortNode.h" +#include "rb3/Rnd/RndMat.h" +#include "rb3/Rnd/RndTex.h" -static char *originToIcon[][2] = { - {"rb1", "Y "}, - {"rb2", "2 "}, - {"rb3", "B "}, - {"rb4", "1 "}, - {"rb_blitz", "X "}, - {"ugc", "U "}, - {"ugc_c3", "y "}, - {"ugc_plus", "U "}, - {"ugc1", "U "}, - {"ugc2", "U "}, - {"lego", "A "}, - {"greenday", "0 "}, - {"beatles", "b "}, - {"gh1", "R "}, - {"gh2", "S "}, - {"gh3", "s "}, - {"onyxite", "G "}, -}; -static int numOriginToIcon = sizeof(originToIcon) / sizeof(originToIcon[0]); +static RndTex *tex = {0}; +static RndMat *mat = {0}; + +void CreateMaterials() +{ + // create our new RndTex and RndMat + tex = RndTexNewObject(); + mat = RndMatNewObject(); + + if (tex != NULL && mat != NULL) + { + int i = 0; + FilePath texPath = {0}; + FilePathConstructor(&texPath, "ui/resource/game_origins/rb3_keep.bmp"); + + RndTexSetBitmap(tex, &texPath); + + mat->diffuseTex.tex = tex; + + // allow the material to become transparent so alpha channel does not appear black + // not sure if all of this is really necessary + mat->blend = BlendSrcAlpha; + mat->preLit = 1; + mat->useEnviron = 0; + mat->alphaCut = 0; + mat->alphaThreshold = 0; + mat->intensify = 0; + } +} void SetSongAndArtistNameHook(BandLabel *label, SortNode *sortNode) { char newLabel[1024] = {0}; - char *originLabel = "0 "; // default - int i = 0; + char *originLabel = " "; // default if (config.GameOriginIcons == 1 && strlen(label->string) < 1000) { SetSongAndArtistName(label, sortNode); - for (i = 0; i < numOriginToIcon; i++) - { - if (strcmp(sortNode->somethingElse->metaData->gameOrigin, originToIcon[i][0]) == 0) - { - originLabel = originToIcon[i][1]; - break; - } - } strcat(newLabel, originLabel); strcat(newLabel, label->string); BandLabelSetDisplayText(label, newLabel, 1); @@ -62,22 +68,11 @@ void SetSongAndArtistNameHook(BandLabel *label, SortNode *sortNode) void SetSongNameFromNodeHook(BandLabel *label, SortNode *sortNode) { char newLabel[1024] = {0}; - char *originLabel = "0 "; // default - int i = 0; - - RB3E_DEBUG("SetSongNameFromNode: %s", label->string); + char *originLabel = " "; // default if (config.GameOriginIcons == 1 && strlen(label->string) < 1000) { SetSongNameFromNode(label, sortNode); - for (i = 0; i < numOriginToIcon; i++) - { - if (strcmp(sortNode->somethingElse->metaData->gameOrigin, originToIcon[i][0]) == 0) - { - originLabel = originToIcon[i][1]; - break; - } - } strcat(newLabel, originLabel); strcat(newLabel, label->string); BandLabelSetDisplayText(label, newLabel, 1); @@ -85,4 +80,43 @@ void SetSongNameFromNodeHook(BandLabel *label, SortNode *sortNode) } SetSongNameFromNode(label, sortNode); return; +} + +int *MusicLibraryConstructorHook(int *thisMusicLibrary, int unk) +{ + CreateMaterials(); + return MusicLibraryConstructor(thisMusicLibrary, unk); +} + +RndMat *MusicLibraryMatHook(MusicLibrary *thisMusicLibrary, int unk, int unk2, UIListSlot *listSlot) +{ + if (listSlot != NULL) + { + if (mat != NULL && tex != NULL) + { + if (strcmp(listSlot->name, "game_origin_picture_slot") == 0) + { + int *ret = 0; + SortNode *node = 0; + int nodeType = 0; + + ret = ((int *)(*(void **)0x82dfee5c))[thisMusicLibrary->unk2 + 0x13]; + if (ret != NULL) + { + node = MusicLibraryUnk1(ret, unk2); + if (node != NULL) + { + nodeType = node->vtable->getNodeType(); + if (nodeType == 4) + { + RB3E_DEBUG("vtable: %i", node->record->vtable); + return mat; + } + } + } + } + } + } + + return MusicLibraryMat(thisMusicLibrary, unk, unk2, listSlot); } \ No newline at end of file diff --git a/source/_functions.c b/source/_functions.c index c801ab7..96ba7f4 100644 --- a/source/_functions.c +++ b/source/_functions.c @@ -92,3 +92,13 @@ RB3E_STUB(QueuingSocketBind) RB3E_STUB(OperatorEqualsFmt) RB3E_STUB(UpdatePresence) RB3E_STUB(StepSequenceJobSetStep) +RB3E_STUB(RndTexNewObject) +RB3E_STUB(RndMatNewObject) +RB3E_STUB(RndTexSetBitmap) +RB3E_STUB(RndTexSetBitmap2) +RB3E_STUB(FilePathConstructor) +RB3E_STUB(MusicLibraryMat) +RB3E_STUB(RndCreateDefaultTexture) +RB3E_STUB(MusicLibraryConstructor) +RB3E_STUB(MusicLibraryUnk1) +RB3E_STUB(StringConstructor) \ No newline at end of file diff --git a/source/rb3enhanced.c b/source/rb3enhanced.c index 4415c8d..0c61d6f 100644 --- a/source/rb3enhanced.c +++ b/source/rb3enhanced.c @@ -323,6 +323,12 @@ void InitialiseFunctions() POKE_B(&JoypadGetPadData, PORT_JOYPADGETPADDATA); POKE_B(&MemAlloc, PORT_MEMALLOC); POKE_B(&MemFree, PORT_MEMFREE); + POKE_B(&RndTexNewObject, PORT_RNDTEXNEWOBJECT); + POKE_B(&RndMatNewObject, PORT_RNDMATNEWOBJECT); + POKE_B(&RndTexSetBitmap, PORT_RNDTEXSETBITMAP); + POKE_B(&RndTexSetBitmap2, PORT_RNDTEXSETBITMAP2); + POKE_B(&FilePathConstructor, PORT_FILEPATHCONSTRUCTOR); + POKE_B(&MusicLibraryUnk1, 0x825bf708); RB3E_MSG("Functions initialized!", NULL); } @@ -356,13 +362,16 @@ void ApplyHooks() HookFunction(PORT_INITSONGMETADATA, &InitSongMetadata, &InitSongMetadataHook); HookFunction(PORT_UPDATEPRESENCE, &UpdatePresence, &UpdatePresenceHook); + HookFunction(PORT_MUSICLIBRARY_CT, &MusicLibraryConstructor, &MusicLibraryConstructorHook); #ifdef RB3E_WII // wii exclusive hooks HookFunction(PORT_USBWIIGETTYPE, &UsbWiiGetType, &UsbWiiGetTypeHook); HookFunction(PORT_WIINETINIT_DNSLOOKUP, &StartDNSLookup, &StartDNSLookupHook); #elif RB3E_XBOX // 360 exclusive hooks HookFunction(PORT_STAGEKIT_SET_STATE, &StagekitSetState, &StagekitSetStateHook); HookFunction(PORT_SETSONGNAMEFROMNODE, &SetSongNameFromNode, &SetSongNameFromNodeHook); - // TODO: port these to Wii + HookFunction(0x8253b440, &MusicLibraryMat, &MusicLibraryMatHook); + + // TODO: port these to Wii POKE_B(PORT_GETSONGID, &GetSongIDHook); POKE_BL(PORT_SONG_ID_EVALUATE, &MetadataSongIDHook); POKE_BL(PORT_LOADOBJS_BCTRL, &LoadObj); From b394fd459022f8e46ec586b92903444b309ec7a0 Mon Sep 17 00:00:00 2001 From: ihatecompvir Date: Sat, 17 Feb 2024 21:53:30 -0800 Subject: [PATCH 02/11] More ports for Wii, rename things to proper names --- include/GemHooks.h | 2 +- include/ports.h | 132 ++++++++++++++++------------- include/rb3/App.h | 2 +- include/rb3/Archive.h | 2 +- include/rb3/BandLabel.h | 4 +- include/rb3/BandSongMgr.h | 2 +- include/rb3/BandUserMgr.h | 2 +- include/rb3/BinStream.h | 7 ++ include/rb3/ChunkStream.h | 12 ++- include/rb3/File.h | 10 ++- include/rb3/FileStream.h | 7 +- include/rb3/Locale.h | 2 +- include/rb3/MusicLibrary.h | 8 +- include/rb3/Object.h | 2 +- include/rb3/PassiveMessagesPanel.h | 2 +- include/rb3/Platform.h | 13 +++ include/rb3/Rnd/RndMat.h | 61 ++++++++++--- include/rb3/Rnd/RndTex.h | 4 +- include/rb3/Rnd/Transform.h | 24 ++++++ include/rb3/SortNode.h | 29 +++++-- source/LocaleHooks.c | 20 ++--- source/MiloSceneHooks.c | 4 +- source/SetlistHooks.c | 19 ++--- source/_functions.c | 2 +- source/rb3enhanced.c | 19 ++--- 25 files changed, 254 insertions(+), 137 deletions(-) create mode 100644 include/rb3/Platform.h create mode 100644 include/rb3/Rnd/Transform.h diff --git a/include/GemHooks.h b/include/GemHooks.h index c498e88..64248a0 100644 --- a/include/GemHooks.h +++ b/include/GemHooks.h @@ -7,6 +7,6 @@ #include "rb3/Symbol.h" int WillBeNoStrumHook(int *gameGemListPtr, int *multiGemInfoPtr); -int *GetWidgetByNameHook(int *gemManager, Symbol sym); +int *GetWidgetByNameHook(int *gemManager, Symbol name); int AddGameGemHook(int *gameGemList, GameGem *gem, NoStrumState gemType); Symbol GetSlotColorHook(int *bandUser); \ No newline at end of file diff --git a/include/ports.h b/include/ports.h index 79963ad..d37d5d5 100644 --- a/include/ports.h +++ b/include/ports.h @@ -132,8 +132,9 @@ #define PORT_RNDTEXSETBITMAP 0x823ff678 // RndTex::SetBitmap #define PORT_RNDTEXSETBITMAP2 0x823ff240 // RndTex::SetBitmap2 #define PORT_FILEPATHCONSTRUCTOR 0x82270210 // FilePath::__ct -#define PORT_MUSICLIBRARYSETUILISTLABELS 0x8253cd90 // MusicLibrary::SetUIListLabels #define PORT_MUSICLIBRARY_CT 0x825451c8 // MusicLibrary::__ct +#define PORT_MUSICLIBRARYMAT 0x8253b440 // MusicLibrary::Mat +#define PORT_MUSICLIBRARYGETNODEBYINDEX 0x825bf708 // MusicLibrary::GetNodeByIndex // instance addresses #define PORT_MODIFIERMGR_POINTER 0x82dfec08 // pointer to ModifierManager #define PORT_ROCKCENTRALGATEWAY 0x82cc8f60 // address of RockCentralGateway @@ -195,66 +196,75 @@ void DbgPrint(const char *s, ...); #define PORT_UPDATEPRESENCEBLOCK_B 0x80188194 // branch after the failure case in a function that calls UpdatePresence // #define PORT_LOADOBJS_BCTRL 0x827562e4 // function patch addresses -#define PORT_SETDISKERROR 0x8030ce7c // PlatformMgr::SetDiskError -#define PORT_NEWFILE 0x802f9ed0 // NewFile -#define PORT_SETTRACKSPEED 0x80441ee0 // TrackPanelDirBase::UpdateTrackSpeed -#define PORT_SETSONGSPEED 0x801130d0 // Game::SetMusicSpeed -#define PORT_MODIFIERMGR_CT 0x8022c1b4 // ModifierManager::__ct -#define PORT_MODIFIERMGR_ACTIVE 0x8022c830 // ModifierManager::ModifierActive -#define PORT_SYMBOL_CT 0x80363f60 // Symbol::Symbol -#define PORT_LOCALIZE 0x803506f4 // Locale::Localize -#define PORT_SETVENUE 0x802282dc // MetaPerformer::SetVenue(?) (actual func name is not known) -#define PORT_EXECUTEDTA 0x802cf7e0 // RockCentralGateway::ExecuteConfig -#define PORT_BANDLABELSETDISPLAYTEXT 0x803b1858 // BandLabel::SetDisplayText -#define PORT_SETSONGANDARTISTNAME 0x801b68a8 // BandLabel::SetSongAndArtistName -#define PORT_KEYSONGUITAR 0x80242ab4 // function that checks "key_keys_on_guitar" -#define PORT_HMXFACTORYFUNCAT 0x8031b2f8 // HmxObjectFactoryFunc::_at -#define PORT_WILLBENOSTRUM 0x80463010 // GameGemList::WillBeNoStrum -#define PORT_ADDGAMEGEM 0x80463198 // GameGemList::AddGameGem -#define PORT_SETADDRESS 0x8001bf74 // Quazal::InetAddress::SetAddress -#define PORT_RANDOMINT 0x802ddd60 // RandomInt(min, max) -#define PORT_GETWIDGETBYNAME 0x800d59b0 // GemManager::GetWidgetByName -#define PORT_DATANODEEVALUATE 0x80322e9c // DataNode::Evaluate -#define PORT_GETSLOTCOLOR 0x800e42a4 // TrackConfig::GetSlotColor -#define PORT_USBWIIGETTYPE 0x806c1a3c // UsbWii::GetType -#define PORT_FILE_EXISTS 0x802fa134 // FileExists -#define PORT_QUEUEMESSAGE 0x80253c50 // PassiveMessagesPanel::QueueMessage -#define PORT_SETSYSTEMLANGUAGE 0x8030f308 // SetSystemLanguage -#define PORT_ISSUPPORTEDLANGUAGE 0x8030f280 // IsSupportedLanguage -#define PORT_DATAREADFILE 0x80319bdc // DataReadFile -#define PORT_GAME_CT 0x80110f20 // Game::__ct -#define PORT_GAME_DT 0x80111614 // Game::__dt -#define PORT_GAMEGETACTIVEPLAYER 0x8011346c // Game::GetActivePlayer -#define PORT_WIINETINIT_DNSLOOKUP 0x8030c3a0 // WiiNetInit::StartDNSLookup -#define PORT_BUILDINSTRUMENTSELECTION 0x802478a8 // BuildInstrumentSelectionList(?) - actual name not known -#define PORT_PREPARESOMEVECTORMAYBE 0x80247c58 // Prepares some vector, used by BuildInstrumentSelectionList -#define PORT_SOMEVECTORPUSHBACKMAYBE 0x802484a8 // vector,class_stlpmtx_std::StlNodeAlloc_>_>::push_back -#define PORT_POSTPROC_DOPOST 0x806b52b4 // WiiPostProc::DoPost -#define PORT_MUSICLIBRARYSELECTMAYBE 0x80230d64 // Selects an entry in the Music Library screen - actual name not known -#define PORT_GETSYMBOLBYGAMEORIGIN 0x8027dd3c // SongSortByRecent::GetSymbolByGameOrigin -#define PORT_GETGAMEORIGINBYSYMBOL 0x8027dc58 // SongSortByRecent::GetGameOriginBySymbol -#define PORT_SONGSORTBYRECENT 0x8027dba8 // RecentCmp::__ct -#define PORT_FILESTREAM_CT 0x8034c9f8 // FileStream::__ct (the one that takes a char * path instead of a File object) -#define PORT_CHUNKSTREAM_CT 0x8034aa90 // ChunkStream::__ct -#define PORT_GETBANDUSERFROMSLOT 0x8010021c // BandUserMgr::GetBandUserFromSlot -#define PORT_GETBANDUSERS 0x80100558 // BandUserMgr::GetBandUsers -#define PORT_GETSONGSHORTNAME 0x80224edc // MetaPerformer::GetSongShortname(?) - actual name not known -#define PORT_GETMETADATA 0x80515510 // BandSongMgr::Data (function renamed from the original name to avoid any confusion with Data.h) -#define PORT_GETSONGID 0x8051513c // GetSongID, function used when adding songs to BandSongMgr -#define PORT_SONGMGRGETRANKEDSONGS 0x801d1590 // BandSongMgr::GetRankedSongs(?) - not sure on the real name of the function -#define PORT_GETSONGIDFROMSHORTNAME 0x801d0b44 // BandSongMgr::GetSongIDFromShortname -#define PORT_RNDPROPANIMSETFRAME 0x80632790 // RndPropAnim::SetFrame -#define PORT_DYNAMICCAST 0x806f5e78 // dynamic_cast -#define PORT_OBJECTFINDUIPANEL 0x80101d74 // Object::Find -#define PORT_JOYPADGETPADDATA 0x80302eec // JoypadGetPadData -#define PORT_MEMALLOC 0x80353e18 // MemAlloc -#define PORT_MEMFREE 0x80354238 // MemFree -#define PORT_SYMBOLPREINIT 0x80364c74 // Symbol::PreInit -#define PORT_QUEUINGSOCKET_BIND 0x800478d4 // Quazal::QueuingSocket::Bind -#define PORT_QUAZALSOCKET_BIND 0x8001cd10 // Quazal::Socket::Bind -#define PORT_INITSONGMETADATA 0x805147a4 // InitSongMetadata -#define PORT_UPDATEPRESENCE 0x801879d4 // PresenceMgr::UpdatePresence -#define PORT_STEPSEQUENCEJOBSETSTEP 0x80025364 // Quazal::StepSequenceJob::SetStep +#define PORT_SETDISKERROR 0x8030ce7c // PlatformMgr::SetDiskError +#define PORT_NEWFILE 0x802f9ed0 // NewFile +#define PORT_SETTRACKSPEED 0x80441ee0 // TrackPanelDirBase::UpdateTrackSpeed +#define PORT_SETSONGSPEED 0x801130d0 // Game::SetMusicSpeed +#define PORT_MODIFIERMGR_CT 0x8022c1b4 // ModifierManager::__ct +#define PORT_MODIFIERMGR_ACTIVE 0x8022c830 // ModifierManager::ModifierActive +#define PORT_SYMBOL_CT 0x80363f60 // Symbol::Symbol +#define PORT_LOCALIZE 0x803506f4 // Locale::Localize +#define PORT_SETVENUE 0x802282dc // MetaPerformer::SetVenue(?) (actual func name is not known) +#define PORT_EXECUTEDTA 0x802cf7e0 // RockCentralGateway::ExecuteConfig +#define PORT_BANDLABELSETDISPLAYTEXT 0x803b1858 // BandLabel::SetDisplayText +#define PORT_SETSONGANDARTISTNAME 0x801b68a8 // BandLabel::SetSongAndArtistName +#define PORT_SETSONGNAMEFROMNODE 0x801b6358 // BandLabel::SetSongNameFromNode +#define PORT_KEYSONGUITAR 0x80242ab4 // function that checks "key_keys_on_guitar" +#define PORT_HMXFACTORYFUNCAT 0x8031b2f8 // HmxObjectFactoryFunc::_at +#define PORT_WILLBENOSTRUM 0x80463010 // GameGemList::WillBeNoStrum +#define PORT_ADDGAMEGEM 0x80463198 // GameGemList::AddGameGem +#define PORT_SETADDRESS 0x8001bf74 // Quazal::InetAddress::SetAddress +#define PORT_RANDOMINT 0x802ddd60 // RandomInt(min, max) +#define PORT_GETWIDGETBYNAME 0x800d59b0 // GemManager::GetWidgetByName +#define PORT_DATANODEEVALUATE 0x80322e9c // DataNode::Evaluate +#define PORT_GETSLOTCOLOR 0x800e42a4 // TrackConfig::GetSlotColor +#define PORT_USBWIIGETTYPE 0x806c1a3c // UsbWii::GetType +#define PORT_FILE_EXISTS 0x802fa134 // FileExists +#define PORT_QUEUEMESSAGE 0x80253c50 // PassiveMessagesPanel::QueueMessage +#define PORT_SETSYSTEMLANGUAGE 0x8030f308 // SetSystemLanguage +#define PORT_ISSUPPORTEDLANGUAGE 0x8030f280 // IsSupportedLanguage +#define PORT_DATAREADFILE 0x80319bdc // DataReadFile +#define PORT_GAME_CT 0x80110f20 // Game::__ct +#define PORT_GAME_DT 0x80111614 // Game::__dt +#define PORT_GAMEGETACTIVEPLAYER 0x8011346c // Game::GetActivePlayer +#define PORT_WIINETINIT_DNSLOOKUP 0x8030c3a0 // WiiNetInit::StartDNSLookup +#define PORT_BUILDINSTRUMENTSELECTION 0x802478a8 // BuildInstrumentSelectionList(?) - actual name not known +#define PORT_PREPARESOMEVECTORMAYBE 0x80247c58 // Prepares some vector, used by BuildInstrumentSelectionList +#define PORT_SOMEVECTORPUSHBACKMAYBE 0x802484a8 // vector,class_stlpmtx_std::StlNodeAlloc_>_>::push_back +#define PORT_POSTPROC_DOPOST 0x806b52b4 // WiiPostProc::DoPost +#define PORT_MUSICLIBRARYSELECTMAYBE 0x80230d64 // Selects an entry in the Music Library screen - actual name not known +#define PORT_GETSYMBOLBYGAMEORIGIN 0x8027dd3c // SongSortByRecent::GetSymbolByGameOrigin +#define PORT_GETGAMEORIGINBYSYMBOL 0x8027dc58 // SongSortByRecent::GetGameOriginBySymbol +#define PORT_SONGSORTBYRECENT 0x8027dba8 // RecentCmp::__ct +#define PORT_FILESTREAM_CT 0x8034c9f8 // FileStream::__ct (the one that takes a char * path instead of a File object) +#define PORT_CHUNKSTREAM_CT 0x8034aa90 // ChunkStream::__ct +#define PORT_GETBANDUSERFROMSLOT 0x8010021c // BandUserMgr::GetBandUserFromSlot +#define PORT_GETBANDUSERS 0x80100558 // BandUserMgr::GetBandUsers +#define PORT_GETSONGSHORTNAME 0x80224edc // MetaPerformer::GetSongShortname(?) - actual name not known +#define PORT_GETMETADATA 0x80515510 // BandSongMgr::Data (function renamed from the original name to avoid any confusion with Data.h) +#define PORT_GETSONGID 0x8051513c // GetSongID, function used when adding songs to BandSongMgr +#define PORT_SONGMGRGETRANKEDSONGS 0x801d1590 // BandSongMgr::GetRankedSongs(?) - not sure on the real name of the function +#define PORT_GETSONGIDFROMSHORTNAME 0x801d0b44 // BandSongMgr::GetSongIDFromShortname +#define PORT_RNDPROPANIMSETFRAME 0x80632790 // RndPropAnim::SetFrame +#define PORT_DYNAMICCAST 0x806f5e78 // dynamic_cast +#define PORT_OBJECTFINDUIPANEL 0x80101d74 // Object::Find +#define PORT_JOYPADGETPADDATA 0x80302eec // JoypadGetPadData +#define PORT_MEMALLOC 0x80353e18 // MemAlloc +#define PORT_MEMFREE 0x80354238 // MemFree +#define PORT_SYMBOLPREINIT 0x80364c74 // Symbol::PreInit +#define PORT_QUEUINGSOCKET_BIND 0x800478d4 // Quazal::QueuingSocket::Bind +#define PORT_QUAZALSOCKET_BIND 0x8001cd10 // Quazal::Socket::Bind +#define PORT_INITSONGMETADATA 0x805147a4 // InitSongMetadata +#define PORT_UPDATEPRESENCE 0x801879d4 // PresenceMgr::UpdatePresence +#define PORT_STEPSEQUENCEJOBSETSTEP 0x80025364 // Quazal::StepSequenceJob::SetStep +#define PORT_RNDTEXNEWOBJECT 0x80639904 // RndTex::NewObject +#define PORT_RNDMATNEWOBJECT 0x8063996c // RndMat::NewObject +#define PORT_RNDTEXSETBITMAP 0x8063fccc // RndTex::SetBitmap +#define PORT_RNDTEXSETBITMAP2 0x8063f830 // RndTex::SetBitmap2 +#define PORT_FILEPATHCONSTRUCTOR 0x8000ec5c // FilePath::__ct +#define PORT_MUSICLIBRARY_CT 0x8022d978 // MusicLibrary::__ct +#define PORT_MUSICLIBRARYMAT 0x80231c5c // MusicLibrary::Mat +#define PORT_MUSICLIBRARYGETNODEBYINDEX 0x80279314 // MusicLibrary::GetNodeByIndex // instance addresses #define PORT_MODIFIERMGR_POINTER 0x808fda68 // pointer to ModifierManager #define PORT_ROCKCENTRALGATEWAY 0x80900870 // address of RockCentralGateway diff --git a/include/rb3/App.h b/include/rb3/App.h index 470ca4e..71d3569 100644 --- a/include/rb3/App.h +++ b/include/rb3/App.h @@ -2,6 +2,6 @@ #define _APP_H extern void AppConstructor(void *thisApp, int argc, char **argv); -extern void *NewFile(char *fileName, int flags); // doesn't belong to a namespace? +extern void *NewFile(char *iFilename, int iMode); // doesn't belong to a namespace? #endif // _APP_H \ No newline at end of file diff --git a/include/rb3/Archive.h b/include/rb3/Archive.h index 7ba2028..f395305 100644 --- a/include/rb3/Archive.h +++ b/include/rb3/Archive.h @@ -8,7 +8,7 @@ typedef struct _Archive } Archive; extern void ArchiveInit(void); -extern void ArchiveConstructor(Archive *thisArchive, char *path, int unknown); +extern void ArchiveConstructor(Archive *thisArchive, char *path, int heap_headroom); extern void ArchiveDestructor(Archive *thisArchive); extern void ArchiveMerge(Archive *thisArchive, Archive *otherArchive); extern void ArchiveSetLocationHardDrive(Archive *thisArchive); diff --git a/include/rb3/BandLabel.h b/include/rb3/BandLabel.h index b8b4e4c..5409ce1 100644 --- a/include/rb3/BandLabel.h +++ b/include/rb3/BandLabel.h @@ -16,7 +16,7 @@ typedef struct _BandLabel extern void SetSongAndArtistName(BandLabel *label, SortNode *unk); extern void SetSongNameFromNode(BandLabel *label, SortNode *unk); -extern void BandLabelSetDisplayText(BandLabel *label, char *text, int unk); -extern int MusicLibraryMat(void *thisMusicLibrary, int unk, int unk2, int *listSlot); // returns the material for UIListMeshes in the music library +extern void BandLabelSetDisplayText(BandLabel *label, char *text, char clear_token); +extern int MusicLibraryMat(void *thisMusicLibrary, int data, int unk2, int *listSlot); // returns the material for UIListMeshes in the music library #endif // _BANDLABEL_H \ No newline at end of file diff --git a/include/rb3/BandSongMgr.h b/include/rb3/BandSongMgr.h index 3df138c..6ac1327 100644 --- a/include/rb3/BandSongMgr.h +++ b/include/rb3/BandSongMgr.h @@ -11,6 +11,6 @@ typedef struct _BandSongMgr extern int GetSongIDFromShortname(BandSongMgr *thisSongMgr, Symbol shortName, int fail); // fail seems to be unused on retail builds, but it would simulate a failure on debug builds extern SongMetadata *GetMetadata(BandSongMgr *thisSongMgr, int songId); -extern int SongMgrGetRankedSongs(BandSongMgr *thisSongMgr, void *vector, char demosIfGameModeAllows, char includeRestricted); +extern int SongMgrGetRankedSongs(BandSongMgr *thisSongMgr, void *songs, char demosIfGameModeAllows, char includeRestricted); #endif // _BANDSONGMGR_H diff --git a/include/rb3/BandUserMgr.h b/include/rb3/BandUserMgr.h index 1167524..581b10d 100644 --- a/include/rb3/BandUserMgr.h +++ b/include/rb3/BandUserMgr.h @@ -4,7 +4,7 @@ #include "rb3/BandUser.h" // gives you the number of band users in the current band -extern int GetBandUsers(int thisBandUserMgr, int unknown, int unknown2); +extern int GetBandUsers(int thisBandUserMgr, int pUsers, int flags); // returns the BandUser in a particular overshell slot (overshell slots are left to right, 0-3, so vocals for example is nearly always going to be 2) extern BandUser *GetBandUserFromSlot(int thisBandUserMgr, int slot); diff --git a/include/rb3/BinStream.h b/include/rb3/BinStream.h index 49b12a6..a8f4e4e 100644 --- a/include/rb3/BinStream.h +++ b/include/rb3/BinStream.h @@ -1,6 +1,13 @@ #ifndef _BINSTREAM_H #define _BINSTREAM_H +typedef enum _SeekType +{ + kSeekBegin = 0, + kSeekCur = 1, + kSeekEnd = 2, +} SeekType; + typedef struct _BinStream BinStream; typedef void (*BinStreamDestructor_t)(BinStream *thisBinStream, int unk); diff --git a/include/rb3/ChunkStream.h b/include/rb3/ChunkStream.h index 90962bd..08f9ba5 100644 --- a/include/rb3/ChunkStream.h +++ b/include/rb3/ChunkStream.h @@ -1,6 +1,10 @@ #ifndef _CHUNKSTREAM_H #define _CHUNKSTREAM_H +#include "rb3/BinStream.h" +#include "rb3/File.h" +#include "rb3/Platform.h" + typedef struct _ChunkStream ChunkStream; typedef int (*ChunkStreamDestructor_t)(ChunkStream *thisChunkStream, int unk); @@ -9,9 +13,9 @@ typedef int (*ChunkStreamTell_t)(ChunkStream *thisChunkStream); typedef int (*ChunkStreamEOF_t)(ChunkStream *thisChunkStream); typedef int (*ChunkStreamFail_t)(ChunkStream *thisChunkStream); typedef char *(*ChunkStreamName_t)(ChunkStream *thisChunkStream); -typedef char *(*ChunkStreamReadImpl_t)(ChunkStream *thisChunkStream, void *unk, int unk2); -typedef char *(*ChunkStreamWriteImpl_t)(ChunkStream *thisChunkStream, void *unk, int unk2); -typedef char *(*ChunkStreamSeekImpl_t)(ChunkStream *thisChunkStream, int unk, int seekType); +typedef char *(*ChunkStreamReadImpl_t)(ChunkStream *thisChunkStream, void *data, int bytes); +typedef char *(*ChunkStreamWriteImpl_t)(ChunkStream *thisChunkStream, void *data, int bytes); +typedef char *(*ChunkStreamSeekImpl_t)(ChunkStream *thisChunkStream, int offset, SeekType seekType); typedef int (*ChunkStreamReturnsZero_t)(); typedef struct _ChunkStream_vtable @@ -34,6 +38,6 @@ struct _ChunkStream ChunkStream_vtable *vtable; }; -ChunkStream *ChunkStreamConstructor(ChunkStream *thisChunkStream, char *fileName, int fileType, int flags, char unk2, int platform, char unk3); +ChunkStream *ChunkStreamConstructor(ChunkStream *thisChunkStream, char *fileName, FileType fileType, int chunkSize, char compress, Platform platform, char cached); #endif // _CHUNKSTREAM_H \ No newline at end of file diff --git a/include/rb3/File.h b/include/rb3/File.h index 376e0df..c3111f4 100644 --- a/include/rb3/File.h +++ b/include/rb3/File.h @@ -1,7 +1,15 @@ #ifndef _FILE_H #define _FILE_H +typedef enum _FileType +{ + kRead = 0, + kWrite = 1, + kReadNoArk = 2, + kAppend = 3 +} FileType; + // flags can be used to check the existence of files both inside and outside the ARK, similar to how the NewFile flags work -char FileExists(char *path, int flags); +char FileExists(char *iFilename, int iMode); #endif // _FILE_H \ No newline at end of file diff --git a/include/rb3/FileStream.h b/include/rb3/FileStream.h index eb46211..ccdce2b 100644 --- a/include/rb3/FileStream.h +++ b/include/rb3/FileStream.h @@ -1,6 +1,9 @@ #ifndef _FILESTREAM_H #define _FILESTREAM_H +#include "rb3/BinStream.h" +#include "rb3/File.h" + typedef struct _FileStream FileStream; typedef int (*FileStreamDestructor_t)(FileStream *thisFileStream, int unk); @@ -11,7 +14,7 @@ typedef int (*FileStreamFail_t)(FileStream *thisFileStream); typedef char *(*FileStreamName_t)(FileStream *thisFileStream); typedef char *(*FileStreamReadImpl_t)(FileStream *thisFileStream, void *data, int bytes); typedef char *(*FileStreamWriteImpl_t)(FileStream *thisFileStream, void *data, int bytes); -typedef char *(*FileStreamSeekImpl_t)(FileStream *thisFileStream, int offset, int seekType); +typedef char *(*FileStreamSeekImpl_t)(FileStream *thisFileStream, int offset, SeekType seekType); typedef int (*FileStreamReturnsZero_t)(); typedef struct _FileStream_vtable @@ -36,6 +39,6 @@ struct _FileStream char unk[0x256]; }; -FileStream *FileStreamConstructor(FileStream *thisFileStream, char *fileName, int fileType, char littleEndian); +FileStream *FileStreamConstructor(FileStream *thisFileStream, char *fileName, FileType fileType, char littleEndian); #endif // _FILESTREAM_H \ No newline at end of file diff --git a/include/rb3/Locale.h b/include/rb3/Locale.h index 94991bc..4d67514 100644 --- a/include/rb3/Locale.h +++ b/include/rb3/Locale.h @@ -2,7 +2,7 @@ #define _LOCALE_H // I believe "fail" being set to 1 means that if there is no locale, it will return the raw Symbol and not a blank string or vice versa -extern char *Localize(int thisLocale, Symbol sym, int fail); +extern char *Localize(int thisLocale, Symbol token, int fail); extern void SetSystemLanguage(Symbol lang, int cheat); #endif // _LOCALE_H \ No newline at end of file diff --git a/include/rb3/MusicLibrary.h b/include/rb3/MusicLibrary.h index 7ec79ce..4ab14bb 100644 --- a/include/rb3/MusicLibrary.h +++ b/include/rb3/MusicLibrary.h @@ -11,10 +11,10 @@ typedef struct _MusicLibrary // Jumps to a given entry in the music library void MusicLibrarySelect(int theMusicLibrary, Symbol entryName, int sortType, int unk_r6); -int *MusicLibraryConstructor(int *thisMusicLibrary, int unk); -int *MusicLibraryConstructorHook(MusicLibrary *thisMusicLibrary, int unk); // +int *MusicLibraryConstructor(int *thisMusicLibrary, int *songPreview); +int *MusicLibraryConstructorHook(MusicLibrary *thisMusicLibrary, int *songPreview); -//// i dont know what these are really called so i just put something lol -int MusicLibraryUnk1(int *unk, int unk2); +// in the RB3 debug this function is inlined +SortNode *MusicLibraryGetNodeByIndex(int *ret, int idx); #endif // _MUSICLIBRARY_H_ diff --git a/include/rb3/Object.h b/include/rb3/Object.h index 822c695..73d8502 100644 --- a/include/rb3/Object.h +++ b/include/rb3/Object.h @@ -14,7 +14,7 @@ typedef void (*ObjOnlyReturns_t)(); typedef int (*ObjReturnsZero_t)(); typedef Symbol (*ObjClassName_t)(Symbol retSym); typedef void (*ObjSetType_t)(Object *thisObject, Symbol type); -typedef DataNode *(*ObjHandle_t)(DataNode *retNode, Object *thisObject, DataArray *msg, char unk); +typedef DataNode *(*ObjHandle_t)(DataNode *retNode, Object *thisObject, DataArray *msg, char warn); typedef void (*ObjSyncProperty_t)(Object *thisObject); typedef void (*ObjSave_t)(Object *thisObject, BinStream *binStream); typedef void (*ObjCopy_t)(Object *to, Object *from, int copyType); diff --git a/include/rb3/PassiveMessagesPanel.h b/include/rb3/PassiveMessagesPanel.h index e50e6cd..14a9486 100644 --- a/include/rb3/PassiveMessagesPanel.h +++ b/include/rb3/PassiveMessagesPanel.h @@ -6,6 +6,6 @@ // RB3E function, not a game function, doesn't exactly belong here extern void DisplayMessage(char *message); -void QueueMessage(int *thisPassiveMessagesPanel, DataArray *ptr, int type, char *symText, int unk3); +void QueueMessage(int *thisPassiveMessagesPanel, DataArray *ptr, int type, char *symText, int priority); #endif // _PASSIVEMESSAGESPANEL_H \ No newline at end of file diff --git a/include/rb3/Platform.h b/include/rb3/Platform.h new file mode 100644 index 0000000..6b886c5 --- /dev/null +++ b/include/rb3/Platform.h @@ -0,0 +1,13 @@ +#ifndef _PLATFORM_H +#define _PLATFORM_H + +typedef enum _Platform +{ + kPlatformNone = 0, + kPlatformXbox = 2, + kPlatformPC = 3, + kPlatformPS3 = 4, + kPlatformWii = 5 +} Platform; + +#endif // _PLATFORM_H \ No newline at end of file diff --git a/include/rb3/Rnd/RndMat.h b/include/rb3/Rnd/RndMat.h index 2a1c72e..53a9699 100644 --- a/include/rb3/Rnd/RndMat.h +++ b/include/rb3/Rnd/RndMat.h @@ -2,6 +2,7 @@ #define _RNDMAT_H #include "rb3/Rnd/RndTex.h" +#include "rb3/Rnd/Transform.h" #include "rb3/Object.h" typedef struct _Color @@ -14,25 +15,61 @@ typedef struct _Color typedef enum _BlendMode { - BlendDest = 0, - BlendSrc = 1, - BlendAdd = 2, - BlendSrcAlpha = 3, - BlendSubtract = 4, - BlendMultiply = 5, - PreMultiplyAlpha = 6 + kDest = 0, + kSrc = 1, + kAdd = 2, + kSrcAlpha = 3, + kSrcAlphaAdd = 4, + kSubtract = 5, + kMultiply = 6, + kPreMultAlpha = 7 } BlendMode; +typedef enum _ZMode +{ + kDisable = 0, + kNormal = 1, + kTransparent = 2, + kForce = 3, + kDecal = 4 +} ZMode; + +typedef enum _StencilMode +{ + kStencilIgnore = 0, + kStencilWrite = 1, + kStencilTest = 2 +} StencilMode; + +typedef enum _TexGen +{ + kNone = 0, + kXfm = 1, + kSphere = 2, + kProjected = 3, + kXfmOrigin = 4, + kEnviron = 5 +} TexGen; + +typedef enum _TexWrap +{ + kClamp = 0, + kRepear = 1, + kBorderBlack = 2, + kBorderWhite = 3, + kMirror = 4 +} TexWrap; + typedef struct _RndMat { Object object; BlendMode blend; Color diffuseColor; - int zMode; - int stencilMode; - int texGen; - int texWrap; - char pad2[0x40]; + ZMode zMode; + StencilMode stencilMode; + TexGen texGen; + TexWrap texWrap; + Transform texXfm; ObjPtr_RndTex diffuseTex; char intensify; char useEnviron; diff --git a/include/rb3/Rnd/RndTex.h b/include/rb3/Rnd/RndTex.h index ee5bc75..1a9f2c7 100644 --- a/include/rb3/Rnd/RndTex.h +++ b/include/rb3/Rnd/RndTex.h @@ -30,7 +30,7 @@ typedef struct _RndTex int bpp; String name; int mipLevels; - int unk; + int *fileLoader; int unk2; } RndTex; @@ -43,7 +43,7 @@ typedef struct _ObjPtr_RndTex RndTex *RndTexNewObject(); void RndTexSetBitmap(RndTex *thisRndTex, FilePath *path); -void RndTexSetBitmap2(RndTex *thisRndTex, int width, int height, int bpp, int type, int mips, int unk); +void RndTexSetBitmap2(RndTex *thisRndTex, int width, int height, int bpp, int type, int useMips, char *path); void RndBitmapGenerateMips(RndBitmap *thisBitmap); int RndBitmapNumMips(RndBitmap *thisBitmap); diff --git a/include/rb3/Rnd/Transform.h b/include/rb3/Rnd/Transform.h new file mode 100644 index 0000000..9fe1d26 --- /dev/null +++ b/include/rb3/Rnd/Transform.h @@ -0,0 +1,24 @@ +#ifndef _XFM_H +#define _XFM_H + +typedef struct _Vector3 +{ + float x; + float y; + float z; + float w; // not sure what this is? its not defined in RB3 symbols but is definitely in the structure +} Vector3; + +typedef struct _Matrix3 +{ + Vector3 x; + Vector3 y; + Vector3 z; +} Matrix3; + +typedef struct _Transform +{ + Matrix3 m; + Vector3 v; +} Transform; +#endif // _XFM_H \ No newline at end of file diff --git a/include/rb3/SortNode.h b/include/rb3/SortNode.h index cff3559..f7563d3 100644 --- a/include/rb3/SortNode.h +++ b/include/rb3/SortNode.h @@ -5,30 +5,43 @@ #include "Symbol.h" #include "SongMetadata.h" +typedef enum _SongNodeType +{ + kNodeNone = 0, + kNodeShortcut = 1, + kNodeHeader = 2, + kNodeSubheader = 3, + kNodeSong = 4, + kNodeFunction = 5, + kNodeSetlist = 6, + kNodeStoreSong = 7 +} SongNodeType; + typedef struct _SortNode SortNode; typedef int (*ReturnsZero_t)(); typedef void (*OnlyReturns_t)(); -typedef int (*GetNodeType_t)(); +typedef SongNodeType (*GetNodeType_t)(); typedef Symbol (*GetToken_t)(); -typedef int (*GetSongCount_t)(SortNode *thisSortNode); +typedef int (*LocalizeToken_t)(SortNode *thisSortNode); typedef Symbol (*OnSelect_t)(SortNode *thisSortNode); typedef Symbol (*Select_t)(SortNode *thisSortNode); +typedef int *(*GetDateTime_t)(SortNode *thisSortNode); -typedef struct _SortNodeVtable +typedef struct _ShortcutNodeVtable { Object_vtable objectVtable; GetNodeType_t getNodeType; GetToken_t getToken; - GetSongCount_t getSongCount; - ReturnsZero_t returnsZero1; - OnlyReturns_t onlyReturns1; + LocalizeToken_t localizeToken; + GetDateTime_t getDateTime; + OnlyReturns_t deleteAll; OnSelect_t onSelect; Select_t select; OnlyReturns_t onlyReturns2; // there is more here but not really relevant atm -} SortNodeVtable; +} ShortcutNodeVtable; typedef struct _SongRecord { @@ -43,7 +56,7 @@ typedef struct _SongRecord struct _SortNode { - SortNodeVtable *vtable; + ShortcutNodeVtable *vtable; #ifdef RB3E_WII char something[0x30]; #else diff --git a/source/LocaleHooks.c b/source/LocaleHooks.c index 89419ef..6095e79 100644 --- a/source/LocaleHooks.c +++ b/source/LocaleHooks.c @@ -66,17 +66,17 @@ int IsSupportedLanguageHook(Symbol lang, int r4) // this has to be accessible at all times, so can't put it on the stack static char mod_locale_string[0x80]; -char *LocalizeHook(int thisLocale, Symbol sym, int fail) +char *LocalizeHook(int thisLocale, Symbol token, int fail) { int i = 0; char newLocaleName[0x50]; Symbol newLocale; char *original; // game origin icons relies on using different formatting for the song/artist name - if (config.GameOriginIcons == 1 && sym.sym != NULL && strcmp(sym.sym, "song_artist_fmt") == 0) + if (config.GameOriginIcons == 1 && token.sym != NULL && strcmp(token.sym, "song_artist_fmt") == 0) return "%s %s"; // if the string starts with message_motd_ (but isn't message_motd), it's our motd - if (memcmp(sym.sym, "message_motd_", 13) == 0) + if (memcmp(token.sym, "message_motd_", 13) == 0) { // check for "rb3e_mod_string" SymbolConstruct(&newLocale, "rb3e_mod_string"); @@ -91,19 +91,19 @@ char *LocalizeHook(int thisLocale, Symbol sym, int fail) } #ifdef RB3E_XBOX // replace the "invite friends" label with "Manage Liveless" - if (config.LivelessAddress[0] != 0 && strcmp(sym.sym, "overshell_invite") == 0) + if (config.LivelessAddress[0] != 0 && strcmp(token.sym, "overshell_invite") == 0) return "Manage Liveless"; #endif // if our string is in the override list, use that string entirely for (i = 0; i < numOverrideLocales; i++) { - if (strcmp(sym.sym, overrideLocales[i][0]) == 0) + if (strcmp(token.sym, overrideLocales[i][0]) == 0) { // length sanity check before sprintf - if (strlen(sym.sym) > 0x40) - return Localize(thisLocale, sym, fail); + if (strlen(token.sym) > 0x40) + return Localize(thisLocale, token, fail); // check if rb3e_localename exists - sprintf(newLocaleName, "rb3e_%s", sym.sym); + sprintf(newLocaleName, "rb3e_%s", token.sym); SymbolConstruct(&newLocale, newLocaleName); original = Localize(thisLocale, newLocale, fail); if (original == NULL) @@ -112,12 +112,12 @@ char *LocalizeHook(int thisLocale, Symbol sym, int fail) } } // try to localize through to the original string - original = Localize(thisLocale, sym, fail); + original = Localize(thisLocale, token, fail); if (original == NULL) { // check to see if it's one of our new localisations for (i = 0; i < numNewLocales; i++) - if (strcmp(sym.sym, newLocales[i][0]) == 0) + if (strcmp(token.sym, newLocales[i][0]) == 0) return newLocales[i][1]; } return original; diff --git a/source/MiloSceneHooks.c b/source/MiloSceneHooks.c index f00666b..593d090 100644 --- a/source/MiloSceneHooks.c +++ b/source/MiloSceneHooks.c @@ -42,8 +42,8 @@ void LoadObj(Object *object, BinStream *stream) { RB3E_DEBUG("Replacing Milo scene asset %s with file at %s", object->name, replacementPath); - // create FileStream with filetype 2 so it looks outside of the ARK for the file - fileStream = *FileStreamConstructor(&fileStream, replacementPath, 2, 0); + // create FileStream with kReadNoArk so it looks outside of the ARK for the file + fileStream = *FileStreamConstructor(&fileStream, replacementPath, kReadNoArk, 0); // attempt to detect endianness of replacement asset // this allows assets from GH2 and earlier to work diff --git a/source/SetlistHooks.c b/source/SetlistHooks.c index 1acbc96..525e888 100644 --- a/source/SetlistHooks.c +++ b/source/SetlistHooks.c @@ -39,7 +39,7 @@ void CreateMaterials() // allow the material to become transparent so alpha channel does not appear black // not sure if all of this is really necessary - mat->blend = BlendSrcAlpha; + mat->blend = kSrcAlpha; mat->preLit = 1; mat->useEnviron = 0; mat->alphaCut = 0; @@ -82,13 +82,13 @@ void SetSongNameFromNodeHook(BandLabel *label, SortNode *sortNode) return; } -int *MusicLibraryConstructorHook(int *thisMusicLibrary, int unk) +int *MusicLibraryConstructorHook(MusicLibrary *thisMusicLibrary, int *songPreview) { CreateMaterials(); - return MusicLibraryConstructor(thisMusicLibrary, unk); + return MusicLibraryConstructor(thisMusicLibrary, songPreview); } -RndMat *MusicLibraryMatHook(MusicLibrary *thisMusicLibrary, int unk, int unk2, UIListSlot *listSlot) +RndMat *MusicLibraryMatHook(MusicLibrary *thisMusicLibrary, int data, int idx, UIListSlot *listSlot) { if (listSlot != NULL) { @@ -98,18 +98,17 @@ RndMat *MusicLibraryMatHook(MusicLibrary *thisMusicLibrary, int unk, int unk2, U { int *ret = 0; SortNode *node = 0; - int nodeType = 0; + SongNodeType nodeType = kNodeNone; - ret = ((int *)(*(void **)0x82dfee5c))[thisMusicLibrary->unk2 + 0x13]; + ret = ((int *)(*(void **)PORT_THESONGSORTMGR))[thisMusicLibrary->unk2 + 0x13]; if (ret != NULL) { - node = MusicLibraryUnk1(ret, unk2); + node = MusicLibraryGetNodeByIndex(ret, idx); if (node != NULL) { nodeType = node->vtable->getNodeType(); - if (nodeType == 4) + if (nodeType == kNodeSong) { - RB3E_DEBUG("vtable: %i", node->record->vtable); return mat; } } @@ -118,5 +117,5 @@ RndMat *MusicLibraryMatHook(MusicLibrary *thisMusicLibrary, int unk, int unk2, U } } - return MusicLibraryMat(thisMusicLibrary, unk, unk2, listSlot); + return MusicLibraryMat(thisMusicLibrary, data, idx, listSlot); } \ No newline at end of file diff --git a/source/_functions.c b/source/_functions.c index 96ba7f4..b4ca2ea 100644 --- a/source/_functions.c +++ b/source/_functions.c @@ -100,5 +100,5 @@ RB3E_STUB(FilePathConstructor) RB3E_STUB(MusicLibraryMat) RB3E_STUB(RndCreateDefaultTexture) RB3E_STUB(MusicLibraryConstructor) -RB3E_STUB(MusicLibraryUnk1) +RB3E_STUB(MusicLibraryGetNodeByIndex) RB3E_STUB(StringConstructor) \ No newline at end of file diff --git a/source/rb3enhanced.c b/source/rb3enhanced.c index 0c61d6f..2df74bc 100644 --- a/source/rb3enhanced.c +++ b/source/rb3enhanced.c @@ -57,22 +57,22 @@ void UpdatePresenceHook(void *thisPresenceMgr) } // New file hook, for ARKless file loading -void *NewFileHook(char *fileName, int flags) +void *NewFileHook(char *iFilename, int iMode) { char *new_path = NULL; if (config.DisableRawfiles) goto LOAD_ORIGINAL; // checks the platform-specific APIs for the file - new_path = RB3E_GetRawfilePath(fileName, 0); + new_path = RB3E_GetRawfilePath(iFilename, 0); if (new_path != NULL) { - fileName = new_path; - flags = 0x10002; // tell the game to load this file raw + iFilename = new_path; + iMode = 0x10002; // tell the game to load this file raw } LOAD_ORIGINAL: if (config.LogFileAccess) - RB3E_MSG("File: %s (%s)", fileName, (flags & 0x10000) ? "Raw" : "ARK"); - return NewFile(fileName, flags); + RB3E_MSG("File: %s (%s)", iFilename, (iMode & 0x10000) ? "Raw" : "ARK"); + return NewFile(iFilename, iMode); } DataArray *DataReadFileHook(char *path, int dtb) @@ -328,7 +328,7 @@ void InitialiseFunctions() POKE_B(&RndTexSetBitmap, PORT_RNDTEXSETBITMAP); POKE_B(&RndTexSetBitmap2, PORT_RNDTEXSETBITMAP2); POKE_B(&FilePathConstructor, PORT_FILEPATHCONSTRUCTOR); - POKE_B(&MusicLibraryUnk1, 0x825bf708); + POKE_B(&MusicLibraryGetNodeByIndex, PORT_MUSICLIBRARYGETNODEBYINDEX); RB3E_MSG("Functions initialized!", NULL); } @@ -361,15 +361,14 @@ void ApplyHooks() HookFunction(PORT_SYMBOLPREINIT, &SymbolPreInit, &SymbolPreInitHook); HookFunction(PORT_INITSONGMETADATA, &InitSongMetadata, &InitSongMetadataHook); HookFunction(PORT_UPDATEPRESENCE, &UpdatePresence, &UpdatePresenceHook); - HookFunction(PORT_MUSICLIBRARY_CT, &MusicLibraryConstructor, &MusicLibraryConstructorHook); + HookFunction(PORT_MUSICLIBRARYMAT, &MusicLibraryMat, &MusicLibraryMatHook); + HookFunction(PORT_SETSONGNAMEFROMNODE, &SetSongNameFromNode, &SetSongNameFromNodeHook); #ifdef RB3E_WII // wii exclusive hooks HookFunction(PORT_USBWIIGETTYPE, &UsbWiiGetType, &UsbWiiGetTypeHook); HookFunction(PORT_WIINETINIT_DNSLOOKUP, &StartDNSLookup, &StartDNSLookupHook); #elif RB3E_XBOX // 360 exclusive hooks HookFunction(PORT_STAGEKIT_SET_STATE, &StagekitSetState, &StagekitSetStateHook); - HookFunction(PORT_SETSONGNAMEFROMNODE, &SetSongNameFromNode, &SetSongNameFromNodeHook); - HookFunction(0x8253b440, &MusicLibraryMat, &MusicLibraryMatHook); // TODO: port these to Wii POKE_B(PORT_GETSONGID, &GetSongIDHook); From c5af641ee75673d7b09a827cb6fabf8cdf1d6ac7 Mon Sep 17 00:00:00 2001 From: ihatecompvir Date: Sat, 17 Feb 2024 22:47:26 -0800 Subject: [PATCH 03/11] More renaming and cleanup --- include/OvershellHooks.h | 2 +- include/ports.h | 314 ++++++++++++++++++------------------ include/rb3/BandUser.h | 41 ++--- include/rb3/GameGem.h | 37 +++-- include/rb3/MetaPerformer.h | 4 +- source/GameHooks.c | 4 +- source/GemHooks.c | 8 +- source/OvershellHooks.c | 54 +++---- source/_functions.c | 2 +- source/rb3enhanced.c | 4 +- 10 files changed, 241 insertions(+), 229 deletions(-) diff --git a/include/OvershellHooks.h b/include/OvershellHooks.h index eebac55..a660ba6 100644 --- a/include/OvershellHooks.h +++ b/include/OvershellHooks.h @@ -28,7 +28,7 @@ typedef struct _OvershellListEntry char icon; } OvershellListEntry; -void BuildInstrumentSelectionList(OvershellSlot *thisOvershellSlot, ControllerType controllerType, BandUser *bandUser); +void OvershellPartSelectProviderReload(OvershellSlot *thisOvershellSlot, ControllerType controllerType, BandUser *bandUser); // Not overshell related but this is the only place we use them and IDK how to correctly organise code void PrepareSomeVectorMaybe(int *r3, int r4, int r5); diff --git a/include/ports.h b/include/ports.h index d37d5d5..23f8a5a 100644 --- a/include/ports.h +++ b/include/ports.h @@ -47,94 +47,94 @@ #define PORT_SONGMGR_ISDEMO_CHECK 0x82575f9c // "bne" after IsUGC check inside SongMgr::IsDemo #define PORT_STAGEKIT_EXISTS 0x8228d03c // StageKit check. nop over to allow for fog command without a physical StageKit connected. // function patch addresses -#define PORT_SETDISKERROR 0x82516320 // PlatformMgr::SetDiskError -#define PORT_APP_RUN 0x82272e90 // App::Run -#define PORT_APP_RUNNODEBUG 0x82270080 // App::RunWithoutDebugging -#define PORT_APP_CT 0x82270e68 // App::_ct -#define PORT_NEWFILE 0x825173e0 // NewFile -#define PORT_SETTRACKSPEED 0x827dd118 // TrackPanelDirBase::UpdateTrackSpeed -#define PORT_SETSONGSPEED 0x82678C88 // Game::SetMusicSpeed -#define PORT_MODIFIERMGR_CT 0x82589c48 // ModifierManager::__ct -#define PORT_MODIFIERMGR_ACTIVE 0x82588d80 // ModifierManager::ModifierActive -#define PORT_SYMBOL_CT 0x827c0728 // Symbol::Symbol -#define PORT_LOCALIZE 0x827c96d8 // Locale::Localize -#define PORT_ADDGAMEGEM 0x8278e530 // GameGemList::AddGameGem -#define PORT_WILLBENOSTRUM 0x8278cbb0 // GameGemList::WillBeNoStrum -#define PORT_SETVENUE 0x8257d1c0 // MetaPerformer::SetVenue(?) (actual func name is not known) -#define PORT_ISUGCPLUS 0x8259e890 // function that checks song source(?) -#define PORT_KEYSONGUITAR 0x825b50f8 // function that checks "key_keys_on_guitar" -#define PORT_EXECUTEDTA 0x824f7e50 // RockCentralGateway::ExecuteConfig -#define PORT_BANDLABELSETDISPLAYTEXT 0x823406f8 // BandLabel::SetDisplayText -#define PORT_SETSONGANDARTISTNAME 0x825c66f8 // BandLabel::SetSongAndArtistName -#define PORT_SETSONGNAMEFROMNODE 0x825c56a0 // BandLabel::SetSongNameFromNode -#define PORT_DATANODEEVALUATE 0x8274ae98 // DataNode::Evaluate -#define PORT_DATAARRAYFINDARRAY 0x8274c5a0 // DataArray::FindArray -#define PORT_DATAARRAYFINDDATA 0x8274c7f0 // DataArray::FindData -#define PORT_HMXFACTORYFUNCAT 0x82359f28 // HmxObjectFactoryFunc::_at -#define PORT_SETADDRESS 0x82aeb888 // Quazal::InetAddress::SetAddress -#define PORT_XL_USESECURESOCKETS 0x82a8eca8 // Inet::UseSecureSockets -#define PORT_XL_XSESSIONCREATE 0x82a69c90 // XSessionCreate -#define PORT_XL_XSESSIONJOINREMOTE 0x82a69fb0 // XSessionJoinRemote -#define PORT_XL_XSESSIONMODIFY 0x82a69e40 // XSessionModify -#define PORT_XL_XSESSIONSEARCHEX 0x82a6a490 // XSessionSearchEx -#define PORT_XL_XINVITEGETACCEPTEDINFO 0x82a6a7c8 // XInviteGetAcceptedInfo -#define PORT_RANDOMINT 0x824f2f90 // RandomInt(min, max) -#define PORT_GETWIDGETBYNAME 0x82b9b880 // GemManager::GetWidgetByName -#define PORT_GETSLOTCOLOR 0x82baa308 // TrackConfig::GetSlotColor -#define PORT_ARCHIVE_CT 0x82514408 // Archive::_ct -#define PORT_ARCHIVE_SETLOCATIONHARDDRIVE 0x82512b00 // Archive::SetLocationHardDrive -#define PORT_ARCHIVE_MERGE 0x82513ee8 // Archive::Merge -#define PORT_ARCHIVE_DT 0x82513af8 // Archive::_dt -#define PORT_FILE_EXISTS 0x825175b0 // FileExists -#define PORT_QUEUEMESSAGE 0x82628e50 // PassiveMessagesPanel::QueueMessage -#define PORT_SETSYSTEMLANGUAGE 0x82510590 // SetSystemLanguage -#define PORT_ISSUPPORTEDLANGUAGE 0x82510510 // IsSupportedLanguage -#define PORT_DATAREADFILE 0x8276c700 // DataReadFile -#define PORT_STAGEKIT_SET_STATE 0x82524DE0 // StageKit::SetState(?) - actual name not known -#define PORT_GETSONGIDFROMSHORTNAME 0x82577140 // BandSongMgr::GetSongIDFromShortname -#define PORT_GETMETADATA 0x827a8e30 // BandSongMgr::Data (function renamed from the original name to avoid any confusion with Data.h) -#define PORT_GETSONGSHORTNAME 0x8257c498 // MetaPerformer::GetSongShortname(?) - actual name not known -#define PORT_GAME_CT 0x8267bf30 // Game::__ct -#define PORT_GAME_DT 0x8267b1f0 // Game::__dt -#define PORT_GAMEGETACTIVEPLAYER 0x82678e88 // Game::GetActivePlayer -#define PORT_GETBANDUSERS 0x82683b78 // BandUserMgr::GetBandUsers -#define PORT_GETBANDUSERFROMSLOT 0x82682b60 // BandUserMgr::GetBandUserFromSlot -#define PORT_GETSONGID 0x827a87f0 // GetSongID, function used when adding songs to BandSongMgr -#define PORT_SONGMGRGETRANKEDSONGS 0x82577340 // BandSongMgr::GetRankedSongs(?) - not sure on the real name of the function -#define PORT_BUILDINSTRUMENTSELECTION 0x82668c70 // BuildInstrumentSelectionList(?) - actual name not known -#define PORT_PREPARESOMEVECTORMAYBE 0x82796d90 // Prepares some vector, used by BuildInstrumentSelectionList -#define PORT_SOMEVECTORPUSHBACKMAYBE 0x82b6aa10 // vector,class_stlpmtx_std::StlNodeAlloc_>_>::push_back -#define PORT_POSTPROC_DOPOST 0x82b89a08 // NgPostProc::DoPost -#define PORT_MUSICLIBRARYSELECTMAYBE 0x8253EB00 // Selects an entry in the Music Library screen - actual name not known -#define PORT_GETSYMBOLBYGAMEORIGIN 0x8265bb78 // SongSortByRecent::GetSymbolByGameOrigin -#define PORT_GETGAMEORIGINBYSYMBOL 0x8265b910 // SongSortByRecent::GetGameOriginBySymbol -#define PORT_SONGSORTBYRECENT 0x8265bde8 // RecentCmp::__ct -#define PORT_FILESTREAM_CT 0x827c3340 // FileStream::__ct (the one that takes a char * path instead of a File object) -#define PORT_CHUNKSTREAM_CT 0x827ca488 // ChunkStream::__ct -#define PORT_RNDPROPANIMSETFRAME 0x82426dd0 // RndPropAnim::SetFrame -#define PORT_DYNAMICCAST 0x8282a0c8 // dynamic_cast -#define PORT_OBJECTFINDUIPANEL 0x82537430 // Object::Find -#define PORT_JOYPADGETCACHEDXINPUTCAPS 0x82531F08 // JoypadGetCachedXInputCaps -#define PORT_JOYPADGETPADDATA 0x82524998 // JoypadGetPadData -#define PORT_MEMFREE 0x827bc430 // MemFree -#define PORT_MEMALLOC 0x827bcd38 // MemAlloc -#define PORT_SYMBOLPREINIT 0x827c04f8 // Symbol::PreInit -#define PORT_QUEUINGSOCKET_BIND 0x82b397b0 // Quazal::QueuingSocket::Bind -#define PORT_QUAZALSOCKET_BIND 0x82b1a830 // Quazal::Socket::Bind -#define PORT_MEMPRINTOVERVIEW 0x827bc838 // MemPrintOverview -#define PORT_MEMPRINT 0x827bc970 // MemPrint -#define PORT_MEMNUMHEAPS 0x827bb628 // MemNumHeaps -#define PORT_INITSONGMETADATA 0x827aa450 // InitSongMetadata -#define PORT_UPDATEPRESENCE 0x82680430 // PresenceMgr::UpdatePresence -#define PORT_STEPSEQUENCEJOBSETSTEP 0x82af92b8 // Quazal::StepSequenceJob::SetStep -#define PORT_RNDTEXNEWOBJECT 0x82273de0 // RndTex::NewObject -#define PORT_RNDMATNEWOBJECT 0x8240f5d0 // RndMat::NewObject -#define PORT_RNDTEXSETBITMAP 0x823ff678 // RndTex::SetBitmap -#define PORT_RNDTEXSETBITMAP2 0x823ff240 // RndTex::SetBitmap2 -#define PORT_FILEPATHCONSTRUCTOR 0x82270210 // FilePath::__ct -#define PORT_MUSICLIBRARY_CT 0x825451c8 // MusicLibrary::__ct -#define PORT_MUSICLIBRARYMAT 0x8253b440 // MusicLibrary::Mat -#define PORT_MUSICLIBRARYGETNODEBYINDEX 0x825bf708 // MusicLibrary::GetNodeByIndex +#define PORT_SETDISKERROR 0x82516320 // PlatformMgr::SetDiskError +#define PORT_APP_RUN 0x82272e90 // App::Run +#define PORT_APP_RUNNODEBUG 0x82270080 // App::RunWithoutDebugging +#define PORT_APP_CT 0x82270e68 // App::_ct +#define PORT_NEWFILE 0x825173e0 // NewFile +#define PORT_SETTRACKSPEED 0x827dd118 // TrackPanelDirBase::UpdateTrackSpeed +#define PORT_SETSONGSPEED 0x82678C88 // Game::SetMusicSpeed +#define PORT_MODIFIERMGR_CT 0x82589c48 // ModifierManager::__ct +#define PORT_MODIFIERMGR_ACTIVE 0x82588d80 // ModifierManager::ModifierActive +#define PORT_SYMBOL_CT 0x827c0728 // Symbol::Symbol +#define PORT_LOCALIZE 0x827c96d8 // Locale::Localize +#define PORT_ADDGAMEGEM 0x8278e530 // GameGemList::AddGameGem +#define PORT_WILLBENOSTRUM 0x8278cbb0 // GameGemList::WillBeNoStrum +#define PORT_SETVENUE 0x8257d1c0 // MetaPerformer::SetVenue(?) (actual func name is not known) +#define PORT_ISUGCPLUS 0x8259e890 // function that checks song source(?) +#define PORT_KEYSONGUITAR 0x825b50f8 // function that checks "key_keys_on_guitar" +#define PORT_EXECUTEDTA 0x824f7e50 // RockCentralGateway::ExecuteConfig +#define PORT_BANDLABELSETDISPLAYTEXT 0x823406f8 // BandLabel::SetDisplayText +#define PORT_SETSONGANDARTISTNAME 0x825c66f8 // BandLabel::SetSongAndArtistName +#define PORT_SETSONGNAMEFROMNODE 0x825c56a0 // BandLabel::SetSongNameFromNode +#define PORT_DATANODEEVALUATE 0x8274ae98 // DataNode::Evaluate +#define PORT_DATAARRAYFINDARRAY 0x8274c5a0 // DataArray::FindArray +#define PORT_DATAARRAYFINDDATA 0x8274c7f0 // DataArray::FindData +#define PORT_HMXFACTORYFUNCAT 0x82359f28 // HmxObjectFactoryFunc::_at +#define PORT_SETADDRESS 0x82aeb888 // Quazal::InetAddress::SetAddress +#define PORT_XL_USESECURESOCKETS 0x82a8eca8 // Inet::UseSecureSockets +#define PORT_XL_XSESSIONCREATE 0x82a69c90 // XSessionCreate +#define PORT_XL_XSESSIONJOINREMOTE 0x82a69fb0 // XSessionJoinRemote +#define PORT_XL_XSESSIONMODIFY 0x82a69e40 // XSessionModify +#define PORT_XL_XSESSIONSEARCHEX 0x82a6a490 // XSessionSearchEx +#define PORT_XL_XINVITEGETACCEPTEDINFO 0x82a6a7c8 // XInviteGetAcceptedInfo +#define PORT_RANDOMINT 0x824f2f90 // RandomInt(min, max) +#define PORT_GETWIDGETBYNAME 0x82b9b880 // GemManager::GetWidgetByName +#define PORT_GETSLOTCOLOR 0x82baa308 // TrackConfig::GetSlotColor +#define PORT_ARCHIVE_CT 0x82514408 // Archive::_ct +#define PORT_ARCHIVE_SETLOCATIONHARDDRIVE 0x82512b00 // Archive::SetLocationHardDrive +#define PORT_ARCHIVE_MERGE 0x82513ee8 // Archive::Merge +#define PORT_ARCHIVE_DT 0x82513af8 // Archive::_dt +#define PORT_FILE_EXISTS 0x825175b0 // FileExists +#define PORT_QUEUEMESSAGE 0x82628e50 // PassiveMessagesPanel::QueueMessage +#define PORT_SETSYSTEMLANGUAGE 0x82510590 // SetSystemLanguage +#define PORT_ISSUPPORTEDLANGUAGE 0x82510510 // IsSupportedLanguage +#define PORT_DATAREADFILE 0x8276c700 // DataReadFile +#define PORT_STAGEKIT_SET_STATE 0x82524DE0 // StageKit::SetState(?) - actual name not known +#define PORT_GETSONGIDFROMSHORTNAME 0x82577140 // BandSongMgr::GetSongIDFromShortname +#define PORT_GETMETADATA 0x827a8e30 // BandSongMgr::Data (function renamed from the original name to avoid any confusion with Data.h) +#define PORT_GETSONGSYMBOL 0x8257c498 // MetaPerformer::GetSongSymbol +#define PORT_GAME_CT 0x8267bf30 // Game::__ct +#define PORT_GAME_DT 0x8267b1f0 // Game::__dt +#define PORT_GAMEGETACTIVEPLAYER 0x82678e88 // Game::GetActivePlayer +#define PORT_GETBANDUSERS 0x82683b78 // BandUserMgr::GetBandUsers +#define PORT_GETBANDUSERFROMSLOT 0x82682b60 // BandUserMgr::GetBandUserFromSlot +#define PORT_GETSONGID 0x827a87f0 // GetSongID, function used when adding songs to BandSongMgr +#define PORT_SONGMGRGETRANKEDSONGS 0x82577340 // BandSongMgr::GetRankedSongs(?) - not sure on the real name of the function +#define PORT_OVERSHELLPARTSELECTPROVIDERRELOAD 0x82668c70 // OvershellPartSelectProvider::Reload +#define PORT_PREPARESOMEVECTORMAYBE 0x82796d90 // Prepares some vector, used by OvershellPartSelectProvider::Reload +#define PORT_SOMEVECTORPUSHBACKMAYBE 0x82b6aa10 // vector,class_stlpmtx_std::StlNodeAlloc_>_>::push_back +#define PORT_POSTPROC_DOPOST 0x82b89a08 // NgPostProc::DoPost +#define PORT_MUSICLIBRARYSELECTMAYBE 0x8253EB00 // Selects an entry in the Music Library screen - actual name not known +#define PORT_GETSYMBOLBYGAMEORIGIN 0x8265bb78 // SongSortByRecent::GetSymbolByGameOrigin +#define PORT_GETGAMEORIGINBYSYMBOL 0x8265b910 // SongSortByRecent::GetGameOriginBySymbol +#define PORT_RECENTCMP_CT 0x8265bde8 // RecentCmp::__ct +#define PORT_FILESTREAM_CT 0x827c3340 // FileStream::__ct (the one that takes a char * path instead of a File object) +#define PORT_CHUNKSTREAM_CT 0x827ca488 // ChunkStream::__ct +#define PORT_RNDPROPANIMSETFRAME 0x82426dd0 // RndPropAnim::SetFrame +#define PORT_DYNAMICCAST 0x8282a0c8 // dynamic_cast +#define PORT_OBJECTFINDUIPANEL 0x82537430 // Object::Find +#define PORT_JOYPADGETCACHEDXINPUTCAPS 0x82531F08 // JoypadGetCachedXInputCaps +#define PORT_JOYPADGETPADDATA 0x82524998 // JoypadGetPadData +#define PORT_MEMFREE 0x827bc430 // MemFree +#define PORT_MEMALLOC 0x827bcd38 // MemAlloc +#define PORT_SYMBOLPREINIT 0x827c04f8 // Symbol::PreInit +#define PORT_QUEUINGSOCKET_BIND 0x82b397b0 // Quazal::QueuingSocket::Bind +#define PORT_QUAZALSOCKET_BIND 0x82b1a830 // Quazal::Socket::Bind +#define PORT_MEMPRINTOVERVIEW 0x827bc838 // MemPrintOverview +#define PORT_MEMPRINT 0x827bc970 // MemPrint +#define PORT_MEMNUMHEAPS 0x827bb628 // MemNumHeaps +#define PORT_INITSONGMETADATA 0x827aa450 // InitSongMetadata +#define PORT_UPDATEPRESENCE 0x82680430 // PresenceMgr::UpdatePresence +#define PORT_STEPSEQUENCEJOBSETSTEP 0x82af92b8 // Quazal::StepSequenceJob::SetStep +#define PORT_RNDTEXNEWOBJECT 0x82273de0 // RndTex::NewObject +#define PORT_RNDMATNEWOBJECT 0x8240f5d0 // RndMat::NewObject +#define PORT_RNDTEXSETBITMAP 0x823ff678 // RndTex::SetBitmap +#define PORT_RNDTEXSETBITMAP2 0x823ff240 // RndTex::SetBitmap2 +#define PORT_FILEPATHCONSTRUCTOR 0x82270210 // FilePath::__ct +#define PORT_MUSICLIBRARY_CT 0x825451c8 // MusicLibrary::__ct +#define PORT_MUSICLIBRARYMAT 0x8253b440 // MusicLibrary::Mat +#define PORT_MUSICLIBRARYGETNODEBYINDEX 0x825bf708 // MusicLibrary::GetNodeByIndex // instance addresses #define PORT_MODIFIERMGR_POINTER 0x82dfec08 // pointer to ModifierManager #define PORT_ROCKCENTRALGATEWAY 0x82cc8f60 // address of RockCentralGateway @@ -196,75 +196,75 @@ void DbgPrint(const char *s, ...); #define PORT_UPDATEPRESENCEBLOCK_B 0x80188194 // branch after the failure case in a function that calls UpdatePresence // #define PORT_LOADOBJS_BCTRL 0x827562e4 // function patch addresses -#define PORT_SETDISKERROR 0x8030ce7c // PlatformMgr::SetDiskError -#define PORT_NEWFILE 0x802f9ed0 // NewFile -#define PORT_SETTRACKSPEED 0x80441ee0 // TrackPanelDirBase::UpdateTrackSpeed -#define PORT_SETSONGSPEED 0x801130d0 // Game::SetMusicSpeed -#define PORT_MODIFIERMGR_CT 0x8022c1b4 // ModifierManager::__ct -#define PORT_MODIFIERMGR_ACTIVE 0x8022c830 // ModifierManager::ModifierActive -#define PORT_SYMBOL_CT 0x80363f60 // Symbol::Symbol -#define PORT_LOCALIZE 0x803506f4 // Locale::Localize -#define PORT_SETVENUE 0x802282dc // MetaPerformer::SetVenue(?) (actual func name is not known) -#define PORT_EXECUTEDTA 0x802cf7e0 // RockCentralGateway::ExecuteConfig -#define PORT_BANDLABELSETDISPLAYTEXT 0x803b1858 // BandLabel::SetDisplayText -#define PORT_SETSONGANDARTISTNAME 0x801b68a8 // BandLabel::SetSongAndArtistName -#define PORT_SETSONGNAMEFROMNODE 0x801b6358 // BandLabel::SetSongNameFromNode -#define PORT_KEYSONGUITAR 0x80242ab4 // function that checks "key_keys_on_guitar" -#define PORT_HMXFACTORYFUNCAT 0x8031b2f8 // HmxObjectFactoryFunc::_at -#define PORT_WILLBENOSTRUM 0x80463010 // GameGemList::WillBeNoStrum -#define PORT_ADDGAMEGEM 0x80463198 // GameGemList::AddGameGem -#define PORT_SETADDRESS 0x8001bf74 // Quazal::InetAddress::SetAddress -#define PORT_RANDOMINT 0x802ddd60 // RandomInt(min, max) -#define PORT_GETWIDGETBYNAME 0x800d59b0 // GemManager::GetWidgetByName -#define PORT_DATANODEEVALUATE 0x80322e9c // DataNode::Evaluate -#define PORT_GETSLOTCOLOR 0x800e42a4 // TrackConfig::GetSlotColor -#define PORT_USBWIIGETTYPE 0x806c1a3c // UsbWii::GetType -#define PORT_FILE_EXISTS 0x802fa134 // FileExists -#define PORT_QUEUEMESSAGE 0x80253c50 // PassiveMessagesPanel::QueueMessage -#define PORT_SETSYSTEMLANGUAGE 0x8030f308 // SetSystemLanguage -#define PORT_ISSUPPORTEDLANGUAGE 0x8030f280 // IsSupportedLanguage -#define PORT_DATAREADFILE 0x80319bdc // DataReadFile -#define PORT_GAME_CT 0x80110f20 // Game::__ct -#define PORT_GAME_DT 0x80111614 // Game::__dt -#define PORT_GAMEGETACTIVEPLAYER 0x8011346c // Game::GetActivePlayer -#define PORT_WIINETINIT_DNSLOOKUP 0x8030c3a0 // WiiNetInit::StartDNSLookup -#define PORT_BUILDINSTRUMENTSELECTION 0x802478a8 // BuildInstrumentSelectionList(?) - actual name not known -#define PORT_PREPARESOMEVECTORMAYBE 0x80247c58 // Prepares some vector, used by BuildInstrumentSelectionList -#define PORT_SOMEVECTORPUSHBACKMAYBE 0x802484a8 // vector,class_stlpmtx_std::StlNodeAlloc_>_>::push_back -#define PORT_POSTPROC_DOPOST 0x806b52b4 // WiiPostProc::DoPost -#define PORT_MUSICLIBRARYSELECTMAYBE 0x80230d64 // Selects an entry in the Music Library screen - actual name not known -#define PORT_GETSYMBOLBYGAMEORIGIN 0x8027dd3c // SongSortByRecent::GetSymbolByGameOrigin -#define PORT_GETGAMEORIGINBYSYMBOL 0x8027dc58 // SongSortByRecent::GetGameOriginBySymbol -#define PORT_SONGSORTBYRECENT 0x8027dba8 // RecentCmp::__ct -#define PORT_FILESTREAM_CT 0x8034c9f8 // FileStream::__ct (the one that takes a char * path instead of a File object) -#define PORT_CHUNKSTREAM_CT 0x8034aa90 // ChunkStream::__ct -#define PORT_GETBANDUSERFROMSLOT 0x8010021c // BandUserMgr::GetBandUserFromSlot -#define PORT_GETBANDUSERS 0x80100558 // BandUserMgr::GetBandUsers -#define PORT_GETSONGSHORTNAME 0x80224edc // MetaPerformer::GetSongShortname(?) - actual name not known -#define PORT_GETMETADATA 0x80515510 // BandSongMgr::Data (function renamed from the original name to avoid any confusion with Data.h) -#define PORT_GETSONGID 0x8051513c // GetSongID, function used when adding songs to BandSongMgr -#define PORT_SONGMGRGETRANKEDSONGS 0x801d1590 // BandSongMgr::GetRankedSongs(?) - not sure on the real name of the function -#define PORT_GETSONGIDFROMSHORTNAME 0x801d0b44 // BandSongMgr::GetSongIDFromShortname -#define PORT_RNDPROPANIMSETFRAME 0x80632790 // RndPropAnim::SetFrame -#define PORT_DYNAMICCAST 0x806f5e78 // dynamic_cast -#define PORT_OBJECTFINDUIPANEL 0x80101d74 // Object::Find -#define PORT_JOYPADGETPADDATA 0x80302eec // JoypadGetPadData -#define PORT_MEMALLOC 0x80353e18 // MemAlloc -#define PORT_MEMFREE 0x80354238 // MemFree -#define PORT_SYMBOLPREINIT 0x80364c74 // Symbol::PreInit -#define PORT_QUEUINGSOCKET_BIND 0x800478d4 // Quazal::QueuingSocket::Bind -#define PORT_QUAZALSOCKET_BIND 0x8001cd10 // Quazal::Socket::Bind -#define PORT_INITSONGMETADATA 0x805147a4 // InitSongMetadata -#define PORT_UPDATEPRESENCE 0x801879d4 // PresenceMgr::UpdatePresence -#define PORT_STEPSEQUENCEJOBSETSTEP 0x80025364 // Quazal::StepSequenceJob::SetStep -#define PORT_RNDTEXNEWOBJECT 0x80639904 // RndTex::NewObject -#define PORT_RNDMATNEWOBJECT 0x8063996c // RndMat::NewObject -#define PORT_RNDTEXSETBITMAP 0x8063fccc // RndTex::SetBitmap -#define PORT_RNDTEXSETBITMAP2 0x8063f830 // RndTex::SetBitmap2 -#define PORT_FILEPATHCONSTRUCTOR 0x8000ec5c // FilePath::__ct -#define PORT_MUSICLIBRARY_CT 0x8022d978 // MusicLibrary::__ct -#define PORT_MUSICLIBRARYMAT 0x80231c5c // MusicLibrary::Mat -#define PORT_MUSICLIBRARYGETNODEBYINDEX 0x80279314 // MusicLibrary::GetNodeByIndex +#define PORT_SETDISKERROR 0x8030ce7c // PlatformMgr::SetDiskError +#define PORT_NEWFILE 0x802f9ed0 // NewFile +#define PORT_SETTRACKSPEED 0x80441ee0 // TrackPanelDirBase::UpdateTrackSpeed +#define PORT_SETSONGSPEED 0x801130d0 // Game::SetMusicSpeed +#define PORT_MODIFIERMGR_CT 0x8022c1b4 // ModifierManager::__ct +#define PORT_MODIFIERMGR_ACTIVE 0x8022c830 // ModifierManager::ModifierActive +#define PORT_SYMBOL_CT 0x80363f60 // Symbol::Symbol +#define PORT_LOCALIZE 0x803506f4 // Locale::Localize +#define PORT_SETVENUE 0x802282dc // MetaPerformer::SetVenue(?) (actual func name is not known) +#define PORT_EXECUTEDTA 0x802cf7e0 // RockCentralGateway::ExecuteConfig +#define PORT_BANDLABELSETDISPLAYTEXT 0x803b1858 // BandLabel::SetDisplayText +#define PORT_SETSONGANDARTISTNAME 0x801b68a8 // BandLabel::SetSongAndArtistName +#define PORT_SETSONGNAMEFROMNODE 0x801b6358 // BandLabel::SetSongNameFromNode +#define PORT_KEYSONGUITAR 0x80242ab4 // function that checks "key_keys_on_guitar" +#define PORT_HMXFACTORYFUNCAT 0x8031b2f8 // HmxObjectFactoryFunc::_at +#define PORT_WILLBENOSTRUM 0x80463010 // GameGemList::WillBeNoStrum +#define PORT_ADDGAMEGEM 0x80463198 // GameGemList::AddGameGem +#define PORT_SETADDRESS 0x8001bf74 // Quazal::InetAddress::SetAddress +#define PORT_RANDOMINT 0x802ddd60 // RandomInt(min, max) +#define PORT_GETWIDGETBYNAME 0x800d59b0 // GemManager::GetWidgetByName +#define PORT_DATANODEEVALUATE 0x80322e9c // DataNode::Evaluate +#define PORT_GETSLOTCOLOR 0x800e42a4 // TrackConfig::GetSlotColor +#define PORT_USBWIIGETTYPE 0x806c1a3c // UsbWii::GetType +#define PORT_FILE_EXISTS 0x802fa134 // FileExists +#define PORT_QUEUEMESSAGE 0x80253c50 // PassiveMessagesPanel::QueueMessage +#define PORT_SETSYSTEMLANGUAGE 0x8030f308 // SetSystemLanguage +#define PORT_ISSUPPORTEDLANGUAGE 0x8030f280 // IsSupportedLanguage +#define PORT_DATAREADFILE 0x80319bdc // DataReadFile +#define PORT_GAME_CT 0x80110f20 // Game::__ct +#define PORT_GAME_DT 0x80111614 // Game::__dt +#define PORT_GAMEGETACTIVEPLAYER 0x8011346c // Game::GetActivePlayer +#define PORT_WIINETINIT_DNSLOOKUP 0x8030c3a0 // WiiNetInit::StartDNSLookup +#define PORT_OVERSHELLPARTSELECTPROVIDERRELOAD 0x802478a8 // OvershellPartSelectProvider::Reload +#define PORT_PREPARESOMEVECTORMAYBE 0x80247c58 // Prepares some vector, used by BuildInstrumentSelectionList +#define PORT_SOMEVECTORPUSHBACKMAYBE 0x802484a8 // vector,class_stlpmtx_std::StlNodeAlloc_>_>::push_back +#define PORT_POSTPROC_DOPOST 0x806b52b4 // WiiPostProc::DoPost +#define PORT_MUSICLIBRARYSELECTMAYBE 0x80230d64 // Selects an entry in the Music Library screen - actual name not known +#define PORT_GETSYMBOLBYGAMEORIGIN 0x8027dd3c // SongSortByRecent::GetSymbolByGameOrigin +#define PORT_GETGAMEORIGINBYSYMBOL 0x8027dc58 // SongSortByRecent::GetGameOriginBySymbol +#define PORT_RECENTCMP_CT 0x8027dba8 // RecentCmp::__ct +#define PORT_FILESTREAM_CT 0x8034c9f8 // FileStream::__ct (the one that takes a char * path instead of a File object) +#define PORT_CHUNKSTREAM_CT 0x8034aa90 // ChunkStream::__ct +#define PORT_GETBANDUSERFROMSLOT 0x8010021c // BandUserMgr::GetBandUserFromSlot +#define PORT_GETBANDUSERS 0x80100558 // BandUserMgr::GetBandUsers +#define PORT_GETSONGSYMBOL 0x80224edc // MetaPerformer::GetSongSymbol +#define PORT_GETMETADATA 0x80515510 // BandSongMgr::Data (function renamed from the original name to avoid any confusion with Data.h) +#define PORT_GETSONGID 0x8051513c // GetSongID, function used when adding songs to BandSongMgr +#define PORT_SONGMGRGETRANKEDSONGS 0x801d1590 // BandSongMgr::GetRankedSongs(?) - not sure on the real name of the function +#define PORT_GETSONGIDFROMSHORTNAME 0x801d0b44 // BandSongMgr::GetSongIDFromShortname +#define PORT_RNDPROPANIMSETFRAME 0x80632790 // RndPropAnim::SetFrame +#define PORT_DYNAMICCAST 0x806f5e78 // dynamic_cast +#define PORT_OBJECTFINDUIPANEL 0x80101d74 // Object::Find +#define PORT_JOYPADGETPADDATA 0x80302eec // JoypadGetPadData +#define PORT_MEMALLOC 0x80353e18 // MemAlloc +#define PORT_MEMFREE 0x80354238 // MemFree +#define PORT_SYMBOLPREINIT 0x80364c74 // Symbol::PreInit +#define PORT_QUEUINGSOCKET_BIND 0x800478d4 // Quazal::QueuingSocket::Bind +#define PORT_QUAZALSOCKET_BIND 0x8001cd10 // Quazal::Socket::Bind +#define PORT_INITSONGMETADATA 0x805147a4 // InitSongMetadata +#define PORT_UPDATEPRESENCE 0x801879d4 // PresenceMgr::UpdatePresence +#define PORT_STEPSEQUENCEJOBSETSTEP 0x80025364 // Quazal::StepSequenceJob::SetStep +#define PORT_RNDTEXNEWOBJECT 0x80639904 // RndTex::NewObject +#define PORT_RNDMATNEWOBJECT 0x8063996c // RndMat::NewObject +#define PORT_RNDTEXSETBITMAP 0x8063fccc // RndTex::SetBitmap +#define PORT_RNDTEXSETBITMAP2 0x8063f830 // RndTex::SetBitmap2 +#define PORT_FILEPATHCONSTRUCTOR 0x8000ec5c // FilePath::__ct +#define PORT_MUSICLIBRARY_CT 0x8022d978 // MusicLibrary::__ct +#define PORT_MUSICLIBRARYMAT 0x80231c5c // MusicLibrary::Mat +#define PORT_MUSICLIBRARYGETNODEBYINDEX 0x80279314 // MusicLibrary::GetNodeByIndex // instance addresses #define PORT_MODIFIERMGR_POINTER 0x808fda68 // pointer to ModifierManager #define PORT_ROCKCENTRALGATEWAY 0x80900870 // address of RockCentralGateway diff --git a/include/rb3/BandUser.h b/include/rb3/BandUser.h index e311d8c..6d07d8c 100644 --- a/include/rb3/BandUser.h +++ b/include/rb3/BandUser.h @@ -3,32 +3,37 @@ typedef enum _Difficulty { - EASY = 0, - MEDIUM = 1, - HARD = 2, - EXPERT = 3 + kDifficultyEasy = 0, + kDifficultyMedium = 1, + kDifficultyHard = 2, + kDifficultyExpert = 3 } Difficulty; typedef enum _TrackType { - BASS = 2, - DRUMS = 0, - GUITAR = 1, - HARMONIES = 7, - KEYS = 4, - PRO_BASS = 8, - PRO_GUITAR = 6, - PRO_KEYS = 5, - VOCALS = 3 + kTrackDrum = 0, + kTrackGuitar = 1, + kTrackBass = 2, + kTrackVocals = 3, + kTrackKeys = 4, + kTrackRealKeys = 5, + kTrackRealGuitar = 6, + kTrackRealGuitar22Fret = 7, + kTrackRealBass = 8, + kTrackRealBass22Fret = 9, + kTrackNone = 10, + kTrackPending = 11, + kTrackPendingVocals = 12 } TrackType; typedef enum _ControllerType { - DRUM_CONT = 0, - GUITAR_CONT = 1, - VOX_CONT = 2, - KEYBOARD_CONT = 3, - PRO_GUITAR_CONT = 4, + kControllerDrum = 0, + kControllerGuitar = 1, + kControllerVocals = 2, + kControllerKeys = 3, + kControllerRealGuitar = 4, + kControllerNone = 5 } ControllerType; typedef struct _BandUser diff --git a/include/rb3/GameGem.h b/include/rb3/GameGem.h index f8af40c..3728523 100644 --- a/include/rb3/GameGem.h +++ b/include/rb3/GameGem.h @@ -13,6 +13,7 @@ typedef struct _GameGem unsigned char unkBitfield1; unsigned char unkBitfield2; unsigned char unkBitfield3; + char unk1 : 1; char unk2 : 1; char unk3 : 1; @@ -24,18 +25,16 @@ typedef struct _GameGem char red : 1; char green : 1; - char gemSeen : 1; // Updated in real-time once the player has seen this gem and either hit or missed it - char isHopo : 1; // Does nothing on the first note of the song even if set - char normalNote1 : 1; // Unsure what these both represent but sustains have them set to 0 and setting them to 0 forces a sustain - char normalNote2 : 1; - char unk5 : 1; - char unk6 : 1; - char unk7 : 1; - char unk8 : 1; - - // Unsure about these two - unsigned char unknown; - int unknown2; + char isPlayed : 1; // Updated in real-time once the player has seen this gem and either hit or missed it + char isHopo : 1; // Does nothing on the first note of the song even if set + char ignoreDuration : 1; + char isCymbal : 1; + char showChordNames : 1; + char showSlashes : 1; + char useAltDuration : 1; + char autoPlayable : 1; + unsigned char playableBy; + char isRealGuitar; // There is more after this that I am too lazy to map. Probably pro instrument stuff } GameGem; @@ -47,9 +46,17 @@ typedef enum _NoStrumState kStrumDefault = 2 } NoStrumState; -extern int WillBeNoStrum(int *gameGemListPtr, int *multiGemInfoPtr); -extern int AddGameGem(int *gameGemList, GameGem *gem, NoStrumState gemType); +typedef struct _GameGemList +{ + int mHopoThreshold; + GameGem *mGems_start; + GameGem *mGems_end; + GameGem *mGems_capacity; +} GameGemList; + +extern int WillBeNoStrum(GameGemList *thisGameGemList, int *multiGemInfoPtr); +extern int AddGameGem(GameGemList *gameGemList, GameGem *gem, NoStrumState gemType); extern int *GetWidgetByName(int *gemManager, Symbol sym); -extern Symbol GetSlotColor(int *bandUser); +extern Symbol GetSlotColor(int *bandUser, int slot); #endif // _GAMEGEM_H \ No newline at end of file diff --git a/include/rb3/MetaPerformer.h b/include/rb3/MetaPerformer.h index 2d07f56..9745d41 100644 --- a/include/rb3/MetaPerformer.h +++ b/include/rb3/MetaPerformer.h @@ -11,10 +11,10 @@ typedef struct _MetaPerformer extern void SetVenue(int *thisMetaPerformer, Symbol venue); #ifdef RB3E_XBOX -extern void GetSongShortname(Symbol *symOut, int metaPerformer); +extern void GetSongSymbol(Symbol *symOut, int metaPerformer); #else // this calling convention makes more sense? wtf microsoft -extern Symbol GetSongShortname(int metaPerformer); +extern Symbol GetSongSymbol(int metaPerformer); #endif #endif // _METAPERFORMER_H \ No newline at end of file diff --git a/source/GameHooks.c b/source/GameHooks.c index 27387c3..527fafe 100644 --- a/source/GameHooks.c +++ b/source/GameHooks.c @@ -26,9 +26,9 @@ void *GameConstructHook(void *theGame) // You just lost RB3E_EventBandInfo bandevent = {0}; #ifdef RB3E_XBOX Symbol song; - GetSongShortname(&song, *(int *)PORT_THEMETAPERFORMER); + GetSongSymbol(&song, *(int *)PORT_THEMETAPERFORMER); #else - Symbol song = GetSongShortname(*(int *)PORT_THEMETAPERFORMER); + Symbol song = GetSongSymbol(*(int *)PORT_THEMETAPERFORMER); #endif if (song.sym != NULL) { diff --git a/source/GemHooks.c b/source/GemHooks.c index 87340f7..174487f 100644 --- a/source/GemHooks.c +++ b/source/GemHooks.c @@ -5,7 +5,7 @@ #include "rb3/Random.h" #include "rb3/Symbol.h" -int WillBeNoStrumHook(int *gameGemListPtr, int *multiGemInfoPtr) +int WillBeNoStrumHook(GameGemList *thisGameGemList, int *gem) { Modifier *forceHoposModifier; @@ -16,7 +16,7 @@ int WillBeNoStrumHook(int *gameGemListPtr, int *multiGemInfoPtr) } else { - return WillBeNoStrum(gameGemListPtr, multiGemInfoPtr); + return WillBeNoStrum(thisGameGemList, gem); } } @@ -62,12 +62,12 @@ int *GetWidgetByNameHook(int *gemManager, Symbol sym) } } -Symbol GetSlotColorHook(int *bandUser) +Symbol GetSlotColorHook(int *bandUser, int slot) { Modifier *colorShuffleModifier; Symbol *colors[5] = {&globalSymbols.green, &globalSymbols.red, &globalSymbols.yellow, &globalSymbols.blue, &globalSymbols.orange}; - Symbol slotColor = GetSlotColor(bandUser); + Symbol slotColor = GetSlotColor(bandUser, slot); colorShuffleModifier = ModifierActive(*(int *)PORT_MODIFIERMGR_POINTER, globalSymbols.colorShuffle, 0); diff --git a/source/OvershellHooks.c b/source/OvershellHooks.c index 02f2fad..8afdc79 100644 --- a/source/OvershellHooks.c +++ b/source/OvershellHooks.c @@ -10,7 +10,7 @@ #include "ports.h" // MSVC inlined this function in the original game so redefine it -void AddInstrumentToList(OvershellSlot *thisOvershellSlot, Symbol *instrumentToAdd, TrackType trackType, char *icon) +void OvershellPartSelectProviderAddPart(OvershellSlot *thisOvershellSlot, Symbol *instrumentToAdd, TrackType trackType, char *icon) { OvershellListEntry entry; entry.icon = icon[0]; @@ -21,7 +21,7 @@ void AddInstrumentToList(OvershellSlot *thisOvershellSlot, Symbol *instrumentToA } // Monkey patching the function will be hard, so make a realistic, dark and gritty reboot. -void BuildInstrumentSelectionList(OvershellSlot *thisOvershellSlot, ControllerType controllerType, BandUser *bandUser) +void OvershellPartSelectProviderReload(OvershellSlot *thisOvershellSlot, ControllerType controllerType, BandUser *bandUser) { PrepareSomeVectorMaybe(&thisOvershellSlot->list_vector_maybe, thisOvershellSlot->list_vector_maybe, thisOvershellSlot->unk_var_2); thisOvershellSlot->controllerType = controllerType; @@ -29,36 +29,36 @@ void BuildInstrumentSelectionList(OvershellSlot *thisOvershellSlot, ControllerTy // RB3E_DEBUG("Building overshell selection for controller type %i.", controllerType); switch (controllerType) { - case VOX_CONT: - AddInstrumentToList(thisOvershellSlot, &globalSymbols.overshell_vocal_solo, VOCALS, "V"); - AddInstrumentToList(thisOvershellSlot, &globalSymbols.overshell_vocal_harmony, HARMONIES, "2"); + case kControllerVocals: + OvershellPartSelectProviderAddPart(thisOvershellSlot, &globalSymbols.overshell_vocal_solo, kTrackVocals, "V"); + OvershellPartSelectProviderAddPart(thisOvershellSlot, &globalSymbols.overshell_vocal_harmony, kTrackVocals, "2"); // allow pad to play as guitar, bass, keys and drums :D - AddInstrumentToList(thisOvershellSlot, &globalSymbols.overshell_guitar, GUITAR, "G"); - AddInstrumentToList(thisOvershellSlot, &globalSymbols.overshell_bass, BASS, "B"); - AddInstrumentToList(thisOvershellSlot, &globalSymbols.overshell_keys, KEYS, "K"); - AddInstrumentToList(thisOvershellSlot, &globalSymbols.overshell_drums, DRUMS, "D"); + OvershellPartSelectProviderAddPart(thisOvershellSlot, &globalSymbols.overshell_guitar, kTrackGuitar, "G"); + OvershellPartSelectProviderAddPart(thisOvershellSlot, &globalSymbols.overshell_bass, kTrackBass, "B"); + OvershellPartSelectProviderAddPart(thisOvershellSlot, &globalSymbols.overshell_keys, kTrackKeys, "K"); + OvershellPartSelectProviderAddPart(thisOvershellSlot, &globalSymbols.overshell_drums, kTrackDrum, "D"); break; - case GUITAR_CONT: - AddInstrumentToList(thisOvershellSlot, &globalSymbols.overshell_guitar, GUITAR, "G"); - AddInstrumentToList(thisOvershellSlot, &globalSymbols.overshell_bass, BASS, "B"); - AddInstrumentToList(thisOvershellSlot, &globalSymbols.overshell_keys, KEYS, "K"); + case kControllerGuitar: + OvershellPartSelectProviderAddPart(thisOvershellSlot, &globalSymbols.overshell_guitar, kTrackGuitar, "G"); + OvershellPartSelectProviderAddPart(thisOvershellSlot, &globalSymbols.overshell_bass, kTrackBass, "B"); + OvershellPartSelectProviderAddPart(thisOvershellSlot, &globalSymbols.overshell_keys, kTrackKeys, "K"); break; - case DRUM_CONT: - AddInstrumentToList(thisOvershellSlot, &globalSymbols.overshell_drums, DRUMS, "D"); - AddInstrumentToList(thisOvershellSlot, &globalSymbols.overshell_drums_pro, DRUMS, "d"); + case kControllerDrum: + OvershellPartSelectProviderAddPart(thisOvershellSlot, &globalSymbols.overshell_drums, kTrackDrum, "D"); + OvershellPartSelectProviderAddPart(thisOvershellSlot, &globalSymbols.overshell_drums_pro, kTrackDrum, "d"); break; - case KEYBOARD_CONT: - AddInstrumentToList(thisOvershellSlot, &globalSymbols.overshell_keys, KEYS, "K"); - AddInstrumentToList(thisOvershellSlot, &globalSymbols.overshell_real_keys, PRO_KEYS, "k"); - AddInstrumentToList(thisOvershellSlot, &globalSymbols.overshell_guitar, GUITAR, "G"); - AddInstrumentToList(thisOvershellSlot, &globalSymbols.overshell_bass, BASS, "B"); - AddInstrumentToList(thisOvershellSlot, &globalSymbols.overshell_drums, DRUMS, "D"); + case kControllerKeys: + OvershellPartSelectProviderAddPart(thisOvershellSlot, &globalSymbols.overshell_keys, kTrackKeys, "K"); + OvershellPartSelectProviderAddPart(thisOvershellSlot, &globalSymbols.overshell_real_keys, kTrackRealKeys, "k"); + OvershellPartSelectProviderAddPart(thisOvershellSlot, &globalSymbols.overshell_guitar, kTrackGuitar, "G"); + OvershellPartSelectProviderAddPart(thisOvershellSlot, &globalSymbols.overshell_bass, kTrackBass, "B"); + OvershellPartSelectProviderAddPart(thisOvershellSlot, &globalSymbols.overshell_drums, kTrackDrum, "D"); break; - case PRO_GUITAR_CONT: - AddInstrumentToList(thisOvershellSlot, &globalSymbols.overshell_real_guitar, PRO_GUITAR, "g"); - AddInstrumentToList(thisOvershellSlot, &globalSymbols.overshell_real_bass, PRO_BASS, "b"); - AddInstrumentToList(thisOvershellSlot, &globalSymbols.overshell_guitar, GUITAR, "G"); - AddInstrumentToList(thisOvershellSlot, &globalSymbols.overshell_bass, BASS, "B"); + case kControllerRealGuitar: + OvershellPartSelectProviderAddPart(thisOvershellSlot, &globalSymbols.overshell_real_guitar, kTrackRealGuitar, "g"); + OvershellPartSelectProviderAddPart(thisOvershellSlot, &globalSymbols.overshell_real_bass, kTrackRealBass, "b"); + OvershellPartSelectProviderAddPart(thisOvershellSlot, &globalSymbols.overshell_guitar, kTrackGuitar, "G"); + OvershellPartSelectProviderAddPart(thisOvershellSlot, &globalSymbols.overshell_bass, kTrackBass, "B"); break; } } diff --git a/source/_functions.c b/source/_functions.c index b4ca2ea..d1baaed 100644 --- a/source/_functions.c +++ b/source/_functions.c @@ -42,7 +42,7 @@ RB3E_STUB(FileExists) RB3E_STUB(QueueMessage) RB3E_STUB(GetMetadata) RB3E_STUB(GetSongIDFromShortname) -RB3E_STUB(GetSongShortname) +RB3E_STUB(GetSongSymbol) RB3E_STUB(GetBandUsers) RB3E_STUB(GetBandUserFromSlot) RB3E_STUB(ChunkStreamConstructor) diff --git a/source/rb3enhanced.c b/source/rb3enhanced.c index 2df74bc..241dde2 100644 --- a/source/rb3enhanced.c +++ b/source/rb3enhanced.c @@ -310,7 +310,7 @@ void InitialiseFunctions() POKE_B(&SetAddress, PORT_SETADDRESS); POKE_B(&QueueMessage, PORT_QUEUEMESSAGE); POKE_B(&MusicLibrarySelect, PORT_MUSICLIBRARYSELECTMAYBE); - POKE_B(&GetSongShortname, PORT_GETSONGSHORTNAME); + POKE_B(&GetSongSymbol, PORT_GETSONGSYMBOL); POKE_B(&GetMetadata, PORT_GETMETADATA); POKE_B(&GetSongIDFromShortname, PORT_GETSONGIDFROMSHORTNAME); POKE_B(&GetBandUsers, PORT_GETBANDUSERS); @@ -336,7 +336,7 @@ void ApplyHooks() { POKE_B(PORT_DATAINITFUNCS_TAIL, &AddDTAFunctions); POKE_B(PORT_ISSUPPORTEDLANGUAGE, &IsSupportedLanguageHook); - POKE_B(PORT_BUILDINSTRUMENTSELECTION, &BuildInstrumentSelectionList); + POKE_B(PORT_OVERSHELLPARTSELECTPROVIDERRELOAD, &OvershellPartSelectProviderReload); POKE_BL(PORT_OPTIONSTR_DEFINE, &DefinesHook); POKE_BL(PORT_RUNLOOP_SPARE, &RB3E_RunLoop); HookFunction(PORT_LOCALIZE, &Localize, &LocalizeHook); From 31b839585ebae7c72473833deff922dbe1fc50fc Mon Sep 17 00:00:00 2001 From: ihatecompvir Date: Sun, 18 Feb 2024 02:15:32 -0800 Subject: [PATCH 04/11] Filling out some structures, naming improvements --- include/GemHooks.h | 2 +- include/LocaleHooks.h | 4 +-- include/QuazalHooks.h | 10 +++---- include/rb3/GameGem.h | 7 ++--- include/rb3/List.h | 13 +++++++++ include/rb3/ModifierManager.h | 2 +- include/rb3/Object.h | 13 +++++++-- include/rb3/Quazal/Step.h | 14 +++++++++ include/rb3/Quazal/StepSequenceJobStep.h | 14 --------- include/rb3/Rnd/RndAnimatable.h | 14 +++++++++ include/rb3/Rnd/RndPropAnim.h | 21 +++++++------- include/rb3/UI/UIColor.h | 22 ++++++++++++++ include/rb3/UI/UIListSlot.h | 37 ++++++++++++++++++++++-- include/rb3/UI/UIPanel.h | 12 ++++++-- include/rb3/Vector.h | 21 ++++++++++++++ source/GemHooks.c | 8 ++--- source/MusicLibrary.c | 2 +- source/QuazalHooks.c | 6 ++-- source/RndPropAnimHooks.c | 2 +- source/SetlistHooks.c | 2 +- source/_functions.c | 2 +- source/rb3enhanced.c | 4 +-- 22 files changed, 173 insertions(+), 59 deletions(-) create mode 100644 include/rb3/List.h create mode 100644 include/rb3/Quazal/Step.h delete mode 100644 include/rb3/Quazal/StepSequenceJobStep.h create mode 100644 include/rb3/Rnd/RndAnimatable.h create mode 100644 include/rb3/UI/UIColor.h create mode 100644 include/rb3/Vector.h diff --git a/include/GemHooks.h b/include/GemHooks.h index 64248a0..d6affc3 100644 --- a/include/GemHooks.h +++ b/include/GemHooks.h @@ -8,5 +8,5 @@ int WillBeNoStrumHook(int *gameGemListPtr, int *multiGemInfoPtr); int *GetWidgetByNameHook(int *gemManager, Symbol name); -int AddGameGemHook(int *gameGemList, GameGem *gem, NoStrumState gemType); +int AddGameGemHook(int *gameGemList, GameGem *gem, NoStrumState noStrumState); Symbol GetSlotColorHook(int *bandUser); \ No newline at end of file diff --git a/include/LocaleHooks.h b/include/LocaleHooks.h index 8e4c9b5..8cfec69 100644 --- a/include/LocaleHooks.h +++ b/include/LocaleHooks.h @@ -6,5 +6,5 @@ #include "rb3/Symbol.h" char *LocalizeHook(int thisLocale, Symbol sym, int fail); -void SetSystemLanguageHook(Symbol lang, int r4); -int IsSupportedLanguageHook(Symbol lang, int r4); \ No newline at end of file +void SetSystemLanguageHook(Symbol lang, int cheat); +int IsSupportedLanguageHook(Symbol lang, int cheat); \ No newline at end of file diff --git a/include/QuazalHooks.h b/include/QuazalHooks.h index e419a05..a546dc7 100644 --- a/include/QuazalHooks.h +++ b/include/QuazalHooks.h @@ -4,9 +4,9 @@ Quazal is the creator of the networking middleware used by RB3. */ -#include "rb3/Quazal/StepSequenceJobStep.h" +#include "rb3/Quazal/Step.h" -extern void OperatorEqualsFmt(char *r3, char *r4); -void OperatorEqualsFmtHook(char *r3, char *r4); -extern int StepSequenceJobSetStep(int *unk, StepSequenceJobStep *step); -int StepSequenceJobSetStepHook(int *unk, StepSequenceJobStep *step); +extern void OperatorEqualsFmt(char *thisString, char *szString); +void OperatorEqualsFmtHook(char *thisString, char *szString); +extern int StepSequenceJobSetStep(int *thisStepSequenceJob, Step *oStep); +int StepSequenceJobSetStepHook(int *thisStepSequenceJob, Step *oStep); diff --git a/include/rb3/GameGem.h b/include/rb3/GameGem.h index 3728523..6816dc6 100644 --- a/include/rb3/GameGem.h +++ b/include/rb3/GameGem.h @@ -1,7 +1,8 @@ #ifndef _GAMEGEM_H #define _GAMEGEM_H -#include "Symbol.h" +#include "rb3/Symbol.h" +#include "rb3/Vector.h" typedef struct _GameGem { @@ -49,9 +50,7 @@ typedef enum _NoStrumState typedef struct _GameGemList { int mHopoThreshold; - GameGem *mGems_start; - GameGem *mGems_end; - GameGem *mGems_capacity; + vector mGems; } GameGemList; extern int WillBeNoStrum(GameGemList *thisGameGemList, int *multiGemInfoPtr); diff --git a/include/rb3/List.h b/include/rb3/List.h new file mode 100644 index 0000000..55a4fd4 --- /dev/null +++ b/include/rb3/List.h @@ -0,0 +1,13 @@ +#ifndef _LIST_H +#define _LIST_H + +// basic list type +// used constantly across the code +// in C++ it would be used like list or etc. +typedef struct _list +{ + void *next; + void *prev; +} list; + +#endif // _LIST_H \ No newline at end of file diff --git a/include/rb3/ModifierManager.h b/include/rb3/ModifierManager.h index e7c41b2..5d803f2 100644 --- a/include/rb3/ModifierManager.h +++ b/include/rb3/ModifierManager.h @@ -11,7 +11,7 @@ typedef struct _Modifier bool enabled; } Modifier; -extern Modifier *ModifierActive(int thisModifierManager, Symbol symbol, bool defaultValue); +extern Modifier *ModifierIsActive(int thisModifierManager, Symbol symbol, bool defaultValue); extern void *ModifierManagerConstructor(int thisModifierManager, int unk); #endif // _MODIFIERMANAGER_H \ No newline at end of file diff --git a/include/rb3/Object.h b/include/rb3/Object.h index 73d8502..1aa2adf 100644 --- a/include/rb3/Object.h +++ b/include/rb3/Object.h @@ -6,6 +6,13 @@ #include "rb3/Symbol.h" #include "rb3/UI/UIPanel.h" +typedef enum _CopyType +{ + kCopyDeep = 0, + kCopyShallow = 1, + kCopyFromMax = 2 +} CopyType; + typedef struct _Object Object; typedef struct _TypeProps TypeProps; @@ -17,15 +24,15 @@ typedef void (*ObjSetType_t)(Object *thisObject, Symbol type); typedef DataNode *(*ObjHandle_t)(DataNode *retNode, Object *thisObject, DataArray *msg, char warn); typedef void (*ObjSyncProperty_t)(Object *thisObject); typedef void (*ObjSave_t)(Object *thisObject, BinStream *binStream); -typedef void (*ObjCopy_t)(Object *to, Object *from, int copyType); +typedef void (*ObjCopy_t)(Object *to, Object *from, CopyType copyType); typedef void (*ObjLoad_t)(Object *thisObject, BinStream *binStream); typedef void (*ObjSetTypeDef_t)(Object *thisObject, DataArray *typeDef); -typedef void (*ObjSetName_t)(Object *thisObject, Symbol name, int *parentDir); +typedef void (*ObjSetName_t)(Object *thisObject, char *name, int *dir); typedef int *(*ObjDataDir_t)(Object *thisObject); typedef void (*ObjPreLoad_t)(Object *thisObject, BinStream *binStream); typedef char *(*ObjFindPathName_t)(Object *thisObject); -extern UIPanel *ObjectFindUIPanel(int *objectDir, char *name, int unk); +extern UIPanel *ObjectFindUIPanel(int *objectDir, char *name, char fail); typedef struct _Object_vtable { diff --git a/include/rb3/Quazal/Step.h b/include/rb3/Quazal/Step.h new file mode 100644 index 0000000..c6aae4b --- /dev/null +++ b/include/rb3/Quazal/Step.h @@ -0,0 +1,14 @@ +#ifndef _STEP_H +#define _STEP_H + +typedef struct _Step +{ + void *m_pStepMethod; // the function that gets called when the job is ran + int unk; +#ifdef RB3E_WII + int unk2; // field only appears to exist on Wii +#endif + char *m_szStepDescription; +} Step; + +#endif // _STEP_H \ No newline at end of file diff --git a/include/rb3/Quazal/StepSequenceJobStep.h b/include/rb3/Quazal/StepSequenceJobStep.h deleted file mode 100644 index 3adb8c6..0000000 --- a/include/rb3/Quazal/StepSequenceJobStep.h +++ /dev/null @@ -1,14 +0,0 @@ -#ifndef _STEPSEQUENCEJOBSTEP_H -#define _STEPSEQUENCEJOBSTEP_H - -typedef struct _StepSequenceJobStep -{ - void *jobFunc; // the function that gets called when the job is ran (?) - int unk; -#ifdef RB3E_WII - int unk2; // field only appears to exist on Wii -#endif - char *jobName; -} StepSequenceJobStep; - -#endif // _STEPSEQUENCEJOBSTEP_H \ No newline at end of file diff --git a/include/rb3/Rnd/RndAnimatable.h b/include/rb3/Rnd/RndAnimatable.h new file mode 100644 index 0000000..eee94f9 --- /dev/null +++ b/include/rb3/Rnd/RndAnimatable.h @@ -0,0 +1,14 @@ +#ifndef _RNDANIMATABLE_H +#define _RNDANIMATABLE_H + +#include "rb3/Object.h" + +typedef struct _RndAnimatable +{ + void *vtable; + void *objectVtable; + float mFrame; + int mRate; +} RndAnimatable; + +#endif // _RNDANIMATABLE_H \ No newline at end of file diff --git a/include/rb3/Rnd/RndPropAnim.h b/include/rb3/Rnd/RndPropAnim.h index 150a43d..7532c73 100644 --- a/include/rb3/Rnd/RndPropAnim.h +++ b/include/rb3/Rnd/RndPropAnim.h @@ -1,23 +1,22 @@ #ifndef _RNDPROPANIM_H #define _RNDPROPANIM_H +#include "rb3/List.h" #include "rb3/Object.h" +#include "rb3/Rnd/RndAnimatable.h" typedef struct _RndPropAnim { - int *vtable; // 0x0 - int unk; // 0x04 - int unk2; // 0x08 - int unk3; // 0x0c - int unk4; // 0x10 - int unk5; // 0x14 - int unk6; // 0x18 - int unk7; // 0x1c + RndAnimatable mAnimatable; + list mPropKeys; + float mLastFrame; + bool mInSetFrame; + bool unk; + char pad[2]; #ifdef RB3E_XBOX - int unk8; + int unk2; #endif - Object object; // 0x20 - + Object mObject; } RndPropAnim; void PropAnimSetFrame(RndPropAnim *rndPropAnim, float frame, float time); diff --git a/include/rb3/UI/UIColor.h b/include/rb3/UI/UIColor.h new file mode 100644 index 0000000..5fc5aa4 --- /dev/null +++ b/include/rb3/UI/UIColor.h @@ -0,0 +1,22 @@ +#ifndef _UICOLOR_H +#define _UICOLOR_H + +#include "rb3/Object.h" + +typedef struct _UIColor +{ + Object Object; + float mRed; + float mGreen; + float mBlue; + float mAlpha; +} UIColor; + +typedef struct _ObjPtr_UIColor +{ + int *vtable; + Object *object; + UIColor *color; +} ObjPtr_UIColor; + +#endif \ No newline at end of file diff --git a/include/rb3/UI/UIListSlot.h b/include/rb3/UI/UIListSlot.h index af82073..5a0fdd9 100644 --- a/include/rb3/UI/UIListSlot.h +++ b/include/rb3/UI/UIListSlot.h @@ -1,10 +1,43 @@ #ifndef _UILISTSLOT_H #define _UILISTSLOT_H +#include "rb3/Object.h" +#include "rb3/String.h" +#include "rb3/Vector.h" +#include "rb3/UI/UIColor.h" + +typedef enum _UIListWidgetDrawType +{ + kUIListWidgetDrawAlways = 0, + kUIListWidgetDrawOnlyFocused = 1, + kUIListWidgetDrawNever = 2 +} UIListWidgetDrawType; + +typedef enum _UIListSlotDrawType +{ + kUIListSlotDrawAlways = 0, + kUIListSlotDrawHighlight = 1, + kUIListSlotDrawNoHighlight = 2 +} UIListSlotDrawType; + +typedef struct _UIListWidget +{ + Object mObject; + int mUnk; + float mDrawOrder; + ObjPtr_UIColor mDefaultColor; + vector mColors; + UIListWidgetDrawType mWidgetDrawType; + void *mParentList; +} UIListWidget; + typedef struct _UIListSlot { - char unk[0x6c]; - char *name; + UIListWidget mWidget; + vector mElements; + UIListSlotDrawType mSlotDrawType; + int mNextElement; + String mMatchName; } UIListSlot; #endif // _UILISTSLOT_H \ No newline at end of file diff --git a/include/rb3/UI/UIPanel.h b/include/rb3/UI/UIPanel.h index caee228..292876c 100644 --- a/include/rb3/UI/UIPanel.h +++ b/include/rb3/UI/UIPanel.h @@ -3,6 +3,12 @@ typedef struct _UIPanel UIPanel; +typedef enum _PanelState +{ + kPanelDown = 0, + kPanelUp = 1 +} PanelState; + struct _UIPanel { int *vtable; // 0x0 @@ -13,10 +19,10 @@ struct _UIPanel int unk5; // 0x14 int unk6; // 0x18 #ifdef RB3E_WII - int is_up; // 0x1c + PanelState mState; // 0x1c #else - int unk7; // 0x1c - int is_up; // 0x20 + int unk7; // 0x1c + PanelState mState; // 0x20 #endif }; diff --git a/include/rb3/Vector.h b/include/rb3/Vector.h new file mode 100644 index 0000000..6be0a39 --- /dev/null +++ b/include/rb3/Vector.h @@ -0,0 +1,21 @@ +#ifndef _VECTOR_H +#define _VECTOR_H + +// basic vector type +// used constantly across the code +// in C++ it would be used like vector or etc. +typedef struct _vector +{ + // structure of a vector differs on 360 vs Wii +#ifdef RB3E_XBOX + void *begin; + void *end; + void *capacity; +#else + void *data; + short count; + short capacity; +#endif +} vector; + +#endif // _VECTOR_H \ No newline at end of file diff --git a/source/GemHooks.c b/source/GemHooks.c index 174487f..a79c05f 100644 --- a/source/GemHooks.c +++ b/source/GemHooks.c @@ -9,7 +9,7 @@ int WillBeNoStrumHook(GameGemList *thisGameGemList, int *gem) { Modifier *forceHoposModifier; - forceHoposModifier = ModifierActive(*(int *)PORT_MODIFIERMGR_POINTER, globalSymbols.forceHopos, 0); + forceHoposModifier = ModifierIsActive(*(int *)PORT_MODIFIERMGR_POINTER, globalSymbols.forceHopos, 0); if (forceHoposModifier->enabled) { return 1; @@ -29,7 +29,7 @@ int *GetWidgetByNameHook(int *gemManager, Symbol sym) Symbol *drumCymbalColors[4] = {&globalSymbols.redCymbalGem, &globalSymbols.yellowCymbalGem, &globalSymbols.blueCymbalGem, &globalSymbols.greenCymbalGem}; int i = 0; - colorShuffleModifier = ModifierActive(*(int *)PORT_MODIFIERMGR_POINTER, globalSymbols.colorShuffle, 0); + colorShuffleModifier = ModifierIsActive(*(int *)PORT_MODIFIERMGR_POINTER, globalSymbols.colorShuffle, 0); if (colorShuffleModifier->enabled) { @@ -69,7 +69,7 @@ Symbol GetSlotColorHook(int *bandUser, int slot) Symbol slotColor = GetSlotColor(bandUser, slot); - colorShuffleModifier = ModifierActive(*(int *)PORT_MODIFIERMGR_POINTER, globalSymbols.colorShuffle, 0); + colorShuffleModifier = ModifierIsActive(*(int *)PORT_MODIFIERMGR_POINTER, globalSymbols.colorShuffle, 0); if (colorShuffleModifier->enabled) { @@ -108,7 +108,7 @@ int AddGameGemHook(int *gameGemList, GameGem *gem, NoStrumState gemType) char origBlue = gem->blue; char origOrange = gem->orange; - mirrorModeModifier = ModifierActive(*(int *)PORT_MODIFIERMGR_POINTER, globalSymbols.mirrorMode, 0); + mirrorModeModifier = ModifierIsActive(*(int *)PORT_MODIFIERMGR_POINTER, globalSymbols.mirrorMode, 0); if (mirrorModeModifier->enabled) { diff --git a/source/MusicLibrary.c b/source/MusicLibrary.c index fce3e47..4c9fa39 100644 --- a/source/MusicLibrary.c +++ b/source/MusicLibrary.c @@ -9,7 +9,7 @@ void CheckForPanelAndJump(Symbol entryName, int sortType) { // check if the song select panel is "up" (displayed on screen) before attempting a jump UIPanel *songSelectPanel = ObjectFindUIPanel(*(int *)PORT_OBJECTDIRMAINDIR, "song_select_panel", 1); - if (songSelectPanel != NULL && songSelectPanel->is_up == 1) + if (songSelectPanel != NULL && songSelectPanel->mState == kPanelUp) { MusicLibrarySelect(*(int *)PORT_THEMUSICLIBRARY, entryName, sortType, 1); } diff --git a/source/QuazalHooks.c b/source/QuazalHooks.c index af70ade..306c67c 100644 --- a/source/QuazalHooks.c +++ b/source/QuazalHooks.c @@ -15,12 +15,12 @@ void OperatorEqualsFmtHook(char *r3, char *r4) return; } -int StepSequenceJobSetStepHook(int *unk, StepSequenceJobStep *step) +int StepSequenceJobSetStepHook(int *unk, Step *step) { // steps can have no name it seems; make sure we are not trying to print a null pointer - if (step != NULL && step->jobName != NULL) + if (step != NULL && step->m_szStepDescription != NULL) { - RB3E_DEBUG("Quazal Job: %s", step->jobName); + RB3E_DEBUG("Quazal Job: %s", step->m_szStepDescription); } return StepSequenceJobSetStep(unk, step); } \ No newline at end of file diff --git a/source/RndPropAnimHooks.c b/source/RndPropAnimHooks.c index eec9c15..5918f9b 100644 --- a/source/RndPropAnimHooks.c +++ b/source/RndPropAnimHooks.c @@ -10,7 +10,7 @@ // see https://github.com/RBEnhanced/RB3Enhanced/issues/2 void PropAnimSetFrameHook(RndPropAnim *rndPropAnim, float frame, float time) { - if (strcmp(rndPropAnim->object.name, "slot_positions.anim") == 0) + if (strcmp(rndPropAnim->mObject.name, "slot_positions.anim") == 0) { // check that it is not setting the frame to 0 (which is the default slot positions for overshell) if (frame != 0.0f) diff --git a/source/SetlistHooks.c b/source/SetlistHooks.c index 525e888..eefadd2 100644 --- a/source/SetlistHooks.c +++ b/source/SetlistHooks.c @@ -94,7 +94,7 @@ RndMat *MusicLibraryMatHook(MusicLibrary *thisMusicLibrary, int data, int idx, U { if (mat != NULL && tex != NULL) { - if (strcmp(listSlot->name, "game_origin_picture_slot") == 0) + if (strcmp(listSlot->mMatchName.buf, "game_origin_picture_slot") == 0) { int *ret = 0; SortNode *node = 0; diff --git a/source/_functions.c b/source/_functions.c index d1baaed..dab0015 100644 --- a/source/_functions.c +++ b/source/_functions.c @@ -31,7 +31,7 @@ RB3E_STUB(AppConstructor) // AppConstructor is handled by the BrainSlug engine #endif RB3E_STUB(ExecuteDTA) RB3E_STUB(SymbolConstruct) -RB3E_STUB(ModifierActive) +RB3E_STUB(ModifierIsActive) RB3E_STUB(HmxFactoryFuncAt) RB3E_STUB(BandLabelSetDisplayText) RB3E_STUB(RandomInt) diff --git a/source/rb3enhanced.c b/source/rb3enhanced.c index 241dde2..2134625 100644 --- a/source/rb3enhanced.c +++ b/source/rb3enhanced.c @@ -33,7 +33,7 @@ void SetVenueHook(int *thisMetaPerformer, Symbol venue) Modifier *blackBackgroundModifier; SymbolConstruct(&blackBackground, "mod_black_background"); - blackBackgroundModifier = ModifierActive(*(int *)PORT_MODIFIERMGR_POINTER, blackBackground, 0); + blackBackgroundModifier = ModifierIsActive(*(int *)PORT_MODIFIERMGR_POINTER, blackBackground, 0); if (blackBackgroundModifier->enabled) venue.sym = "none"; @@ -302,7 +302,7 @@ void InitialiseFunctions() POKE_B(&ExecuteDTA, PORT_EXECUTEDTA); POKE_B(&BandLabelSetDisplayText, PORT_BANDLABELSETDISPLAYTEXT); POKE_B(&SymbolConstruct, PORT_SYMBOL_CT); - POKE_B(&ModifierActive, PORT_MODIFIERMGR_ACTIVE); + POKE_B(&ModifierIsActive, PORT_MODIFIERMGR_ACTIVE); POKE_B(&HmxFactoryFuncAt, PORT_HMXFACTORYFUNCAT); POKE_B(&RandomInt, PORT_RANDOMINT); POKE_B(&DataNodeEvaluate, PORT_DATANODEEVALUATE); From 397bd527b31c47086a96b98a3549bd673eb77052 Mon Sep 17 00:00:00 2001 From: ihatecompvir Date: Sun, 18 Feb 2024 05:18:52 -0800 Subject: [PATCH 05/11] Fill out BandUser struct for 360 and Wii --- include/GemHooks.h | 2 +- include/rb3/BandUser.h | 66 +++++++++++++++++++++++++++++++++++++----- include/rb3/Data.h | 2 +- include/rb3/Track.h | 42 +++++++++++++++++++++++++++ source/GameHooks.c | 6 ++-- source/GemHooks.c | 2 +- 6 files changed, 106 insertions(+), 14 deletions(-) create mode 100644 include/rb3/Track.h diff --git a/include/GemHooks.h b/include/GemHooks.h index d6affc3..d42203c 100644 --- a/include/GemHooks.h +++ b/include/GemHooks.h @@ -8,5 +8,5 @@ int WillBeNoStrumHook(int *gameGemListPtr, int *multiGemInfoPtr); int *GetWidgetByNameHook(int *gemManager, Symbol name); -int AddGameGemHook(int *gameGemList, GameGem *gem, NoStrumState noStrumState); +int AddGameGemHook(GameGemList *gameGemList, GameGem *gem, NoStrumState noStrumState); Symbol GetSlotColorHook(int *bandUser); \ No newline at end of file diff --git a/include/rb3/BandUser.h b/include/rb3/BandUser.h index 6d07d8c..0e01eb6 100644 --- a/include/rb3/BandUser.h +++ b/include/rb3/BandUser.h @@ -1,6 +1,10 @@ #ifndef _BANDUSER_H #define _BANDUSER_H +#include "rb3/String.h" +#include "rb3/Symbol.h" +#include "rb3/Track.h" + typedef enum _Difficulty { kDifficultyEasy = 0, @@ -36,18 +40,64 @@ typedef enum _ControllerType kControllerNone = 5 } ControllerType; +typedef enum _PreferredScoreType +{ + kScoreDrum = 0, + kScoreBass = 1, + kScoreGuitar = 2, + kScoreVocals = 3, + kScoreHarmony = 4, + kScoreKeys = 5, + kScoreRealDrum = 6, + kScoreRealGuitar = 7, + kScoreRealBass = 8, + kScoreRealKeys = 9, + kScoreBand = 10 +} PreferredScoreType; + typedef struct _BandUser { + // BandUser members int unknown_0x0; int unknown_0x4; - Difficulty difficulty; - int unknown_0xc; - TrackType trackType; - ControllerType controllerType; - int unknown_0x14; - int unknown_0x18; - int unknown_0x1c; - int unknown_0x20; + Difficulty mDifficulty; + char mUnknown; + char pad[3]; + TrackType mTrackType; + ControllerType mControllerType; + char mTrackSelected; + char mUnknown2; + char pad2[2]; + PreferredScoreType mPreferredScoreType; + int mOvershellState; + String mOvershellFocus; + void *mChar; +#ifdef RB3E_XBOX + char mGameplayOptions[0x48]; +#else + char mGameplayOptions[0x38]; +#endif + char mAutoplay; + char pad3[3]; +#ifdef RB3E_WII + int mUnknownBool; +#endif + Symbol mPreviousAward; + float mLastHitFraction; + Track *mTrack; + void *mPlayer; + char mParticipating; +#ifdef RB3E_XBOX + char pad4[3]; + int mUnknown3; +#else + char mIsWiiRemoteController; + char mJustDisconnected; + char pad4; +#endif + + // User members + // TODO } BandUser; #endif // _BANDUSER_H \ No newline at end of file diff --git a/include/rb3/Data.h b/include/rb3/Data.h index ed30c5e..873026c 100644 --- a/include/rb3/Data.h +++ b/include/rb3/Data.h @@ -55,7 +55,7 @@ typedef struct _DataArray short mNodeCount; short mRefCount; short mLine; - short mUnknown; + short mDeprecated; // assuming this is for them to mark scripts or functions as being deprecated and etc.? } DataArray; // gets a pointer to the addr of a DTA function diff --git a/include/rb3/Track.h b/include/rb3/Track.h new file mode 100644 index 0000000..fa049a2 --- /dev/null +++ b/include/rb3/Track.h @@ -0,0 +1,42 @@ +#ifndef _TRACK_H +#define _TRACK_H + +#include "rb3/BandUser.h" +#include "rb3/Object.h" +#include "rb3/Symbol.h" +#include "rb3/Vector.h" + +typedef struct _TrackConfig +{ + int *mUser; + char kDualPerspective; + char pad[3]; + int mTrackNum; + int mMaxSlots; + int mNumSlots; + Symbol mName; + char mLefty; + char pad2[3]; + unsigned int mGameCymbalLanes; + char mDisableHopos; + char pad3[3]; + vector mSlotSpacing; +} TrackConfig; + +typedef struct _Track +{ + Object mTrackInterface; + TrackConfig mConfig; + float mLastRating; + int mLastRatingState; + char mUnk; // this is new to this structure, not sure what it does + char pad[3]; + int mLastStreakCount; + int mSlotIndex; + void *mGameplayOptions; + char mIntroPlaying; + char pad2[3]; + float mIntroEndMs; +} Track; + +#endif // _TRACK_H diff --git a/source/GameHooks.c b/source/GameHooks.c index 527fafe..e87f72e 100644 --- a/source/GameHooks.c +++ b/source/GameHooks.c @@ -49,10 +49,10 @@ void *GameConstructHook(void *theGame) // You just lost bandUser = GetBandUserFromSlot(*(int *)PORT_THEBANDUSERMGR, i); if (bandUser != NULL) { - RB3E_DEBUG("BandUser %i: %p - Track: %i, Controller: %i, Difficulty: %i", i, bandUser, bandUser->trackType, bandUser->controllerType, bandUser->difficulty); + RB3E_DEBUG("BandUser %i: %p - Track: %i, Controller: %i, Difficulty: %i", i, bandUser, bandUser->mTrackType, bandUser->mControllerType, bandUser->mDifficulty); bandevent.MemberExists[i] = 1; - bandevent.Difficulty[i] = bandUser->difficulty; - bandevent.TrackType[i] = bandUser->trackType; + bandevent.Difficulty[i] = bandUser->mDifficulty; + bandevent.TrackType[i] = bandUser->mTrackType; } else { diff --git a/source/GemHooks.c b/source/GemHooks.c index a79c05f..3747a84 100644 --- a/source/GemHooks.c +++ b/source/GemHooks.c @@ -99,7 +99,7 @@ Symbol GetSlotColorHook(int *bandUser, int slot) return slotColor; } -int AddGameGemHook(int *gameGemList, GameGem *gem, NoStrumState gemType) +int AddGameGemHook(GameGemList *gameGemList, GameGem *gem, NoStrumState gemType) { Modifier *mirrorModeModifier; char origGreen = gem->green; From f325f49568fb755975355e0463a5453706785b6f Mon Sep 17 00:00:00 2001 From: ihatecompvir Date: Sat, 24 Feb 2024 10:23:13 -0800 Subject: [PATCH 06/11] Game origin loads now dynamic, more structs --- include/GameOriginInfo.h | 12 ++ include/GlobalSymbols.h | 1 + include/SetlistHooks.h | 2 + include/ports.h | 16 +++ include/rb3/GameGem.h | 24 ++++ include/rb3/GemTrackResrcManager.h | 31 +++++ include/rb3/Rnd/RndTex.h | 2 + include/rb3/SongMetadata.h | 13 ++- include/rb3/TrackWatcher.h | 22 ++++ include/rb3/Vector.h | 2 + include/rb3_include.h | 1 + source/GameHooks.c | 2 +- source/GemHooks.c | 43 +++++-- source/GlobalSymbols.c | 1 + source/LocaleHooks.c | 1 + source/SetlistHooks.c | 178 ++++++++++++++++++++++++----- source/SongHooks.c | 2 + source/_functions.c | 9 +- source/net_http_server.c | 10 +- source/rb3enhanced.c | 5 + 20 files changed, 327 insertions(+), 50 deletions(-) create mode 100644 include/GameOriginInfo.h create mode 100644 include/rb3/GemTrackResrcManager.h create mode 100644 include/rb3/TrackWatcher.h diff --git a/include/GameOriginInfo.h b/include/GameOriginInfo.h new file mode 100644 index 0000000..dc29545 --- /dev/null +++ b/include/GameOriginInfo.h @@ -0,0 +1,12 @@ +/* + RB3Enhanced - GameOriginInfo.h +*/ + +typedef struct _GameOriginInfo +{ + char *gameOrigin; + int num; +} GameOriginInfo; + +extern int numGameOrigins; +extern GameOriginInfo originInfo[100]; \ No newline at end of file diff --git a/include/GlobalSymbols.h b/include/GlobalSymbols.h index 35677dc..787c727 100644 --- a/include/GlobalSymbols.h +++ b/include/GlobalSymbols.h @@ -26,6 +26,7 @@ typedef struct _GlobalSymbols Symbol colorShuffle; Symbol mirrorMode; Symbol blackBackground; + Symbol gemShuffle; // gem widgets Symbol greenGem; diff --git a/include/SetlistHooks.h b/include/SetlistHooks.h index c6092a1..a29606e 100644 --- a/include/SetlistHooks.h +++ b/include/SetlistHooks.h @@ -11,3 +11,5 @@ void SetSongAndArtistNameHook(BandLabel *label, SortNode *sortNode); void SetSongNameFromNodeHook(BandLabel *label, SortNode *sortNode); RndMat *MusicLibraryMatHook(MusicLibrary *thisMusicLibrary, int unk, int unk2, int *listSlot); +SongMetadata *SongMetadataConstructorHook(SongMetadata *thisSongMetadata, DataArray *data, DataArray *backupData, char isOnDisc); +char SongMetadataLoadHook(SongMetadata *thisSongMetadata, BinStream *stream); diff --git a/include/ports.h b/include/ports.h index 23f8a5a..3cd58cc 100644 --- a/include/ports.h +++ b/include/ports.h @@ -46,6 +46,8 @@ #define PORT_LOADOBJS_BCTRL 0x827562e4 // bctrl to Object::PreLoad insie of DirLoader::LoadObjs #define PORT_SONGMGR_ISDEMO_CHECK 0x82575f9c // "bne" after IsUGC check inside SongMgr::IsDemo #define PORT_STAGEKIT_EXISTS 0x8228d03c // StageKit check. nop over to allow for fog command without a physical StageKit connected. +#define PORT_ADDTRACKVECTOR_BL 0x82777b70 // bl to vector_push_back inside of SongData::AddTrack +#define PORT_GETGAMELIST 0x82770730 // SongData::GetGameList // function patch addresses #define PORT_SETDISKERROR 0x82516320 // PlatformMgr::SetDiskError #define PORT_APP_RUN 0x82272e90 // App::Run @@ -81,6 +83,7 @@ #define PORT_RANDOMINT 0x824f2f90 // RandomInt(min, max) #define PORT_GETWIDGETBYNAME 0x82b9b880 // GemManager::GetWidgetByName #define PORT_GETSLOTCOLOR 0x82baa308 // TrackConfig::GetSlotColor +#define PORT_ADDSMASHERPLATETOVECTOR 0x82356980 // AddSmasherPlateToVector #define PORT_ARCHIVE_CT 0x82514408 // Archive::_ct #define PORT_ARCHIVE_SETLOCATIONHARDDRIVE 0x82512b00 // Archive::SetLocationHardDrive #define PORT_ARCHIVE_MERGE 0x82513ee8 // Archive::Merge @@ -104,6 +107,7 @@ #define PORT_OVERSHELLPARTSELECTPROVIDERRELOAD 0x82668c70 // OvershellPartSelectProvider::Reload #define PORT_PREPARESOMEVECTORMAYBE 0x82796d90 // Prepares some vector, used by OvershellPartSelectProvider::Reload #define PORT_SOMEVECTORPUSHBACKMAYBE 0x82b6aa10 // vector,class_stlpmtx_std::StlNodeAlloc_>_>::push_back +#define PORT_VECTORPUSHBACK 0x82b5f808 // vector_push_back #define PORT_POSTPROC_DOPOST 0x82b89a08 // NgPostProc::DoPost #define PORT_MUSICLIBRARYSELECTMAYBE 0x8253EB00 // Selects an entry in the Music Library screen - actual name not known #define PORT_GETSYMBOLBYGAMEORIGIN 0x8265bb78 // SongSortByRecent::GetSymbolByGameOrigin @@ -125,6 +129,8 @@ #define PORT_MEMPRINT 0x827bc970 // MemPrint #define PORT_MEMNUMHEAPS 0x827bb628 // MemNumHeaps #define PORT_INITSONGMETADATA 0x827aa450 // InitSongMetadata +#define PORT_SONGMETADATACONSTRUCTOR 0x827aa6e8 // SongMetadata::__ct +#define PORT_SONGMETADATALOAD 0x825a3f58 // SongMetadata::Load #define PORT_UPDATEPRESENCE 0x82680430 // PresenceMgr::UpdatePresence #define PORT_STEPSEQUENCEJOBSETSTEP 0x82af92b8 // Quazal::StepSequenceJob::SetStep #define PORT_RNDTEXNEWOBJECT 0x82273de0 // RndTex::NewObject @@ -135,6 +141,8 @@ #define PORT_MUSICLIBRARY_CT 0x825451c8 // MusicLibrary::__ct #define PORT_MUSICLIBRARYMAT 0x8253b440 // MusicLibrary::Mat #define PORT_MUSICLIBRARYGETNODEBYINDEX 0x825bf708 // MusicLibrary::GetNodeByIndex +#define PORT_GAMEGEMDB_CT 0x827931e0 // GameGemDB::__ct +#define PORT_ADDMULTIGEM 0x827930d8 // GameGemDB::AddMultiGem // instance addresses #define PORT_MODIFIERMGR_POINTER 0x82dfec08 // pointer to ModifierManager #define PORT_ROCKCENTRALGATEWAY 0x82cc8f60 // address of RockCentralGateway @@ -194,6 +202,7 @@ void DbgPrint(const char *s, ...); #define PORT_MICCHECK 0x8024a4e8 // a bne that throws an error on the song select screen if the mic is not connected #define PORT_BIGSYMBOLFUNC_TAIL 0x8037a3d4 // blr after a function that initialises a bunch of symbols #define PORT_UPDATEPRESENCEBLOCK_B 0x80188194 // branch after the failure case in a function that calls UpdatePresence +#define PORT_ADDTRACKVECTOR_BL 0x80480a88 // bl to vector_push_back inside of SongData::AddTrack // #define PORT_LOADOBJS_BCTRL 0x827562e4 // function patch addresses #define PORT_SETDISKERROR 0x8030ce7c // PlatformMgr::SetDiskError @@ -218,6 +227,7 @@ void DbgPrint(const char *s, ...); #define PORT_GETWIDGETBYNAME 0x800d59b0 // GemManager::GetWidgetByName #define PORT_DATANODEEVALUATE 0x80322e9c // DataNode::Evaluate #define PORT_GETSLOTCOLOR 0x800e42a4 // TrackConfig::GetSlotColor +#define PORT_ADDSMASHERPLATETOVECTOR 0x804316d4 // AddSmasherPlateToVector #define PORT_USBWIIGETTYPE 0x806c1a3c // UsbWii::GetType #define PORT_FILE_EXISTS 0x802fa134 // FileExists #define PORT_QUEUEMESSAGE 0x80253c50 // PassiveMessagesPanel::QueueMessage @@ -231,6 +241,7 @@ void DbgPrint(const char *s, ...); #define PORT_OVERSHELLPARTSELECTPROVIDERRELOAD 0x802478a8 // OvershellPartSelectProvider::Reload #define PORT_PREPARESOMEVECTORMAYBE 0x80247c58 // Prepares some vector, used by BuildInstrumentSelectionList #define PORT_SOMEVECTORPUSHBACKMAYBE 0x802484a8 // vector,class_stlpmtx_std::StlNodeAlloc_>_>::push_back +#define PORT_VECTORPUSHBACK 0x800a6ef4 // vector_push_back #define PORT_POSTPROC_DOPOST 0x806b52b4 // WiiPostProc::DoPost #define PORT_MUSICLIBRARYSELECTMAYBE 0x80230d64 // Selects an entry in the Music Library screen - actual name not known #define PORT_GETSYMBOLBYGAMEORIGIN 0x8027dd3c // SongSortByRecent::GetSymbolByGameOrigin @@ -255,6 +266,8 @@ void DbgPrint(const char *s, ...); #define PORT_QUEUINGSOCKET_BIND 0x800478d4 // Quazal::QueuingSocket::Bind #define PORT_QUAZALSOCKET_BIND 0x8001cd10 // Quazal::Socket::Bind #define PORT_INITSONGMETADATA 0x805147a4 // InitSongMetadata +#define PORT_SONGMETADATACONSTRUCTOR 0x80514880 // SongMetadata::__ct +#define PORT_SONGMETADATALOAD 0x801d2090 // SongMetadata::Load #define PORT_UPDATEPRESENCE 0x801879d4 // PresenceMgr::UpdatePresence #define PORT_STEPSEQUENCEJOBSETSTEP 0x80025364 // Quazal::StepSequenceJob::SetStep #define PORT_RNDTEXNEWOBJECT 0x80639904 // RndTex::NewObject @@ -265,6 +278,9 @@ void DbgPrint(const char *s, ...); #define PORT_MUSICLIBRARY_CT 0x8022d978 // MusicLibrary::__ct #define PORT_MUSICLIBRARYMAT 0x80231c5c // MusicLibrary::Mat #define PORT_MUSICLIBRARYGETNODEBYINDEX 0x80279314 // MusicLibrary::GetNodeByIndex +#define PORT_GAMEGEMDB_CT 0x80460f64 // GameGemDB::__ct +#define PORT_ADDMULTIGEM 0x80461160 // GameGemDB::AddMultiGem +#define PORT_GETGAMELIST 0x8048553c // SongData::GetGameList // instance addresses #define PORT_MODIFIERMGR_POINTER 0x808fda68 // pointer to ModifierManager #define PORT_ROCKCENTRALGATEWAY 0x80900870 // address of RockCentralGateway diff --git a/include/rb3/GameGem.h b/include/rb3/GameGem.h index 6816dc6..996491d 100644 --- a/include/rb3/GameGem.h +++ b/include/rb3/GameGem.h @@ -53,9 +53,33 @@ typedef struct _GameGemList vector mGems; } GameGemList; +typedef struct _GameGemDB +{ + vector mGems; + int mHopoThreshold; +} GameGemDB; + +typedef struct _MultiGemInfo +{ + int track; + int slots; + float ms; + float duration_ms; + int tick; + int duration_ticks; + char ignore_duration; + char is_cymbal; + char pad[2]; + int players; + NoStrumState no_strum; +} MultiGemInfo; + extern int WillBeNoStrum(GameGemList *thisGameGemList, int *multiGemInfoPtr); extern int AddGameGem(GameGemList *gameGemList, GameGem *gem, NoStrumState gemType); +extern char AddMultiGem(GameGemDB *this, int diff, MultiGemInfo *info); extern int *GetWidgetByName(int *gemManager, Symbol sym); extern Symbol GetSlotColor(int *bandUser, int slot); +extern GameGemDB *GameGemDBConstructor(GameGemDB *thisGameGemDB, int num_difficulties, int hopo_threshold); +extern GameGemList *GetGameGemList(void *songData, int unk); #endif // _GAMEGEM_H \ No newline at end of file diff --git a/include/rb3/GemTrackResrcManager.h b/include/rb3/GemTrackResrcManager.h new file mode 100644 index 0000000..878a104 --- /dev/null +++ b/include/rb3/GemTrackResrcManager.h @@ -0,0 +1,31 @@ +#ifndef _GEMTRACKRESOURCEMANAGER_H +#define _GEMTRACKRESOURCEMANAGER_H + +#include "rb3/Object.h" + +typedef enum _SmasherPlateType +{ + kPlateGuitar = 0, + kPlateDrums = 1, + kPlateBass = 2, + // 3 seems to be unused + kPlateKeys = 4, + kPlateRealGuitar = 5, + kPlateRealBass = 6, + kPlateRealKeys = 7 + +} SmasherPlateType; + +typedef struct _SmasherPlate +{ + void *vtable; + void *mResourceManager; + Object *mSmasherPlateObject; // not sure what this type of object this actually is so just use generic obj for now + SmasherPlateType mSmasherType; + char mUsed; + char pad[3]; +} SmasherPlate; + +void AddSmasherPlateToVector(void *smasherPlates, SmasherPlate *plate); + +#endif // _GEMTRACKRESOURCEMANAGER_H diff --git a/include/rb3/Rnd/RndTex.h b/include/rb3/Rnd/RndTex.h index 1a9f2c7..4093d5b 100644 --- a/include/rb3/Rnd/RndTex.h +++ b/include/rb3/Rnd/RndTex.h @@ -1,7 +1,9 @@ #ifndef _RNDTEX_H #define _RNDTEX_H +#include "rb3/FilePath.h" #include "rb3/Object.h" +#include "rb3/String.h" typedef enum _BitmapType { diff --git a/include/rb3/SongMetadata.h b/include/rb3/SongMetadata.h index 032872d..e237681 100644 --- a/include/rb3/SongMetadata.h +++ b/include/rb3/SongMetadata.h @@ -1,6 +1,8 @@ #ifndef _SONGMETADATA_H #define _SONGMETADATA_H +#include "rb3/BinStream.h" +#include "rb3/Data.h" #include "String.h" // technically BandSongMetadata? @@ -12,10 +14,11 @@ typedef struct _SongMetadata #else char unknown[0x28]; #endif - char *shortname; - int song_id; - char unknown2[0x4]; - char *gameOrigin; + char *mShortName; + int mSongID; + char mIsOnDisc; + char pad[3]; + char *mGameOrigin; char unknown3[0x10]; String title; String artist; @@ -32,5 +35,7 @@ typedef struct _SongMetadata } SongMetadata; extern SongMetadata *InitSongMetadata(SongMetadata *data); +extern SongMetadata *SongMetadataConstructor(SongMetadata *thisSongMetadata, DataArray *data, DataArray *backupData, char isOnDisc); +extern char SongMetadataLoad(SongMetadata *thisSongMetadata, BinStream *stream); #endif // _SONGMETADATA_H diff --git a/include/rb3/TrackWatcher.h b/include/rb3/TrackWatcher.h new file mode 100644 index 0000000..53bb6c1 --- /dev/null +++ b/include/rb3/TrackWatcher.h @@ -0,0 +1,22 @@ +#ifndef _TRACKWATCHER_H +#define _TRACKWATCHER_H + +#include "rb3/Data.h" +#include "rb3/Vector.h" + +typedef struct _TrackWatcher +{ + void *mImpl; + vector mSinks; + int mTrack; + char mIndependentSlots; + char pad[3]; + int mUserGuid[4]; + void *mPlayerSlot; + Symbol mControllerType; + void *mSongData; + void *mTrackWatcherParent; + DataArray *mCfg; +} TrackWatcher; + +#endif // _TRACKWATCHER_H \ No newline at end of file diff --git a/include/rb3/Vector.h b/include/rb3/Vector.h index 6be0a39..8dce691 100644 --- a/include/rb3/Vector.h +++ b/include/rb3/Vector.h @@ -18,4 +18,6 @@ typedef struct _vector #endif } vector; +void vector_push_back(vector *v, void *item); + #endif // _VECTOR_H \ No newline at end of file diff --git a/include/rb3_include.h b/include/rb3_include.h index af8484b..9876355 100644 --- a/include/rb3_include.h +++ b/include/rb3_include.h @@ -18,6 +18,7 @@ #include "rb3/FileStream.h" #include "rb3/Game.h" #include "rb3/GameGem.h" +#include "rb3/GemTrackResrcManager.h" #include "rb3/Joypad.h" #include "rb3/Locale.h" #include "rb3/Mem.h" diff --git a/source/GameHooks.c b/source/GameHooks.c index e87f72e..b9d9057 100644 --- a/source/GameHooks.c +++ b/source/GameHooks.c @@ -39,7 +39,7 @@ void *GameConstructHook(void *theGame) // You just lost if (metadata != NULL) { RB3E_DEBUG("Metadata: %p", metadata); - RB3E_DEBUG("Started song: '%s' - %s (ID: %i, %s)", metadata->title.buf, metadata->artist.buf, metadata->song_id, metadata->shortname); + RB3E_DEBUG("Started song: '%s' - %s (ID: %i, %s)", metadata->title.buf, metadata->artist.buf, metadata->mSongID, metadata->mShortName); RB3E_SendEvent(RB3E_EVENT_SONG_NAME, metadata->title.buf, metadata->title.length); RB3E_SendEvent(RB3E_EVENT_SONG_ARTIST, metadata->artist.buf, metadata->artist.length); } diff --git a/source/GemHooks.c b/source/GemHooks.c index 3747a84..0e0370a 100644 --- a/source/GemHooks.c +++ b/source/GemHooks.c @@ -1,9 +1,11 @@ #include "GlobalSymbols.h" #include "ports.h" +#include "rb3/Mem.h" #include "rb3/ModifierManager.h" #include "rb3/GameGem.h" #include "rb3/Random.h" #include "rb3/Symbol.h" +#include "rb3/Vector.h" int WillBeNoStrumHook(GameGemList *thisGameGemList, int *gem) { @@ -99,27 +101,50 @@ Symbol GetSlotColorHook(int *bandUser, int slot) return slotColor; } +void shuffleColors(GameGem *gem) +{ + char colors[5] = {gem->green, gem->red, gem->yellow, gem->blue, gem->orange}; + int i; + + for (i = 4; i > 0; i--) + { + int j = RandomInt(0, 0x7FFFFFFF) % (i + 1); + char temp = colors[i]; + colors[i] = colors[j]; + colors[j] = temp; + } + + // Assign the shuffled colors back + gem->green = colors[0]; + gem->red = colors[1]; + gem->yellow = colors[2]; + gem->blue = colors[3]; + gem->orange = colors[4]; +} + int AddGameGemHook(GameGemList *gameGemList, GameGem *gem, NoStrumState gemType) { Modifier *mirrorModeModifier; + Modifier *gemShuffleModifier; char origGreen = gem->green; char origRed = gem->red; - // char origYellow = gem->yellow; char origBlue = gem->blue; char origOrange = gem->orange; mirrorModeModifier = ModifierIsActive(*(int *)PORT_MODIFIERMGR_POINTER, globalSymbols.mirrorMode, 0); + gemShuffleModifier = ModifierIsActive(*(int *)PORT_MODIFIERMGR_POINTER, globalSymbols.gemShuffle, 0); + if (gemShuffleModifier->enabled) + { + shuffleColors(gem); + } if (mirrorModeModifier->enabled) { - if (gemType == kStrumDefault) - { - gem->green = origOrange; - gem->red = origBlue; - // yellow doesn't need to be swapped - gem->blue = origRed; - gem->orange = origGreen; - } + gem->green = origOrange; + gem->red = origBlue; + // yellow doesn't need to be swapped + gem->blue = origRed; + gem->orange = origGreen; return AddGameGem(gameGemList, gem, gemType); } else diff --git a/source/GlobalSymbols.c b/source/GlobalSymbols.c index 78e564d..ee01767 100644 --- a/source/GlobalSymbols.c +++ b/source/GlobalSymbols.c @@ -41,6 +41,7 @@ void InitGlobalSymbols() SymbolConstruct(&globalSymbols.colorShuffle, "mod_color_shuffle"); SymbolConstruct(&globalSymbols.forceHopos, "mod_force_hopos"); SymbolConstruct(&globalSymbols.mirrorMode, "mod_mirror_mode"); + SymbolConstruct(&globalSymbols.gemShuffle, "mod_gem_shuffle"); SymbolConstruct(&globalSymbols.greenGem, "gem_green.wid"); SymbolConstruct(&globalSymbols.redGem, "gem_red.wid"); diff --git a/source/LocaleHooks.c b/source/LocaleHooks.c index 6095e79..c065d4b 100644 --- a/source/LocaleHooks.c +++ b/source/LocaleHooks.c @@ -41,6 +41,7 @@ static char *newLocales[][2] = { {"mod_force_hopos", "Force HOPOs"}, {"mod_mirror_mode", "Mirror Mode (Guitar Only)"}, {"mod_color_shuffle", "Gem Color Shuffle"}, + {"mod_gem_shuffle", "Gem Shuffle"}, }; static int numNewLocales = sizeof(newLocales) / sizeof(newLocales[0]); diff --git a/source/SetlistHooks.c b/source/SetlistHooks.c index eefadd2..96473b2 100644 --- a/source/SetlistHooks.c +++ b/source/SetlistHooks.c @@ -8,7 +8,9 @@ #include #include "config.h" #include "ports.h" +#include "GameOriginInfo.h" #include "rb3/BandLabel.h" +#include "rb3/File.h" #include "rb3/FilePath.h" #include "rb3/MusicLibrary.h" #include "rb3/UI/UIListSlot.h" @@ -18,33 +20,40 @@ #include "rb3/Rnd/RndMat.h" #include "rb3/Rnd/RndTex.h" -static RndTex *tex = {0}; -static RndMat *mat = {0}; +RndMat *materials[100] = {0}; +RndTex *textures[100] = {0}; -void CreateMaterials() +void CreateMaterials(GameOriginInfo *info) { + RB3E_DEBUG("Creating material for game origin '%s'", info->gameOrigin); + // create our new RndTex and RndMat - tex = RndTexNewObject(); - mat = RndMatNewObject(); + textures[info->num] = RndTexNewObject(); + materials[info->num] = RndMatNewObject(); - if (tex != NULL && mat != NULL) + if (textures[info->num] != NULL && materials[info->num] != NULL) { int i = 0; - FilePath texPath = {0}; - FilePathConstructor(&texPath, "ui/resource/game_origins/rb3_keep.bmp"); + char texPath[1024] = {0}; + FilePath textureFilePath = {0}; + + strcat(texPath, "ui/resource/game_origins/"); + strcat(texPath, info->gameOrigin); + strcat(texPath, ".png"); + FilePathConstructor(&textureFilePath, texPath); - RndTexSetBitmap(tex, &texPath); + RndTexSetBitmap(textures[info->num], &textureFilePath); - mat->diffuseTex.tex = tex; + materials[info->num]->diffuseTex.tex = textures[info->num]; // allow the material to become transparent so alpha channel does not appear black // not sure if all of this is really necessary - mat->blend = kSrcAlpha; - mat->preLit = 1; - mat->useEnviron = 0; - mat->alphaCut = 0; - mat->alphaThreshold = 0; - mat->intensify = 0; + materials[info->num]->blend = kSrcAlpha; + materials[info->num]->preLit = 1; + materials[info->num]->useEnviron = 0; + materials[info->num]->alphaCut = 0; + materials[info->num]->alphaThreshold = 0; + materials[info->num]->intensify = 0; } } @@ -84,7 +93,7 @@ void SetSongNameFromNodeHook(BandLabel *label, SortNode *sortNode) int *MusicLibraryConstructorHook(MusicLibrary *thisMusicLibrary, int *songPreview) { - CreateMaterials(); + // CreateMaterials(); return MusicLibraryConstructor(thisMusicLibrary, songPreview); } @@ -92,24 +101,37 @@ RndMat *MusicLibraryMatHook(MusicLibrary *thisMusicLibrary, int data, int idx, U { if (listSlot != NULL) { - if (mat != NULL && tex != NULL) + if (strcmp(listSlot->mMatchName.buf, "game_origin_picture_slot") == 0) { - if (strcmp(listSlot->mMatchName.buf, "game_origin_picture_slot") == 0) - { - int *ret = 0; - SortNode *node = 0; - SongNodeType nodeType = kNodeNone; + int *ret = 0; + SortNode *node = 0; + SongNodeType nodeType = kNodeNone; + int curInfo = 0; - ret = ((int *)(*(void **)PORT_THESONGSORTMGR))[thisMusicLibrary->unk2 + 0x13]; - if (ret != NULL) + ret = ((int *)(*(void **)PORT_THESONGSORTMGR))[thisMusicLibrary->unk2 + 0x13]; + if (ret != NULL) + { + node = MusicLibraryGetNodeByIndex(ret, idx); + if (node != NULL) { - node = MusicLibraryGetNodeByIndex(ret, idx); - if (node != NULL) + nodeType = node->vtable->getNodeType(); + if (nodeType == kNodeSong) { - nodeType = node->vtable->getNodeType(); - if (nodeType == kNodeSong) + // this shit fucking sucks lol + for (curInfo = 0; curInfo < numGameOrigins; curInfo++) { - return mat; + if (strcmp(node->record->metaData->mGameOrigin, originInfo[curInfo].gameOrigin) == 0) + { + if (materials[originInfo[curInfo].num] != NULL) + { + RB3E_DEBUG("Returning material for game origin '%s'", originInfo[curInfo].gameOrigin); + return materials[originInfo[curInfo].num]; + } + else + { + RB3E_DEBUG("Material for game origin '%s' is NULL, creation seemingly failed", originInfo[curInfo].gameOrigin); + } + } } } } @@ -118,4 +140,100 @@ RndMat *MusicLibraryMatHook(MusicLibrary *thisMusicLibrary, int data, int idx, U } return MusicLibraryMat(thisMusicLibrary, data, idx, listSlot); +} + +int numGameOrigins; +GameOriginInfo originInfo[100] = {0}; + +void AddGameOriginToIconList(char *gameOrigin) +{ + int i = 0; + + // check that we havent already added 100 game origins + if (numGameOrigins >= 100) + { + RB3E_DEBUG("Too many game origins with icons, not adding '%s'", gameOrigin); + return; + } + + // make sure the game origin isn't already in the array + for (i = 0; i < numGameOrigins; i++) + { + if (strcmp(originInfo[i].gameOrigin, gameOrigin) == 0) + { + return; + } + } + + originInfo[numGameOrigins].gameOrigin = gameOrigin; + originInfo[numGameOrigins].num = numGameOrigins; + CreateMaterials(&originInfo[numGameOrigins]); + numGameOrigins++; + RB3E_DEBUG("Adding game origin '%s' to icon list, total is now %i", gameOrigin, numGameOrigins); +} + +// this will be called any time a song is loaded from DTA (on disc or when loading into the cache) +SongMetadata *SongMetadataConstructorHook(SongMetadata *thisSongMetadata, DataArray *data, DataArray *backupData, char isOnDisc) +{ + thisSongMetadata = SongMetadataConstructor(thisSongMetadata, data, backupData, isOnDisc); + + // make sure the game origin isn't null + if (thisSongMetadata->mGameOrigin != 0) + { + char gameOrigin[0x200]; + strcpy(gameOrigin, "/ui/resource/game_origins/gen/"); + strcat(gameOrigin, thisSongMetadata->mGameOrigin); +#ifdef RB3E_XBOX + strcat(gameOrigin, ".png_xbox"); +#else + strcat(gameOrigin, ".png_wii"); +#endif + + // check the game origin image exists in the ARK + if (FileExists(gameOrigin, kRead) == 0) + { + if (FileExists(gameOrigin, kReadNoArk) == 0) + { + RB3E_DEBUG("Game origin icon at path '%s' for origin '%s' does not exist!", gameOrigin, thisSongMetadata->mGameOrigin); + return thisSongMetadata; + } + } + AddGameOriginToIconList(thisSongMetadata->mGameOrigin); + return thisSongMetadata; + } + + return thisSongMetadata; +} + +// this will be called when a song is loaded from cache +char SongMetadataLoadHook(SongMetadata *thisSongMetadata, BinStream *stream) +{ + char ret = SongMetadataLoad(thisSongMetadata, stream); + + // make sure the game origin isn't null + if (thisSongMetadata->mGameOrigin != 0) + { + char gameOrigin[0x200]; + strcpy(gameOrigin, "/ui/resource/game_origins/gen/"); + strcat(gameOrigin, thisSongMetadata->mGameOrigin); +#ifdef RB3E_XBOX + strcat(gameOrigin, ".png_xbox"); +#else + strcat(gameOrigin, ".png_wii"); +#endif + + // check the game origin image exists in the ARK + if (FileExists(gameOrigin, kRead) == 0) + { + if (FileExists(gameOrigin, kReadNoArk) == 0) + { + RB3E_DEBUG("Game origin icon at path '%s' for origin '%s' does not exist!", gameOrigin, thisSongMetadata->mGameOrigin); + return ret; + } + } + AddGameOriginToIconList(thisSongMetadata->mGameOrigin); + return ret; + } + + return ret; } \ No newline at end of file diff --git a/source/SongHooks.c b/source/SongHooks.c index 62e0353..594c257 100644 --- a/source/SongHooks.c +++ b/source/SongHooks.c @@ -7,6 +7,8 @@ #include #include "ports.h" #include "crc32.h" +#include "GameOriginInfo.h" +#include "rb3/File.h" #include "rb3/PassiveMessagesPanel.h" #include "rb3/SongMetadata.h" #include "rb3/Data.h" diff --git a/source/_functions.c b/source/_functions.c index dab0015..9ff8b01 100644 --- a/source/_functions.c +++ b/source/_functions.c @@ -101,4 +101,11 @@ RB3E_STUB(MusicLibraryMat) RB3E_STUB(RndCreateDefaultTexture) RB3E_STUB(MusicLibraryConstructor) RB3E_STUB(MusicLibraryGetNodeByIndex) -RB3E_STUB(StringConstructor) \ No newline at end of file +RB3E_STUB(StringConstructor) +RB3E_STUB(AddSmasherPlateToVector) +RB3E_STUB(vector_push_back) +RB3E_STUB(GameGemDBConstructor) +RB3E_STUB(AddMultiGem) +RB3E_STUB(GetGameGemList) +RB3E_STUB(SongMetadataConstructor) +RB3E_STUB(SongMetadataLoad) \ No newline at end of file diff --git a/source/net_http_server.c b/source/net_http_server.c index 18b1f78..2c0ed2f 100644 --- a/source/net_http_server.c +++ b/source/net_http_server.c @@ -179,7 +179,7 @@ void HTTP_Server_Accept(void *connection) strcat(response_buffer, "Content-Type: text/plain\r\n"); strcat(response_buffer, "\r\n"); strcat(response_buffer, "shortname="); - strcat(response_buffer, song_metadata->shortname); + strcat(response_buffer, song_metadata->mShortName); strcat(response_buffer, "\r\n"); strcat(response_buffer, "title="); strcat(response_buffer, song_metadata->title.buf); @@ -191,7 +191,7 @@ void HTTP_Server_Accept(void *connection) strcat(response_buffer, song_metadata->album.buf); strcat(response_buffer, "\r\n"); strcat(response_buffer, "origin="); - strcat(response_buffer, song_metadata->gameOrigin); + strcat(response_buffer, song_metadata->mGameOrigin); strcat(response_buffer, "\r\n"); strcat(response_buffer, "\r\n"); RB3E_TCP_Send(s, (void *)response_buffer, strlen(response_buffer)); @@ -232,10 +232,10 @@ void HTTP_Server_Accept(void *connection) if (song_metadata != NULL) { strcat(response_buffer, "["); - strcat(response_buffer, song_metadata->shortname); + strcat(response_buffer, song_metadata->mShortName); strcat(response_buffer, "]\r\n"); strcat(response_buffer, "shortname="); - strcat(response_buffer, song_metadata->shortname); + strcat(response_buffer, song_metadata->mShortName); strcat(response_buffer, "\r\n"); strcat(response_buffer, "title="); strcat(response_buffer, song_metadata->title.buf); @@ -247,7 +247,7 @@ void HTTP_Server_Accept(void *connection) strcat(response_buffer, song_metadata->album.buf); strcat(response_buffer, "\r\n"); strcat(response_buffer, "origin="); - strcat(response_buffer, song_metadata->gameOrigin); + strcat(response_buffer, song_metadata->mGameOrigin); strcat(response_buffer, "\r\n"); strcat(response_buffer, "\r\n"); if (strlen(response_buffer) > 1500) diff --git a/source/rb3enhanced.c b/source/rb3enhanced.c index 2134625..03fb046 100644 --- a/source/rb3enhanced.c +++ b/source/rb3enhanced.c @@ -111,6 +111,7 @@ void *ModifierManagerConstructorHook(int thisModifierManager, int unk) ExecuteDTA(PORT_ROCKCENTRALGATEWAY, "{do{push_back {find $syscfg modifiers modifiers} (mod_force_hopos)}}"); ExecuteDTA(PORT_ROCKCENTRALGATEWAY, "{do{push_back {find $syscfg modifiers modifiers} (mod_mirror_mode)}}"); ExecuteDTA(PORT_ROCKCENTRALGATEWAY, "{do{push_back {find $syscfg modifiers modifiers} (mod_color_shuffle)}}"); + ExecuteDTA(PORT_ROCKCENTRALGATEWAY, "{do{push_back {find $syscfg modifiers modifiers} (mod_gem_shuffle)}}"); return ModifierManagerConstructor(thisModifierManager, unk); } @@ -329,6 +330,8 @@ void InitialiseFunctions() POKE_B(&RndTexSetBitmap2, PORT_RNDTEXSETBITMAP2); POKE_B(&FilePathConstructor, PORT_FILEPATHCONSTRUCTOR); POKE_B(&MusicLibraryGetNodeByIndex, PORT_MUSICLIBRARYGETNODEBYINDEX); + POKE_B(&vector_push_back, PORT_VECTORPUSHBACK); + POKE_B(&GameGemDBConstructor, PORT_GAMEGEMDB_CT); RB3E_MSG("Functions initialized!", NULL); } @@ -360,6 +363,8 @@ void ApplyHooks() HookFunction(PORT_RNDPROPANIMSETFRAME, &PropAnimSetFrame, &PropAnimSetFrameHook); HookFunction(PORT_SYMBOLPREINIT, &SymbolPreInit, &SymbolPreInitHook); HookFunction(PORT_INITSONGMETADATA, &InitSongMetadata, &InitSongMetadataHook); + HookFunction(PORT_SONGMETADATACONSTRUCTOR, &SongMetadataConstructor, &SongMetadataConstructorHook); + HookFunction(PORT_SONGMETADATALOAD, &SongMetadataLoad, &SongMetadataLoadHook); HookFunction(PORT_UPDATEPRESENCE, &UpdatePresence, &UpdatePresenceHook); HookFunction(PORT_MUSICLIBRARY_CT, &MusicLibraryConstructor, &MusicLibraryConstructorHook); HookFunction(PORT_MUSICLIBRARYMAT, &MusicLibraryMat, &MusicLibraryMatHook); From 65961171edd79885484bbd91184ba6c4c93e5c8c Mon Sep 17 00:00:00 2001 From: ihatecompvir Date: Sun, 25 Feb 2024 03:01:56 -0800 Subject: [PATCH 07/11] Add NodeSort type, node handling improvements --- include/SongSort.h | 5 ----- include/ports.h | 6 ++++-- include/rb3/MusicLibrary.h | 9 +++++---- include/rb3/NodeSort.h | 22 ++++++++++++++++++++++ include/rb3/SongSortMgr.h | 18 ++++++++++++++++++ include/rb3_include.h | 2 ++ source/SetlistHooks.c | 10 ++++++---- source/_functions.c | 4 +++- source/rb3enhanced.c | 3 ++- 9 files changed, 62 insertions(+), 17 deletions(-) create mode 100644 include/rb3/NodeSort.h create mode 100644 include/rb3/SongSortMgr.h diff --git a/include/SongSort.h b/include/SongSort.h index 5c2e10b..120274e 100644 --- a/include/SongSort.h +++ b/include/SongSort.h @@ -6,11 +6,6 @@ #include "rb3/Symbol.h" #include "rb3/SongSortByRecentEntry.h" -typedef struct _SongSortMgr -{ - int *vtable; -} SongSortMgr; - SongSortByRecentEntry *SongSortByRecentHook(int *songSortByRecent, int *unk, char *songName, char *gameOrigin, int *unk2); Symbol *GetSymbolByGameOriginHook(Symbol *sym, int gameOrigin); int GetGameOriginBySymbolHook(Symbol sym); diff --git a/include/ports.h b/include/ports.h index 3cd58cc..dbc57c6 100644 --- a/include/ports.h +++ b/include/ports.h @@ -140,9 +140,10 @@ #define PORT_FILEPATHCONSTRUCTOR 0x82270210 // FilePath::__ct #define PORT_MUSICLIBRARY_CT 0x825451c8 // MusicLibrary::__ct #define PORT_MUSICLIBRARYMAT 0x8253b440 // MusicLibrary::Mat -#define PORT_MUSICLIBRARYGETNODEBYINDEX 0x825bf708 // MusicLibrary::GetNodeByIndex +#define PORT_NODESORTGETNODE 0x825bf708 // MusicLibrary::GetNodeByIndex #define PORT_GAMEGEMDB_CT 0x827931e0 // GameGemDB::__ct #define PORT_ADDMULTIGEM 0x827930d8 // GameGemDB::AddMultiGem +#define PORT_SONGSORTMGRGETSORT 0x82595ff8 // SongSortMgr::GetSort // instance addresses #define PORT_MODIFIERMGR_POINTER 0x82dfec08 // pointer to ModifierManager #define PORT_ROCKCENTRALGATEWAY 0x82cc8f60 // address of RockCentralGateway @@ -277,10 +278,11 @@ void DbgPrint(const char *s, ...); #define PORT_FILEPATHCONSTRUCTOR 0x8000ec5c // FilePath::__ct #define PORT_MUSICLIBRARY_CT 0x8022d978 // MusicLibrary::__ct #define PORT_MUSICLIBRARYMAT 0x80231c5c // MusicLibrary::Mat -#define PORT_MUSICLIBRARYGETNODEBYINDEX 0x80279314 // MusicLibrary::GetNodeByIndex +#define PORT_NODESORTGETNODE 0x80279314 // MusicLibrary::GetNodeByIndex #define PORT_GAMEGEMDB_CT 0x80460f64 // GameGemDB::__ct #define PORT_ADDMULTIGEM 0x80461160 // GameGemDB::AddMultiGem #define PORT_GETGAMELIST 0x8048553c // SongData::GetGameList +#define PORT_SONGSORTMGRGETSORT 0x802310b8 // SongSortMgr::GetSort // instance addresses #define PORT_MODIFIERMGR_POINTER 0x808fda68 // pointer to ModifierManager #define PORT_ROCKCENTRALGATEWAY 0x80900870 // address of RockCentralGateway diff --git a/include/rb3/MusicLibrary.h b/include/rb3/MusicLibrary.h index 4ab14bb..4f50f47 100644 --- a/include/rb3/MusicLibrary.h +++ b/include/rb3/MusicLibrary.h @@ -5,8 +5,12 @@ typedef struct _MusicLibrary { +#ifdef RB3E_XBOX char unk[0xfc]; - int unk2; +#else + char unk[0xdc]; +#endif + int mSortType; } MusicLibrary; // Jumps to a given entry in the music library @@ -14,7 +18,4 @@ void MusicLibrarySelect(int theMusicLibrary, Symbol entryName, int sortType, int int *MusicLibraryConstructor(int *thisMusicLibrary, int *songPreview); int *MusicLibraryConstructorHook(MusicLibrary *thisMusicLibrary, int *songPreview); -// in the RB3 debug this function is inlined -SortNode *MusicLibraryGetNodeByIndex(int *ret, int idx); - #endif // _MUSICLIBRARY_H_ diff --git a/include/rb3/NodeSort.h b/include/rb3/NodeSort.h new file mode 100644 index 0000000..c7c3b64 --- /dev/null +++ b/include/rb3/NodeSort.h @@ -0,0 +1,22 @@ +#ifndef _NODESORT_H +#define _NODESORT_H + +#include "rb3/List.h" +#include "rb3/Object.h" +#include "rb3/SortNode.h" +#include "rb3/Vector.h" + +// very clear naming here. this couldn't possibly have been confusing during development +typedef struct _NodeSort +{ + void *mListProvider; + Object mObject; + vector mTree; + list mFunctions; + vector mList; + Symbol mSortName; +} NodeSort; + +SortNode *NodeSortGetNode(NodeSort *thisNodeSort, int idx); + +#endif // _NODESORT_H \ No newline at end of file diff --git a/include/rb3/SongSortMgr.h b/include/rb3/SongSortMgr.h new file mode 100644 index 0000000..2229255 --- /dev/null +++ b/include/rb3/SongSortMgr.h @@ -0,0 +1,18 @@ +#ifndef _SONGSORTMGR_H +#define _SONGSORTMGR_H + +#include "rb3/NodeSort.h" + +typedef struct _SongSortMgr +{ +#ifdef RB3E_XBOX + char pad[0x4c]; +#else + char pad[0x44]; +#endif + NodeSort *mNodeSort[11]; // NodeSort *[11] in debug symbols, depends on the number of sorting types, retail might have more +} SongSortMgr; + +NodeSort *SongSortMgrGetSort(SongSortMgr *thisSongSortMgr, int sortType); + +#endif // _SONGSORTMGR_H diff --git a/include/rb3_include.h b/include/rb3_include.h index 9876355..ef32eb2 100644 --- a/include/rb3_include.h +++ b/include/rb3_include.h @@ -25,6 +25,7 @@ #include "rb3/MetaPerformer.h" #include "rb3/ModifierManager.h" #include "rb3/MusicLibrary.h" +#include "rb3/NodeSort.h" #include "rb3/Object.h" #include "rb3/PassiveMessagesPanel.h" #include "rb3/PresenceMgr.h" @@ -32,6 +33,7 @@ #include "rb3/RockCentralGateway.h" #include "rb3/SongMetadata.h" #include "rb3/SongSortByRecentEntry.h" +#include "rb3/SongSortMgr.h" #include "rb3/SortNode.h" #include "rb3/String.h" #include "rb3/Symbol.h" diff --git a/source/SetlistHooks.c b/source/SetlistHooks.c index 96473b2..71b9ab4 100644 --- a/source/SetlistHooks.c +++ b/source/SetlistHooks.c @@ -13,10 +13,12 @@ #include "rb3/File.h" #include "rb3/FilePath.h" #include "rb3/MusicLibrary.h" +#include "rb3/NodeSort.h" #include "rb3/UI/UIListSlot.h" #include "rb3/UI/UIPanel.h" #include "SongSort.h" #include "rb3/SortNode.h" +#include "rb3/SongSortMgr.h" #include "rb3/Rnd/RndMat.h" #include "rb3/Rnd/RndTex.h" @@ -108,10 +110,10 @@ RndMat *MusicLibraryMatHook(MusicLibrary *thisMusicLibrary, int data, int idx, U SongNodeType nodeType = kNodeNone; int curInfo = 0; - ret = ((int *)(*(void **)PORT_THESONGSORTMGR))[thisMusicLibrary->unk2 + 0x13]; + ret = SongSortMgrGetSort(*(SongSortMgr **)PORT_THESONGSORTMGR, thisMusicLibrary->mSortType); if (ret != NULL) { - node = MusicLibraryGetNodeByIndex(ret, idx); + node = NodeSortGetNode(ret, idx); if (node != NULL) { nodeType = node->vtable->getNodeType(); @@ -181,7 +183,7 @@ SongMetadata *SongMetadataConstructorHook(SongMetadata *thisSongMetadata, DataAr if (thisSongMetadata->mGameOrigin != 0) { char gameOrigin[0x200]; - strcpy(gameOrigin, "/ui/resource/game_origins/gen/"); + strcpy(gameOrigin, "ui/resource/game_origins/gen/"); strcat(gameOrigin, thisSongMetadata->mGameOrigin); #ifdef RB3E_XBOX strcat(gameOrigin, ".png_xbox"); @@ -214,7 +216,7 @@ char SongMetadataLoadHook(SongMetadata *thisSongMetadata, BinStream *stream) if (thisSongMetadata->mGameOrigin != 0) { char gameOrigin[0x200]; - strcpy(gameOrigin, "/ui/resource/game_origins/gen/"); + strcpy(gameOrigin, "ui/resource/game_origins/gen/"); strcat(gameOrigin, thisSongMetadata->mGameOrigin); #ifdef RB3E_XBOX strcat(gameOrigin, ".png_xbox"); diff --git a/source/_functions.c b/source/_functions.c index 9ff8b01..1f85cb5 100644 --- a/source/_functions.c +++ b/source/_functions.c @@ -108,4 +108,6 @@ RB3E_STUB(GameGemDBConstructor) RB3E_STUB(AddMultiGem) RB3E_STUB(GetGameGemList) RB3E_STUB(SongMetadataConstructor) -RB3E_STUB(SongMetadataLoad) \ No newline at end of file +RB3E_STUB(SongMetadataLoad) +RB3E_STUB(SongSortMgrGetSort) +RB3E_STUB(NodeSortGetNode) \ No newline at end of file diff --git a/source/rb3enhanced.c b/source/rb3enhanced.c index 03fb046..8bd63d2 100644 --- a/source/rb3enhanced.c +++ b/source/rb3enhanced.c @@ -329,9 +329,10 @@ void InitialiseFunctions() POKE_B(&RndTexSetBitmap, PORT_RNDTEXSETBITMAP); POKE_B(&RndTexSetBitmap2, PORT_RNDTEXSETBITMAP2); POKE_B(&FilePathConstructor, PORT_FILEPATHCONSTRUCTOR); - POKE_B(&MusicLibraryGetNodeByIndex, PORT_MUSICLIBRARYGETNODEBYINDEX); + POKE_B(&NodeSortGetNode, PORT_NODESORTGETNODE); POKE_B(&vector_push_back, PORT_VECTORPUSHBACK); POKE_B(&GameGemDBConstructor, PORT_GAMEGEMDB_CT); + POKE_B(&SongSortMgrGetSort, PORT_SONGSORTMGRGETSORT); RB3E_MSG("Functions initialized!", NULL); } From 130490b0a2acf4cc8b1f6e5e0bf277182111725a Mon Sep 17 00:00:00 2001 From: InvoxiPlayGames Date: Sun, 25 Feb 2024 19:18:00 +0000 Subject: [PATCH 08/11] check if metadata and gameorigin arent null before doing material lookup --- source/SetlistHooks.c | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/source/SetlistHooks.c b/source/SetlistHooks.c index 71b9ab4..3d15afc 100644 --- a/source/SetlistHooks.c +++ b/source/SetlistHooks.c @@ -116,22 +116,27 @@ RndMat *MusicLibraryMatHook(MusicLibrary *thisMusicLibrary, int data, int idx, U node = NodeSortGetNode(ret, idx); if (node != NULL) { - nodeType = node->vtable->getNodeType(); - if (nodeType == kNodeSong) + // do a basic null check here, sometimes it can be null + if (node->record->metaData != NULL && + node->record->metaData->mGameOrigin != NULL) { - // this shit fucking sucks lol - for (curInfo = 0; curInfo < numGameOrigins; curInfo++) + nodeType = node->vtable->getNodeType(); + if (nodeType == kNodeSong) { - if (strcmp(node->record->metaData->mGameOrigin, originInfo[curInfo].gameOrigin) == 0) + // this shit fucking sucks lol + for (curInfo = 0; curInfo < numGameOrigins; curInfo++) { - if (materials[originInfo[curInfo].num] != NULL) + if (strcmp(node->record->metaData->mGameOrigin, originInfo[curInfo].gameOrigin) == 0) { - RB3E_DEBUG("Returning material for game origin '%s'", originInfo[curInfo].gameOrigin); - return materials[originInfo[curInfo].num]; - } - else - { - RB3E_DEBUG("Material for game origin '%s' is NULL, creation seemingly failed", originInfo[curInfo].gameOrigin); + if (materials[originInfo[curInfo].num] != NULL) + { + RB3E_DEBUG("Returning material for game origin '%s'", originInfo[curInfo].gameOrigin); + return materials[originInfo[curInfo].num]; + } + else + { + RB3E_DEBUG("Material for game origin '%s' is NULL, creation seemingly failed", originInfo[curInfo].gameOrigin); + } } } } From e5fd3b639448e43435a92b3e2bd6be2e933cf2a8 Mon Sep 17 00:00:00 2001 From: ihatecompvir Date: Mon, 26 Feb 2024 15:51:09 -0800 Subject: [PATCH 09/11] Check sort node first before checking song record --- source/SetlistHooks.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/source/SetlistHooks.c b/source/SetlistHooks.c index 3d15afc..b84cf56 100644 --- a/source/SetlistHooks.c +++ b/source/SetlistHooks.c @@ -116,12 +116,15 @@ RndMat *MusicLibraryMatHook(MusicLibrary *thisMusicLibrary, int data, int idx, U node = NodeSortGetNode(ret, idx); if (node != NULL) { - // do a basic null check here, sometimes it can be null - if (node->record->metaData != NULL && - node->record->metaData->mGameOrigin != NULL) + nodeType = node->vtable->getNodeType(); + + // ensure this is actually a song node and not like a function node or etc. + if (nodeType == kNodeSong) { - nodeType = node->vtable->getNodeType(); - if (nodeType == kNodeSong) + // do a basic null check here, sometimes it can be null + if (node->record != NULL && + node->record->metaData != NULL && + node->record->metaData->mGameOrigin != NULL) { // this shit fucking sucks lol for (curInfo = 0; curInfo < numGameOrigins; curInfo++) From 29b98f21cc145cbc705d511940f83eb8ee7de243 Mon Sep 17 00:00:00 2001 From: ihatecompvir Date: Sat, 17 May 2025 12:47:09 -0700 Subject: [PATCH 10/11] Rewrite game origin icon system again --- include/ports.h | 8 +- include/rb3/Rnd/DynamicTex.h | 21 +++++ include/rb3/Rnd/RndMat.h | 1 + include/rb3/Rnd/RndTex.h | 2 +- include/rb3/SongMetadata.h | 7 +- include/rb3/SortNode.h | 2 +- include/rb3_include.h | 1 + source/SetlistHooks.c | 164 +++++++++++------------------------ source/_functions.c | 5 +- source/net_http_server.c | 10 +-- source/rb3enhanced.c | 5 +- 11 files changed, 100 insertions(+), 126 deletions(-) create mode 100644 include/rb3/Rnd/DynamicTex.h diff --git a/include/ports.h b/include/ports.h index dbc57c6..fc03605 100644 --- a/include/ports.h +++ b/include/ports.h @@ -137,6 +137,7 @@ #define PORT_RNDMATNEWOBJECT 0x8240f5d0 // RndMat::NewObject #define PORT_RNDTEXSETBITMAP 0x823ff678 // RndTex::SetBitmap #define PORT_RNDTEXSETBITMAP2 0x823ff240 // RndTex::SetBitmap2 +#define PORT_RNDTEXSETBITMAP3 0x823ff510 // RndTex::SetBitmap3 #define PORT_FILEPATHCONSTRUCTOR 0x82270210 // FilePath::__ct #define PORT_MUSICLIBRARY_CT 0x825451c8 // MusicLibrary::__ct #define PORT_MUSICLIBRARYMAT 0x8253b440 // MusicLibrary::Mat @@ -144,6 +145,8 @@ #define PORT_GAMEGEMDB_CT 0x827931e0 // GameGemDB::__ct #define PORT_ADDMULTIGEM 0x827930d8 // GameGemDB::AddMultiGem #define PORT_SONGSORTMGRGETSORT 0x82595ff8 // SongSortMgr::GetSort +#define PORT_DYNAMICTEX_CT 0x825f2318 // DynamicTex::__ct +#define PORT_RNDMATSETDIFFUSETEX 0x8238b130 // RndMat::SetDiffuseTex // instance addresses #define PORT_MODIFIERMGR_POINTER 0x82dfec08 // pointer to ModifierManager #define PORT_ROCKCENTRALGATEWAY 0x82cc8f60 // address of RockCentralGateway @@ -275,6 +278,7 @@ void DbgPrint(const char *s, ...); #define PORT_RNDMATNEWOBJECT 0x8063996c // RndMat::NewObject #define PORT_RNDTEXSETBITMAP 0x8063fccc // RndTex::SetBitmap #define PORT_RNDTEXSETBITMAP2 0x8063f830 // RndTex::SetBitmap2 +#define PORT_RNDTEXSETBITMAP3 0x8063fb2c // RndTex::SetBitmap3 #define PORT_FILEPATHCONSTRUCTOR 0x8000ec5c // FilePath::__ct #define PORT_MUSICLIBRARY_CT 0x8022d978 // MusicLibrary::__ct #define PORT_MUSICLIBRARYMAT 0x80231c5c // MusicLibrary::Mat @@ -282,7 +286,9 @@ void DbgPrint(const char *s, ...); #define PORT_GAMEGEMDB_CT 0x80460f64 // GameGemDB::__ct #define PORT_ADDMULTIGEM 0x80461160 // GameGemDB::AddMultiGem #define PORT_GETGAMELIST 0x8048553c // SongData::GetGameList -#define PORT_SONGSORTMGRGETSORT 0x802310b8 // SongSortMgr::GetSort +#define PORT_SONGSORTMGRGETSORT 0x80281b20 // SongSortMgr::GetSort +#define PORT_RNDMATSETDIFFUSETEX 0x8025ab90 // RndMat::SetDiffuseTex +#define PORT_DYNAMICTEX_CT 0x80292a70 // DynamicTex::__ct // instance addresses #define PORT_MODIFIERMGR_POINTER 0x808fda68 // pointer to ModifierManager #define PORT_ROCKCENTRALGATEWAY 0x80900870 // address of RockCentralGateway diff --git a/include/rb3/Rnd/DynamicTex.h b/include/rb3/Rnd/DynamicTex.h new file mode 100644 index 0000000..d901b62 --- /dev/null +++ b/include/rb3/Rnd/DynamicTex.h @@ -0,0 +1,21 @@ +#ifndef _DYNAMIC_TEX_H +#define _DYNAMIC_TEX_H + +#include "rb3/String.h" +#include "rb3/Rnd/RndMat.h" + +typedef struct _DynamicTex +{ + int * vtable; // 0x0 + RndTex * mTex; // 0x4 + String mMatName; // 0x8 + RndMat* mMat; // 0x14 + void* mFileLoader; // 0x18 + char unk; // 0x1C +} DynamicTex; + +void DynamicTexConstructor(void* thisDynamicTex, const char * path, const char* matName, char createNewMat, char enableZBuffer); + + + +#endif // _DYNAMIC_TEX_H diff --git a/include/rb3/Rnd/RndMat.h b/include/rb3/Rnd/RndMat.h index 53a9699..d2a0ac9 100644 --- a/include/rb3/Rnd/RndMat.h +++ b/include/rb3/Rnd/RndMat.h @@ -88,5 +88,6 @@ typedef struct _RndMat } RndMat; RndMat *RndMatNewObject(); +RndMat* RndMatSetDiffuseTex(RndMat *thisRndMat, RndTex *tex); #endif // _RNDMAT_H \ No newline at end of file diff --git a/include/rb3/Rnd/RndTex.h b/include/rb3/Rnd/RndTex.h index 4093d5b..ed46a9d 100644 --- a/include/rb3/Rnd/RndTex.h +++ b/include/rb3/Rnd/RndTex.h @@ -46,8 +46,8 @@ typedef struct _ObjPtr_RndTex RndTex *RndTexNewObject(); void RndTexSetBitmap(RndTex *thisRndTex, FilePath *path); void RndTexSetBitmap2(RndTex *thisRndTex, int width, int height, int bpp, int type, int useMips, char *path); +void RndTexSetBitmap3(RndTex *thisRndTex, void* fileLoader); void RndBitmapGenerateMips(RndBitmap *thisBitmap); int RndBitmapNumMips(RndBitmap *thisBitmap); - #endif // _RNDTEX_H \ No newline at end of file diff --git a/include/rb3/SongMetadata.h b/include/rb3/SongMetadata.h index e237681..0e7459a 100644 --- a/include/rb3/SongMetadata.h +++ b/include/rb3/SongMetadata.h @@ -14,11 +14,10 @@ typedef struct _SongMetadata #else char unknown[0x28]; #endif - char *mShortName; + Symbol mShortName; int mSongID; - char mIsOnDisc; - char pad[3]; - char *mGameOrigin; + char unknown2[0x4]; + Symbol mGameOrigin; char unknown3[0x10]; String title; String artist; diff --git a/include/rb3/SortNode.h b/include/rb3/SortNode.h index f7563d3..1b14d71 100644 --- a/include/rb3/SortNode.h +++ b/include/rb3/SortNode.h @@ -47,7 +47,7 @@ typedef struct _SongRecord { int *vtable; #ifdef RB3E_WII - char unknown[0xfc]; + char unknown[0xf8]; #else char unknown[0x104]; #endif diff --git a/include/rb3_include.h b/include/rb3_include.h index ef32eb2..ee2a055 100644 --- a/include/rb3_include.h +++ b/include/rb3_include.h @@ -44,6 +44,7 @@ #include "quazal/QuazalSocket.h" // rnd headers +#include "rb3/Rnd/DynamicTex.h" #include "rb3/Rnd/RndPropAnim.h" #include "rb3/Rnd/RndMat.h" #include "rb3/Rnd/RndTex.h" diff --git a/source/SetlistHooks.c b/source/SetlistHooks.c index b84cf56..b63075d 100644 --- a/source/SetlistHooks.c +++ b/source/SetlistHooks.c @@ -19,91 +19,60 @@ #include "SongSort.h" #include "rb3/SortNode.h" #include "rb3/SongSortMgr.h" +#include "rb3/Rnd/DynamicTex.h" #include "rb3/Rnd/RndMat.h" -#include "rb3/Rnd/RndTex.h" -RndMat *materials[100] = {0}; -RndTex *textures[100] = {0}; +DynamicTex *textures[100] = {0}; -void CreateMaterials(GameOriginInfo *info) +void CreateMaterial(GameOriginInfo *info) { - RB3E_DEBUG("Creating material for game origin '%s'", info->gameOrigin); + // alloc the memory for the dynamic tex + DynamicTex *tex = NULL; + char path[0x200]; - // create our new RndTex and RndMat - textures[info->num] = RndTexNewObject(); - materials[info->num] = RndMatNewObject(); + // TODO: we should identify and hook some function that runs when you leave the song select screen to call DynamicTex's destructor + // it will free the dynamic tex itself, the material it created, and the texture too, so it nicely wraps it all up for you + // this way there is not a chunk of memory permanently dedicated to game origin icons (even if it is not a large amount) + tex = MemAlloc(0x20, 0); - if (textures[info->num] != NULL && materials[info->num] != NULL) - { - int i = 0; - char texPath[1024] = {0}; - FilePath textureFilePath = {0}; - - strcat(texPath, "ui/resource/game_origins/"); - strcat(texPath, info->gameOrigin); - strcat(texPath, ".png"); - FilePathConstructor(&textureFilePath, texPath); - - RndTexSetBitmap(textures[info->num], &textureFilePath); - - materials[info->num]->diffuseTex.tex = textures[info->num]; - - // allow the material to become transparent so alpha channel does not appear black - // not sure if all of this is really necessary - materials[info->num]->blend = kSrcAlpha; - materials[info->num]->preLit = 1; - materials[info->num]->useEnviron = 0; - materials[info->num]->alphaCut = 0; - materials[info->num]->alphaThreshold = 0; - materials[info->num]->intensify = 0; - } -} + // build the ark path (so dont include /gen/ or the _platform extension etc.) + RB3E_DEBUG("Creating dynamic tex for game origin '%s'", info->gameOrigin); + strcpy(path, "ui/resource/game_origins/"); + strcat(path, info->gameOrigin); + strcat(path, ".png"); -void SetSongAndArtistNameHook(BandLabel *label, SortNode *sortNode) -{ - char newLabel[1024] = {0}; - char *originLabel = " "; // default + // create and pray + DynamicTexConstructor(tex, path, info->gameOrigin, 1, 0); - if (config.GameOriginIcons == 1 && strlen(label->string) < 1000) - { - SetSongAndArtistName(label, sortNode); - strcat(newLabel, originLabel); - strcat(newLabel, label->string); - BandLabelSetDisplayText(label, newLabel, 1); - return; - } - SetSongAndArtistName(label, sortNode); - return; -} + textures[info->num] = tex; -void SetSongNameFromNodeHook(BandLabel *label, SortNode *sortNode) -{ - char newLabel[1024] = {0}; - char *originLabel = " "; // default + RB3E_DEBUG("Setting diffuse texture for dynamic tex '%s'", path); + RndTexSetBitmap3(tex->mTex, tex->mFileLoader); - if (config.GameOriginIcons == 1 && strlen(label->string) < 1000) - { - SetSongNameFromNode(label, sortNode); - strcat(newLabel, originLabel); - strcat(newLabel, label->string); - BandLabelSetDisplayText(label, newLabel, 1); - return; - } - SetSongNameFromNode(label, sortNode); - return; + // diffuse tex setter function doesn't exist on 360, so we manually set it, but manually setting it doesn't work on wii and we must use the setter + // TODO: figure out why we can't just set it manually on both, probably a structure inaccuracy or something + #ifdef RB3E_XBOX + tex->mMat->diffuseTex.tex = tex->mTex; + #else + RndMatSetDiffuseTex(tex->mMat, tex->mTex); + #endif + + // print the material name + RB3E_DEBUG("Dynamic tex created at %p with material '%s'", textures[info->num], textures[info->num]->mMatName.buf); + + } int *MusicLibraryConstructorHook(MusicLibrary *thisMusicLibrary, int *songPreview) { - // CreateMaterials(); return MusicLibraryConstructor(thisMusicLibrary, songPreview); } RndMat *MusicLibraryMatHook(MusicLibrary *thisMusicLibrary, int data, int idx, UIListSlot *listSlot) { - if (listSlot != NULL) + if (listSlot != NULL && thisMusicLibrary != NULL) { - if (strcmp(listSlot->mMatchName.buf, "game_origin_picture_slot") == 0) + if (strcmp(listSlot->mMatchName.buf, "game_origin_icon") == 0) { int *ret = 0; SortNode *node = 0; @@ -122,19 +91,19 @@ RndMat *MusicLibraryMatHook(MusicLibrary *thisMusicLibrary, int data, int idx, U if (nodeType == kNodeSong) { // do a basic null check here, sometimes it can be null - if (node->record != NULL && + if (node != NULL && node->record != NULL && node->record->metaData != NULL && - node->record->metaData->mGameOrigin != NULL) + node->record->metaData->mGameOrigin.sym != NULL) { // this shit fucking sucks lol for (curInfo = 0; curInfo < numGameOrigins; curInfo++) { - if (strcmp(node->record->metaData->mGameOrigin, originInfo[curInfo].gameOrigin) == 0) + if (strcmp(node->record->metaData->mGameOrigin.sym, originInfo[curInfo].gameOrigin) == 0) { - if (materials[originInfo[curInfo].num] != NULL) + if (textures[originInfo[curInfo].num] != NULL && textures[originInfo[curInfo].num]->mMat != NULL) { RB3E_DEBUG("Returning material for game origin '%s'", originInfo[curInfo].gameOrigin); - return materials[originInfo[curInfo].num]; + return textures[originInfo[curInfo].num]->mMat; } else { @@ -142,6 +111,8 @@ RndMat *MusicLibraryMatHook(MusicLibrary *thisMusicLibrary, int data, int idx, U } } } + } else { + RB3E_DEBUG("Node record or its metadata is NULL, skipping", NULL); } } } @@ -157,6 +128,8 @@ GameOriginInfo originInfo[100] = {0}; void AddGameOriginToIconList(char *gameOrigin) { + if(gameOrigin != NULL && strcmp(gameOrigin, "") != 0) + { int i = 0; // check that we havent already added 100 game origins @@ -177,9 +150,14 @@ void AddGameOriginToIconList(char *gameOrigin) originInfo[numGameOrigins].gameOrigin = gameOrigin; originInfo[numGameOrigins].num = numGameOrigins; - CreateMaterials(&originInfo[numGameOrigins]); + CreateMaterial(&originInfo[numGameOrigins]); numGameOrigins++; RB3E_DEBUG("Adding game origin '%s' to icon list, total is now %i", gameOrigin, numGameOrigins); + } + else + { + RB3E_DEBUG("Game origin is NULL or empty, not adding to icon list", NULL); + } } // this will be called any time a song is loaded from DTA (on disc or when loading into the cache) @@ -188,27 +166,9 @@ SongMetadata *SongMetadataConstructorHook(SongMetadata *thisSongMetadata, DataAr thisSongMetadata = SongMetadataConstructor(thisSongMetadata, data, backupData, isOnDisc); // make sure the game origin isn't null - if (thisSongMetadata->mGameOrigin != 0) + if (thisSongMetadata->mGameOrigin.sym != 0) { - char gameOrigin[0x200]; - strcpy(gameOrigin, "ui/resource/game_origins/gen/"); - strcat(gameOrigin, thisSongMetadata->mGameOrigin); -#ifdef RB3E_XBOX - strcat(gameOrigin, ".png_xbox"); -#else - strcat(gameOrigin, ".png_wii"); -#endif - - // check the game origin image exists in the ARK - if (FileExists(gameOrigin, kRead) == 0) - { - if (FileExists(gameOrigin, kReadNoArk) == 0) - { - RB3E_DEBUG("Game origin icon at path '%s' for origin '%s' does not exist!", gameOrigin, thisSongMetadata->mGameOrigin); - return thisSongMetadata; - } - } - AddGameOriginToIconList(thisSongMetadata->mGameOrigin); + AddGameOriginToIconList(thisSongMetadata->mGameOrigin.sym); return thisSongMetadata; } @@ -221,27 +181,9 @@ char SongMetadataLoadHook(SongMetadata *thisSongMetadata, BinStream *stream) char ret = SongMetadataLoad(thisSongMetadata, stream); // make sure the game origin isn't null - if (thisSongMetadata->mGameOrigin != 0) + if (thisSongMetadata->mGameOrigin.sym != 0) { - char gameOrigin[0x200]; - strcpy(gameOrigin, "ui/resource/game_origins/gen/"); - strcat(gameOrigin, thisSongMetadata->mGameOrigin); -#ifdef RB3E_XBOX - strcat(gameOrigin, ".png_xbox"); -#else - strcat(gameOrigin, ".png_wii"); -#endif - - // check the game origin image exists in the ARK - if (FileExists(gameOrigin, kRead) == 0) - { - if (FileExists(gameOrigin, kReadNoArk) == 0) - { - RB3E_DEBUG("Game origin icon at path '%s' for origin '%s' does not exist!", gameOrigin, thisSongMetadata->mGameOrigin); - return ret; - } - } - AddGameOriginToIconList(thisSongMetadata->mGameOrigin); + AddGameOriginToIconList(thisSongMetadata->mGameOrigin.sym); return ret; } diff --git a/source/_functions.c b/source/_functions.c index 1f85cb5..036d8d1 100644 --- a/source/_functions.c +++ b/source/_functions.c @@ -110,4 +110,7 @@ RB3E_STUB(GetGameGemList) RB3E_STUB(SongMetadataConstructor) RB3E_STUB(SongMetadataLoad) RB3E_STUB(SongSortMgrGetSort) -RB3E_STUB(NodeSortGetNode) \ No newline at end of file +RB3E_STUB(NodeSortGetNode) +RB3E_STUB(DynamicTexConstructor) +RB3E_STUB(RndMatSetDiffuseTex) +RB3E_STUB(RndTexSetBitmap3) \ No newline at end of file diff --git a/source/net_http_server.c b/source/net_http_server.c index 2c0ed2f..0e9b410 100644 --- a/source/net_http_server.c +++ b/source/net_http_server.c @@ -179,7 +179,7 @@ void HTTP_Server_Accept(void *connection) strcat(response_buffer, "Content-Type: text/plain\r\n"); strcat(response_buffer, "\r\n"); strcat(response_buffer, "shortname="); - strcat(response_buffer, song_metadata->mShortName); + strcat(response_buffer, song_metadata->mShortName.sym); strcat(response_buffer, "\r\n"); strcat(response_buffer, "title="); strcat(response_buffer, song_metadata->title.buf); @@ -191,7 +191,7 @@ void HTTP_Server_Accept(void *connection) strcat(response_buffer, song_metadata->album.buf); strcat(response_buffer, "\r\n"); strcat(response_buffer, "origin="); - strcat(response_buffer, song_metadata->mGameOrigin); + strcat(response_buffer, song_metadata->mGameOrigin.sym); strcat(response_buffer, "\r\n"); strcat(response_buffer, "\r\n"); RB3E_TCP_Send(s, (void *)response_buffer, strlen(response_buffer)); @@ -232,10 +232,10 @@ void HTTP_Server_Accept(void *connection) if (song_metadata != NULL) { strcat(response_buffer, "["); - strcat(response_buffer, song_metadata->mShortName); + strcat(response_buffer, song_metadata->mShortName.sym); strcat(response_buffer, "]\r\n"); strcat(response_buffer, "shortname="); - strcat(response_buffer, song_metadata->mShortName); + strcat(response_buffer, song_metadata->mShortName.sym); strcat(response_buffer, "\r\n"); strcat(response_buffer, "title="); strcat(response_buffer, song_metadata->title.buf); @@ -247,7 +247,7 @@ void HTTP_Server_Accept(void *connection) strcat(response_buffer, song_metadata->album.buf); strcat(response_buffer, "\r\n"); strcat(response_buffer, "origin="); - strcat(response_buffer, song_metadata->mGameOrigin); + strcat(response_buffer, song_metadata->mGameOrigin.sym); strcat(response_buffer, "\r\n"); strcat(response_buffer, "\r\n"); if (strlen(response_buffer) > 1500) diff --git a/source/rb3enhanced.c b/source/rb3enhanced.c index 8bd63d2..c37fa98 100644 --- a/source/rb3enhanced.c +++ b/source/rb3enhanced.c @@ -333,6 +333,9 @@ void InitialiseFunctions() POKE_B(&vector_push_back, PORT_VECTORPUSHBACK); POKE_B(&GameGemDBConstructor, PORT_GAMEGEMDB_CT); POKE_B(&SongSortMgrGetSort, PORT_SONGSORTMGRGETSORT); + POKE_B(&DynamicTexConstructor, PORT_DYNAMICTEX_CT); + POKE_B(&RndMatSetDiffuseTex, PORT_RNDMATSETDIFFUSETEX); + POKE_B(&RndTexSetBitmap3, PORT_RNDTEXSETBITMAP3); RB3E_MSG("Functions initialized!", NULL); } @@ -346,7 +349,6 @@ void ApplyHooks() HookFunction(PORT_LOCALIZE, &Localize, &LocalizeHook); HookFunction(PORT_WILLBENOSTRUM, &WillBeNoStrum, &WillBeNoStrumHook); HookFunction(PORT_ADDGAMEGEM, &AddGameGem, &AddGameGemHook); - HookFunction(PORT_SETSONGANDARTISTNAME, &SetSongAndArtistName, SetSongAndArtistNameHook); HookFunction(PORT_SETVENUE, &SetVenue, &SetVenueHook); HookFunction(PORT_MODIFIERMGR_CT, &ModifierManagerConstructor, &ModifierManagerConstructorHook); HookFunction(PORT_NEWFILE, &NewFile, &NewFileHook); @@ -369,7 +371,6 @@ void ApplyHooks() HookFunction(PORT_UPDATEPRESENCE, &UpdatePresence, &UpdatePresenceHook); HookFunction(PORT_MUSICLIBRARY_CT, &MusicLibraryConstructor, &MusicLibraryConstructorHook); HookFunction(PORT_MUSICLIBRARYMAT, &MusicLibraryMat, &MusicLibraryMatHook); - HookFunction(PORT_SETSONGNAMEFROMNODE, &SetSongNameFromNode, &SetSongNameFromNodeHook); #ifdef RB3E_WII // wii exclusive hooks HookFunction(PORT_USBWIIGETTYPE, &UsbWiiGetType, &UsbWiiGetTypeHook); HookFunction(PORT_WIINETINIT_DNSLOOKUP, &StartDNSLookup, &StartDNSLookupHook); From 19f274f869fbf0839552c56e7b24d789ea8f5de4 Mon Sep 17 00:00:00 2001 From: ihatecompvir Date: Fri, 26 Sep 2025 21:29:45 -0700 Subject: [PATCH 11/11] Memory management improvements --- include/SetlistHooks.h | 1 + include/ports.h | 6 +++ include/rb3/MusicLibrary.h | 4 ++ include/rb3/Rnd/DynamicTex.h | 3 +- source/SetlistHooks.c | 72 +++++++++++++++++++++++++++++++++++- source/_functions.c | 3 ++ source/rb3enhanced.c | 3 ++ 7 files changed, 90 insertions(+), 2 deletions(-) diff --git a/include/SetlistHooks.h b/include/SetlistHooks.h index a29606e..98dc84b 100644 --- a/include/SetlistHooks.h +++ b/include/SetlistHooks.h @@ -7,6 +7,7 @@ #include "rb3/BandLabel.h" #include "rb3/SortNode.h" #include "rb3/Rnd/RndMat.h" +#include "rb3/Mem.h" void SetSongAndArtistNameHook(BandLabel *label, SortNode *sortNode); void SetSongNameFromNodeHook(BandLabel *label, SortNode *sortNode); diff --git a/include/ports.h b/include/ports.h index fc03605..0cb397d 100644 --- a/include/ports.h +++ b/include/ports.h @@ -146,7 +146,10 @@ #define PORT_ADDMULTIGEM 0x827930d8 // GameGemDB::AddMultiGem #define PORT_SONGSORTMGRGETSORT 0x82595ff8 // SongSortMgr::GetSort #define PORT_DYNAMICTEX_CT 0x825f2318 // DynamicTex::__ct +#define PORT_DYNAMICTEX_DT 0x825f2210 // DynamicTex::__dt #define PORT_RNDMATSETDIFFUSETEX 0x8238b130 // RndMat::SetDiffuseTex +#define PORT_MUSICLIBRARYONENTER 0x82542238 // MusicLibrary::OnEnter +#define PORT_MUSICLIBRARYONUNLOAD 0x82540450 // MusicLibrary::OnExit // instance addresses #define PORT_MODIFIERMGR_POINTER 0x82dfec08 // pointer to ModifierManager #define PORT_ROCKCENTRALGATEWAY 0x82cc8f60 // address of RockCentralGateway @@ -289,6 +292,9 @@ void DbgPrint(const char *s, ...); #define PORT_SONGSORTMGRGETSORT 0x80281b20 // SongSortMgr::GetSort #define PORT_RNDMATSETDIFFUSETEX 0x8025ab90 // RndMat::SetDiffuseTex #define PORT_DYNAMICTEX_CT 0x80292a70 // DynamicTex::__ct +#define PORT_DYNAMICTEX_DT 0x80292bcc // DynamicTex::__dt +#define PORT_MUSICLIBRARYONENTER 0x8022dd24 // MusicLibrary::OnEnter +#define PORT_MUSICLIBRARYONUNLOAD 0x8022e87c // MusicLibrary::OnExit // instance addresses #define PORT_MODIFIERMGR_POINTER 0x808fda68 // pointer to ModifierManager #define PORT_ROCKCENTRALGATEWAY 0x80900870 // address of RockCentralGateway diff --git a/include/rb3/MusicLibrary.h b/include/rb3/MusicLibrary.h index 4f50f47..de9a9df 100644 --- a/include/rb3/MusicLibrary.h +++ b/include/rb3/MusicLibrary.h @@ -17,5 +17,9 @@ typedef struct _MusicLibrary void MusicLibrarySelect(int theMusicLibrary, Symbol entryName, int sortType, int unk_r6); int *MusicLibraryConstructor(int *thisMusicLibrary, int *songPreview); int *MusicLibraryConstructorHook(MusicLibrary *thisMusicLibrary, int *songPreview); +void MusicLibraryOnEnter(void* thisMusicLibrary); +void MusicLibraryOnUnload(void* thisMusicLibrary); +void MusicLibraryOnEnterHook(void* thisMusicLibrary); +void MusicLibraryOnUnloadHook(void* thisMusicLibrary); #endif // _MUSICLIBRARY_H_ diff --git a/include/rb3/Rnd/DynamicTex.h b/include/rb3/Rnd/DynamicTex.h index d901b62..352057c 100644 --- a/include/rb3/Rnd/DynamicTex.h +++ b/include/rb3/Rnd/DynamicTex.h @@ -14,7 +14,8 @@ typedef struct _DynamicTex char unk; // 0x1C } DynamicTex; -void DynamicTexConstructor(void* thisDynamicTex, const char * path, const char* matName, char createNewMat, char enableZBuffer); +void DynamicTexConstructor(DynamicTex* thisDynamicTex, const char * path, const char* matName, char createNewMat, char enableZBuffer); +void DynamicTexDestructor(DynamicTex* thisDynamicTex, int unk); diff --git a/source/SetlistHooks.c b/source/SetlistHooks.c index b63075d..4e03c56 100644 --- a/source/SetlistHooks.c +++ b/source/SetlistHooks.c @@ -34,6 +34,10 @@ void CreateMaterial(GameOriginInfo *info) // it will free the dynamic tex itself, the material it created, and the texture too, so it nicely wraps it all up for you // this way there is not a chunk of memory permanently dedicated to game origin icons (even if it is not a large amount) tex = MemAlloc(0x20, 0); + if (tex == NULL) { + RB3E_DEBUG("MemAlloc failed for dynamic tex '%s'", info->gameOrigin); + return; + } // build the ark path (so dont include /gen/ or the _platform extension etc.) RB3E_DEBUG("Creating dynamic tex for game origin '%s'", info->gameOrigin); @@ -43,6 +47,13 @@ void CreateMaterial(GameOriginInfo *info) // create and pray DynamicTexConstructor(tex, path, info->gameOrigin, 1, 0); + if (tex->mMat == NULL || tex->mTex == NULL) { + RB3E_DEBUG("DynamicTex::__ct failed for dynamic tex '%s'", path); + + // we should prob do cleanup here but that is a + // TODO + return; + } textures[info->num] = tex; @@ -60,6 +71,8 @@ void CreateMaterial(GameOriginInfo *info) // print the material name RB3E_DEBUG("Dynamic tex created at %p with material '%s'", textures[info->num], textures[info->num]->mMatName.buf); + RB3E_DEBUG("Dynamic tex created at %p with mat %p tex %p fileloader %p", tex, tex->mMat, tex->mTex, tex->mFileLoader); + } @@ -123,6 +136,64 @@ RndMat *MusicLibraryMatHook(MusicLibrary *thisMusicLibrary, int data, int idx, U return MusicLibraryMat(thisMusicLibrary, data, idx, listSlot); } +// called when entering the music library +// allocate the memory and load the textures here +void MusicLibraryOnEnterHook(void *thisMusicLibrary) +{ + int i; + + // allocate and create the materials for any game origins we found while loading songs + for (i = 0; i < numGameOrigins; i++) { + int slot = originInfo[i].num; + if (slot >= 0 && slot < 100) { + if (textures[slot] == NULL) { + CreateMaterial(&originInfo[i]); + } + } + } + + // do the original logic + MusicLibraryOnEnter(thisMusicLibrary); +} + +// called when the music library panel is unloaded +void MusicLibraryOnUnloadHook(void *thisMusicLibrary) +{ + int i; + + MusicLibraryOnUnload(thisMusicLibrary); + + // call the dynamictex destructor for any textures we created + // lets just sweep all 100 to be safe + for (i = 0; i < 100; i++) { + if (textures[i] != NULL) { + // we can't call the DynamicTexDestructor because the FileLoader it used has already been freed by this point, so we must destruct everything but the FileLoader + // extremely nasty but it seems to work + if(textures[i]->mMat != NULL) { + ((Object *)textures[i]->mMat)->table->destructor((Object *)textures[i]->mMat); + textures[i]->mMat = NULL; + } + if(textures[i]->mTex != NULL) { + ((Object *)textures[i]->mTex)->table->destructor((Object *)textures[i]->mTex); + textures[i]->mTex = NULL; + } + // TODO: set up a proper vtable for String instead of doign this shit + if(textures[i]->mMatName.length != 0) { + if(textures[i]->mMatName.vtable != NULL) { + #ifdef RB3E_WII + ((void (*)(String *))textures[i]->mMatName.vtable[2])(&textures[i]->mMatName); + #else + ((void (*)(String *))textures[i]->mMatName.vtable[0])(&textures[i]->mMatName); + #endif + } + } + textures[i] = NULL; + } + } + + RB3E_DEBUG("Freed game origin icon textures", NULL); +} + int numGameOrigins; GameOriginInfo originInfo[100] = {0}; @@ -150,7 +221,6 @@ void AddGameOriginToIconList(char *gameOrigin) originInfo[numGameOrigins].gameOrigin = gameOrigin; originInfo[numGameOrigins].num = numGameOrigins; - CreateMaterial(&originInfo[numGameOrigins]); numGameOrigins++; RB3E_DEBUG("Adding game origin '%s' to icon list, total is now %i", gameOrigin, numGameOrigins); } diff --git a/source/_functions.c b/source/_functions.c index 036d8d1..9f3d012 100644 --- a/source/_functions.c +++ b/source/_functions.c @@ -98,6 +98,8 @@ RB3E_STUB(RndTexSetBitmap) RB3E_STUB(RndTexSetBitmap2) RB3E_STUB(FilePathConstructor) RB3E_STUB(MusicLibraryMat) +RB3E_STUB(MusicLibraryOnEnter) +RB3E_STUB(MusicLibraryOnUnload) RB3E_STUB(RndCreateDefaultTexture) RB3E_STUB(MusicLibraryConstructor) RB3E_STUB(MusicLibraryGetNodeByIndex) @@ -112,5 +114,6 @@ RB3E_STUB(SongMetadataLoad) RB3E_STUB(SongSortMgrGetSort) RB3E_STUB(NodeSortGetNode) RB3E_STUB(DynamicTexConstructor) +RB3E_STUB(DynamicTexDestructor) RB3E_STUB(RndMatSetDiffuseTex) RB3E_STUB(RndTexSetBitmap3) \ No newline at end of file diff --git a/source/rb3enhanced.c b/source/rb3enhanced.c index c37fa98..2e521bf 100644 --- a/source/rb3enhanced.c +++ b/source/rb3enhanced.c @@ -334,6 +334,7 @@ void InitialiseFunctions() POKE_B(&GameGemDBConstructor, PORT_GAMEGEMDB_CT); POKE_B(&SongSortMgrGetSort, PORT_SONGSORTMGRGETSORT); POKE_B(&DynamicTexConstructor, PORT_DYNAMICTEX_CT); + POKE_B(&DynamicTexDestructor, PORT_DYNAMICTEX_DT); POKE_B(&RndMatSetDiffuseTex, PORT_RNDMATSETDIFFUSETEX); POKE_B(&RndTexSetBitmap3, PORT_RNDTEXSETBITMAP3); RB3E_MSG("Functions initialized!", NULL); @@ -371,6 +372,8 @@ void ApplyHooks() HookFunction(PORT_UPDATEPRESENCE, &UpdatePresence, &UpdatePresenceHook); HookFunction(PORT_MUSICLIBRARY_CT, &MusicLibraryConstructor, &MusicLibraryConstructorHook); HookFunction(PORT_MUSICLIBRARYMAT, &MusicLibraryMat, &MusicLibraryMatHook); + HookFunction(PORT_MUSICLIBRARYONENTER, &MusicLibraryOnEnter, &MusicLibraryOnEnterHook); + HookFunction(PORT_MUSICLIBRARYONUNLOAD, &MusicLibraryOnUnload, &MusicLibraryOnUnloadHook); #ifdef RB3E_WII // wii exclusive hooks HookFunction(PORT_USBWIIGETTYPE, &UsbWiiGetType, &UsbWiiGetTypeHook); HookFunction(PORT_WIINETINIT_DNSLOOKUP, &StartDNSLookup, &StartDNSLookupHook);