diff --git a/assets/rawfiles/xbox/ui/resource/list/gen/list_song_select_browser.milo_xbox b/assets/rawfiles/xbox/ui/resource/list/gen/list_song_select_browser.milo_xbox new file mode 100644 index 0000000..3630e0b Binary files /dev/null and b/assets/rawfiles/xbox/ui/resource/list/gen/list_song_select_browser.milo_xbox differ 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/GemHooks.h b/include/GemHooks.h index c498e88..d42203c 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 AddGameGemHook(int *gameGemList, GameGem *gem, NoStrumState gemType); +int *GetWidgetByNameHook(int *gemManager, Symbol name); +int AddGameGemHook(GameGemList *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/MiloSceneHooks.h b/include/MiloSceneHooks.h index 706675e..cbc6ebd 100644 --- a/include/MiloSceneHooks.h +++ b/include/MiloSceneHooks.h @@ -6,6 +6,7 @@ #include "rb3/BinStream.h" #include "rb3/DirLoader.h" #include "rb3/Object.h" +#include "rb3/Rnd/Transform.h" #include "rb3/Vector.h" #include "rb3/String.h" 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/SetlistHooks.h b/include/SetlistHooks.h index 51d1e34..5bd5e00 100644 --- a/include/SetlistHooks.h +++ b/include/SetlistHooks.h @@ -3,8 +3,14 @@ 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" +#include "rb3/Mem.h" 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); \ No newline at end of file diff --git a/include/ports_wii.h b/include/ports_wii.h index 420eacf..a5c1c6f 100644 --- a/include/ports_wii.h +++ b/include/ports_wii.h @@ -31,6 +31,7 @@ #define PORT_UPDATEPRESENCEBLOCK_B 0x80188194 // branch after the failure case in a function that calls UpdatePresence #define PORT_MULTIPLAYER_CRASH 0x80018a78 // branch to a function that can crash in online multiplayer #define PORT_MULTIPLAYER_FIX 0x806ec0e8 // the function that doesn't crash +#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 @@ -45,6 +46,7 @@ #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 @@ -54,6 +56,7 @@ #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 @@ -67,6 +70,7 @@ #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_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 @@ -75,6 +79,7 @@ #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_OVERSHELLPARTSELECTPROVIDERRELOAD 0x802478a8 // OvershellPartSelectProvider::Reload #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) @@ -95,8 +100,28 @@ #define PORT_METAMUSICPOLL 0x80678d20 // MetaMusic::Poll #define PORT_METAMUSICSTART 0x80678fa4 // MetaMusic::Start #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 +#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 +#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 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 #define PORT_BINSTREAMWRITE 0x80342f48 // BinStream::Write #define PORT_BINSTREAMREAD 0x80342e7c // BinStream::Read #define PORT_BINSTREAMREADENDIAN 0x803430bc // BinStream::ReadEndian diff --git a/include/ports_wii_bank8.h b/include/ports_wii_bank8.h index 240b3a0..31f646c 100644 --- a/include/ports_wii_bank8.h +++ b/include/ports_wii_bank8.h @@ -31,6 +31,8 @@ // #define PORT_MICCHECK 0x8024a4e8 // NOT NEEDED? a bne that throws an error on the song select screen if the mic is not connected #define PORT_BIGSYMBOLFUNC_TAIL 0x804d3bac // blr after a function that initialises a bunch of symbols #define PORT_UPDATEPRESENCEBLOCK_B 0x8021cbd0 // branch after the failure case in a function that calls UpdatePresence +// FIX ME INLINED? #define PORT_ADDTRACKVECTOR_BL 0x8064e288 // bl to vector_push_back inside of SongData::AddTrack // actually SongDB::AddTrack +#define PORT_GETGAMELIST 0x801dbfa0 // SongData::GetGameList // actually SongDB::GetGems #define PORT_MULTIPLAYER_CRASH 0x80023fec // branch to a function that can crash in online multiplayer #define PORT_MULTIPLAYER_FIX 0x80a2f0c4 // the function that doesn't crash // #define PORT_LOADOBJS_BCTRL 0x827562e4 @@ -47,6 +49,7 @@ #define PORT_EXECUTEDTA 0x803edbd0 // RockCentralGateway::ExecuteConfig #define PORT_BANDLABELSETDISPLAYTEXT 0x80518360 // BandLabel::SetDisplayText #define PORT_SETSONGANDARTISTNAME 0x80254650 // BandLabel::SetSongAndArtistName +#define PORT_SETSONGNAMEFROMNODE 0x80253ec0 // BandLabel::SetSongNameFromNode #define PORT_KEYSONGUITAR 0x8031c1b0 // OvershellPanel::CanGuitarPlayKeys // #define PORT_HMXFACTORYFUNCAT 0x8031b2f8 // FIXME HmxObjectFactoryFunc::_at - inlined in bank8? #define PORT_WILLBENOSTRUM 0x8062b2d0 // GameGemList::WillBeNoStrum @@ -56,6 +59,7 @@ #define PORT_GETWIDGETBYNAME 0x80135f30 // GemManager::GetWidgetByName #define PORT_DATANODEEVALUATE 0x8045e030 // DataNode::Evaluate #define PORT_GETSLOTCOLOR 0x801484d0 // TrackConfig::GetSlotColor +// FIX ME INLINED? #define PORT_ADDSMASHERPLATETOVECTOR 0x80bf0828 // AddSmasherPlateToVector #define PORT_USBWIIGETTYPE 0x809fd840 // UsbWii::GetType #define PORT_FILE_EXISTS 0x804207c0 // FileExists #define PORT_QUEUEMESSAGE 0x80333140 // PassiveMessagesPanel::QueueMessage @@ -69,6 +73,7 @@ // #define PORT_BUILDINSTRUMENTSELECTION 0x802478a8 // FIXME BuildInstrumentSelectionList(?) - actual name not known // #define PORT_PREPARESOMEVECTORMAYBE 0x80247c58 // FIXME Prepares some vector, used by BuildInstrumentSelectionList // #define PORT_SOMEVECTORPUSHBACKMAYBE 0x802484a8 // FIXME vector,class_stlpmtx_std::StlNodeAlloc_>_>::push_back +// FIX ME (?) #define PORT_VECTORPUSHBACK 0x801dced0 // vector_push_back #define PORT_POSTPROC_DOPOST 0x809ef2d0 // WiiPostProc::DoPost #define PORT_MUSICLIBRARYSELECTMAYBE 0x802ff140 // UNSURE MusicLibrary::TryToSetHighlight, Selects an entry in the Music Library screen - actual name not known #define PORT_GETSYMBOLBYGAMEORIGIN 0x80374910 // RecentCmp::RecentTypeToOrigin @@ -77,6 +82,7 @@ #define PORT_FILESTREAM_CT 0x80494fd0 // FileStream::__ct (the one that takes a char * path instead of a File object) #define PORT_CHUNKSTREAM_CT 0x804929a0 // ChunkStream::__ct #define PORT_GETBANDUSERFROMSLOT 0x80168010 // BandUserMgr::GetUserFromSlot +#define PORT_OVERSHELLPARTSELECTPROVIDERRELOAD 0x80322620 // OvershellPartSelectProvider::Reload #define PORT_GETBANDUSERS 0x801683e0 // BandUserMgr::GetBandUsers #define PORT_GETSONGSHORTNAME 0x802f5dd0 // MetaPerformer::GetSongSymbol #define PORT_GETMETADATA 0x80271de0 // BandSongMgr::Data (function renamed from the original name to avoid any confusion with Data.h) @@ -97,8 +103,27 @@ #define PORT_METAMUSICPOLL 0x80997610 // MetaMusic::Poll #define PORT_METAMUSICSTART 0x80997990 // MetaMusic::Start #define PORT_INITSONGMETADATA 0x8075a0c0 // InitSongMetadata +#define PORT_SONGMETADATACONSTRUCTOR 0x8075a1a0 // SongMetadata::__ct +#define PORT_SONGMETADATALOAD 0x8075a910 // SongMetadata::Load #define PORT_UPDATEPRESENCE 0x8021c3d0 // PresenceMgr::UpdatePresence #define PORT_STEPSEQUENCEJOBSETSTEP 0x80035cf0 // Quazal::StepSequenceJob::SetStep +#define PORT_RNDTEXNEWOBJECT 0x80931050 // RndTex::NewObject +#define PORT_RNDMATNEWOBJECT 0x80931010 // RndMat::NewObject +#define PORT_RNDTEXSETBITMAP 0x8093b810 // RndTex::SetBitmap +#define PORT_RNDTEXSETBITMAP2 0x8093b430 // RndTex::SetBitmap2 +#define PORT_RNDTEXSETBITMAP3 0x8093b5b0 // RndTex::SetBitmap3 +#define PORT_FILEPATHCONSTRUCTOR 0x80462460 // FilePath::__ct +#define PORT_MUSICLIBRARY_CT 0x802f9e10 // MusicLibrary::__ct +#define PORT_MUSICLIBRARYMAT 0x80300390 // MusicLibrary::Mat +#define PORT_NODESORTGETNODE 0x8036f5e0 // MusicLibrary::GetNodeByIndex //actually NodeSort::GetNode +#define PORT_GAMEGEMDB_CT 0x80628230 // GameGemDB::__ct +#define PORT_ADDMULTIGEM 0x806284e0 // GameGemDB::AddMultiGem +#define PORT_SONGSORTMGRGETSORT 0x8037a510 // SongSortMgr::GetSort +#define PORT_DYNAMICTEX_CT 0x80393bd0 // DynamicTex::__ct +#define PORT_DYNAMICTEX_DT 0x80393ef0 // DynamicTex::__dt +#define PORT_MUSICLIBRARYONENTER 0x802fa750 // MusicLibrary::OnEnter +#define PORT_MUSICLIBRARYONUNLOAD 0x802fb2a0 // MusicLibrary::OnExit +#define PORT_RNDMATSETDIFFUSETEX 0x808d36b0 // RndMat::SetDiffuseTex #define PORT_BINSTREAMWRITE 0x804892b0 // BinStream::Write #define PORT_BINSTREAMREAD 0x80489140 // BinStream::Read #define PORT_BINSTREAMREADENDIAN 0x804894f0 // BinStream::ReadEndian diff --git a/include/ports_xbox360.h b/include/ports_xbox360.h index 219a4de..2d55bbe 100644 --- a/include/ports_xbox360.h +++ b/include/ports_xbox360.h @@ -51,6 +51,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 #define PORT_VERTEX_READ_1 0x82418704 // call to Vector3::operator>> to read vertex position #define PORT_VERTEX_READ_2 0x82418748 // call to Vector3::operator>> to read vertex normals #define PORT_BANDCHARDESC_MAKEOUTFITPATH 0x82335220 // BandCharDesc::MakeOutfitPath @@ -94,6 +96,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 @@ -110,6 +113,7 @@ #define PORT_GAME_CT 0x8267bf30 // Game::__ct #define PORT_GAME_DT 0x8267b1f0 // Game::__dt #define PORT_GAMEGETACTIVEPLAYER 0x82678e88 // Game::GetActivePlayer +#define PORT_OVERSHELLPARTSELECTPROVIDERRELOAD 0x82668c70 // OvershellPartSelectProvider::Reload #define PORT_GETBANDUSERS 0x82683b78 // BandUserMgr::GetBandUsers #define PORT_GETBANDUSERFROMSLOT 0x82682b60 // BandUserMgr::GetBandUserFromSlot #define PORT_GETSONGID 0x827a87f0 // GetSongID, function used when adding songs to BandSongMgr @@ -117,6 +121,7 @@ #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_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 @@ -142,8 +147,27 @@ #define PORT_METAMUSICPOLL 0x82711438 // MetaMusic::Poll #define PORT_METAMUSICSTART 0x82711a00 // MetaMusic::Start #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 +#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 +#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 +#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 #define PORT_BINSTREAMWRITE 0x827c4f58 // BinStream::Write #define PORT_BINSTREAMREAD 0x827c4ea8 // BinStream::Read #define PORT_BINSTREAMREADENDIAN 0x827c5058 // BinStream::ReadEndian 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 2c76a7e..5409ce1 100644 --- a/include/rb3/BandLabel.h +++ b/include/rb3/BandLabel.h @@ -16,6 +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 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/BandUser.h b/include/rb3/BandUser.h index e311d8c..b3c7720 100644 --- a/include/rb3/BandUser.h +++ b/include/rb3/BandUser.h @@ -1,48 +1,103 @@ #ifndef _BANDUSER_H #define _BANDUSER_H +#include "rb3/String.h" +#include "rb3/Symbol.h" +#include "rb3/Track.h" + 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 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; + char mUnknown; + char pad[3]; TrackType trackType; ControllerType controllerType; - int unknown_0x14; - int unknown_0x18; - int unknown_0x1c; - int unknown_0x20; + 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/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 bef967a..4b90d2e 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..a40a79c 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, int fileType, int chunkSize, char compress, Platform platform, char cached); #endif // _CHUNKSTREAM_H \ No newline at end of file diff --git a/include/rb3/Data.h b/include/rb3/Data.h index 52b36b9..946c59d 100644 --- a/include/rb3/Data.h +++ b/include/rb3/Data.h @@ -63,7 +63,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/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/FileStream.h b/include/rb3/FileStream.h index eb46211..d159cc2 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 diff --git a/include/rb3/GameGem.h b/include/rb3/GameGem.h index f8af40c..996491d 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 { @@ -13,6 +14,7 @@ typedef struct _GameGem unsigned char unkBitfield1; unsigned char unkBitfield2; unsigned char unkBitfield3; + char unk1 : 1; char unk2 : 1; char unk3 : 1; @@ -24,18 +26,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 +47,39 @@ 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; + 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); +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/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/MusicLibrary.h b/include/rb3/MusicLibrary.h index ac6d99c..a58cfa7 100644 --- a/include/rb3/MusicLibrary.h +++ b/include/rb3/MusicLibrary.h @@ -3,7 +3,23 @@ #include "Symbol.h" +typedef struct _MusicLibrary +{ +#ifdef RB3E_XBOX + char unk[0xfc]; +#else + char unk[0xdc]; +#endif + int mSortType; +} 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 *songPreview); +int *MusicLibraryConstructorHook(int *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/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/Object.h b/include/rb3/Object.h index 99e5a28..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; @@ -14,18 +21,18 @@ 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); +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 { @@ -77,6 +84,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/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/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/Rnd/DynamicTex.h b/include/rb3/Rnd/DynamicTex.h new file mode 100644 index 0000000..352057c --- /dev/null +++ b/include/rb3/Rnd/DynamicTex.h @@ -0,0 +1,22 @@ +#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(DynamicTex* thisDynamicTex, const char * path, const char* matName, char createNewMat, char enableZBuffer); +void DynamicTexDestructor(DynamicTex* thisDynamicTex, int unk); + + + +#endif // _DYNAMIC_TEX_H 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/RndMat.h b/include/rb3/Rnd/RndMat.h new file mode 100644 index 0000000..d2a0ac9 --- /dev/null +++ b/include/rb3/Rnd/RndMat.h @@ -0,0 +1,93 @@ +#ifndef _RNDMAT_H +#define _RNDMAT_H + +#include "rb3/Rnd/RndTex.h" +#include "rb3/Rnd/Transform.h" +#include "rb3/Object.h" + +typedef struct _Color +{ + float r; + float g; + float b; + float a; +} Color; + +typedef enum _BlendMode +{ + 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; + ZMode zMode; + StencilMode stencilMode; + TexGen texGen; + TexWrap texWrap; + Transform texXfm; + 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(); +RndMat* RndMatSetDiffuseTex(RndMat *thisRndMat, RndTex *tex); + +#endif // _RNDMAT_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/Rnd/RndTex.h b/include/rb3/Rnd/RndTex.h new file mode 100644 index 0000000..ed46a9d --- /dev/null +++ b/include/rb3/Rnd/RndTex.h @@ -0,0 +1,53 @@ +#ifndef _RNDTEX_H +#define _RNDTEX_H + +#include "rb3/FilePath.h" +#include "rb3/Object.h" +#include "rb3/String.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 *fileLoader; + 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 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/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/SongMetadata.h b/include/rb3/SongMetadata.h index 9cfa48a..d3ae181 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" #include "Symbol.h" @@ -33,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/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/SortNode.h b/include/rb3/SortNode.h index 0a5a0db..73ed37f 100644 --- a/include/rb3/SortNode.h +++ b/include/rb3/SortNode.h @@ -1,8 +1,26 @@ #ifndef _SORTNODE_H #define _SORTNODE_H +#include "Object.h" +#include "Symbol.h" #include "SongMetadata.h" +typedef struct _SortNode SortNode; +typedef struct _ShortcutNodeVtable ShortcutNodeVtable; +typedef struct _SongRecord SongRecord; + +typedef enum _SongNodeType +{ + kNodeNone = 0, + kNodeShortcut = 1, + kNodeHeader = 2, + kNodeSubheader = 3, + kNodeSong = 4, + kNodeFunction = 5, + kNodeSetlist = 6, + kNodeStoreSong = 7 +} SongNodeType; + typedef struct _Unknown2 { #ifdef RB3E_WII @@ -13,14 +31,50 @@ typedef struct _Unknown2 SongMetadata *metaData; } Unknown2; -typedef struct _SortNode +struct _SortNode { + ShortcutNodeVtable *vtable; #ifdef RB3E_WII - char something[0x34]; + char something[0x30]; #else - char something[0x40]; + char something[0x3c]; #endif - Unknown2 *somethingElse; -} SortNode; + SongRecord *record; +}; + +typedef int (*ReturnsZero_t)(); +typedef void (*OnlyReturns_t)(); +typedef SongNodeType (*GetNodeType_t)(); +typedef Symbol (*GetToken_t)(); +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 _ShortcutNodeVtable +{ + Object_vtable objectVtable; + GetNodeType_t getNodeType; + GetToken_t getToken; + 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 + +} ShortcutNodeVtable; + +typedef struct _SongRecord +{ + int *vtable; +#ifdef RB3E_WII + char unknown[0xf8]; +#else + char unknown[0x104]; +#endif + SongMetadata *metaData; +} SongRecord; #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/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/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/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 new file mode 100644 index 0000000..5a0fdd9 --- /dev/null +++ b/include/rb3/UI/UIListSlot.h @@ -0,0 +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 +{ + 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/Vector.h b/include/rb3/Vector.h index 4d778fd..8dce691 100644 --- a/include/rb3/Vector.h +++ b/include/rb3/Vector.h @@ -1,25 +1,23 @@ #ifndef _VECTOR_H #define _VECTOR_H -typedef struct _Vector2 +// basic vector type +// used constantly across the code +// in C++ it would be used like vector or etc. +typedef struct _vector { - float x; - float y; -} Vector2; + // 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; -typedef struct _Vector3 -{ - float x; - float y; - float z; -} Vector3; - -typedef struct _Vector4 -{ - float x; - float y; - float z; - float w; -} Vector4; +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 444721a..c66ebb1 100644 --- a/include/rb3_include.h +++ b/include/rb3_include.h @@ -15,15 +15,18 @@ #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" +#include "rb3/GemTrackResrcManager.h" #include "rb3/Joypad.h" #include "rb3/Locale.h" #include "rb3/Mem.h" #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 +35,7 @@ #include "rb3/SongMetadata.h" #include "rb3/SongParser.h" #include "rb3/SongSortByRecentEntry.h" +#include "rb3/SongSortMgr.h" #include "rb3/SortNode.h" #include "rb3/String.h" #include "rb3/Symbol.h" @@ -43,7 +47,10 @@ #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" // UI headers #include "rb3/UI/UIPanel.h" diff --git a/source/GemHooks.c b/source/GemHooks.c index d2cf90e..f8f08ba 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); @@ -120,7 +120,7 @@ void shuffleColors(GameGem *gem) gem->orange = colors[4]; } -int AddGameGemHook(void *gameGemList, GameGem *gem, NoStrumState gemType) +int AddGameGemHook(GameGemList *gameGemList, GameGem *gem, NoStrumState gemType) { Modifier *mirrorModeModifier; Modifier *gemShuffleModifier; diff --git a/source/LocaleHooks.c b/source/LocaleHooks.c index 8b3c3ca..e610ec8 100644 --- a/source/LocaleHooks.c +++ b/source/LocaleHooks.c @@ -73,9 +73,12 @@ char *LocalizeHook(int thisLocale, Symbol sym, int fail) char newLocaleName[0x50]; Symbol newLocale; char *original; + + // No longer needed with origin rewrite // 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) - return "%s %s"; + //if (config.GameOriginIcons == 1 && sym.sym != NULL && strcmp(sym.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) { diff --git a/source/MiloSceneHooks.c b/source/MiloSceneHooks.c index ac18ee3..285d158 100644 --- a/source/MiloSceneHooks.c +++ b/source/MiloSceneHooks.c @@ -339,7 +339,7 @@ void* DirLoaderLoadObjsHook(String * filePath, int unk, int unk2) SymbolConstruct(&newPrefab->outfit.parts[0].mName, prefabNameStr); // set the name and add to the directory - rawObject->table->setName(rawObject, prefabNameSym, prefabDir); + rawObject->table->setName(rawObject, prefabNameSym.sym, prefabDir); } // free the file list since we don't need it anymore diff --git a/source/OvershellHooks.c b/source/OvershellHooks.c index 02f2fad..e2363b4 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; } -} +} \ 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 efd4347..c55c378 100644 --- a/source/SetlistHooks.c +++ b/source/SetlistHooks.c @@ -5,84 +5,259 @@ #include #include +#include #include #include "config.h" #include "ports.h" +#include "GameOriginInfo.h" #include "rb3/BandLabel.h" +#include "rb3/File.h" +#include "rb3/FilePath.h" +#include "rb3/Mem.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/DynamicTex.h" +#include "rb3/Rnd/RndMat.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]); - -void SetSongAndArtistNameHook(BandLabel *label, SortNode *sortNode) +DynamicTex *textures[100] = {0}; + +void CreateMaterial(GameOriginInfo *info) { - char newLabel[1024] = {0}; - char *originLabel = "0 "; // default - int i = 0; + // alloc the memory for the dynamic tex + DynamicTex *tex = NULL; + char path[0x200]; + + // 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 (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); + strcpy(path, "ui/resource/game_origins/"); + strcat(path, info->gameOrigin); + strcat(path, ".png"); + + // 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; + + RB3E_DEBUG("Setting diffuse texture for dynamic tex '%s'", path); + RndTexSetBitmap3(tex->mTex, tex->mFileLoader); + + // 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); + + RB3E_DEBUG("Dynamic tex created at %p with mat %p tex %p fileloader %p", tex, tex->mMat, tex->mTex, tex->mFileLoader); + + +} - if (config.GameOriginIcons == 1 && strlen(label->string) < 1000) +int *MusicLibraryConstructorHook(int *thisMusicLibrary, int *songPreview) +{ + return MusicLibraryConstructor(thisMusicLibrary, songPreview); +} + +RndMat *MusicLibraryMatHook(MusicLibrary *thisMusicLibrary, int data, int idx, UIListSlot *listSlot) +{ + if (listSlot != NULL && thisMusicLibrary != NULL && config.GameOriginIcons == 1) { - SetSongAndArtistName(label, sortNode); - for (i = 0; i < numOriginToIcon; i++) + if (strcmp(listSlot->mMatchName.buf, "game_origin_icon") == 0) { - if (strcmp(sortNode->somethingElse->metaData->gameOrigin.sym, originToIcon[i][0]) == 0) + NodeSort *ret = 0; + SortNode *node = 0; + SongNodeType nodeType = kNodeNone; + int curInfo = 0; + + ret = SongSortMgrGetSort(*(SongSortMgr **)PORT_THESONGSORTMGR, thisMusicLibrary->mSortType); + if (ret != NULL) { - originLabel = originToIcon[i][1]; - break; + node = NodeSortGetNode(ret, idx); + if (node != NULL) + { + nodeType = node->vtable->getNodeType(); + + // ensure this is actually a song node and not like a function node or etc. + if (nodeType == kNodeSong) + { + // do a basic null check here, sometimes it can be null + if (node != NULL && node->record != NULL && + node->record->metaData != NULL && + node->record->metaData->gameOrigin.sym != NULL) + { + // this shit fucking sucks lol + for (curInfo = 0; curInfo < numGameOrigins; curInfo++) + { + if (strcmp(node->record->metaData->gameOrigin.sym, originInfo[curInfo].gameOrigin) == 0) + { + if (textures[originInfo[curInfo].num] != NULL && textures[originInfo[curInfo].num]->mMat != NULL) + { + RB3E_DEBUG("Returning material for game origin '%s'", originInfo[curInfo].gameOrigin); + return textures[originInfo[curInfo].num]->mMat; + } + else + { + RB3E_DEBUG("Material for game origin '%s' is NULL, creation seemingly failed", originInfo[curInfo].gameOrigin); + } + } + } + } else { + RB3E_DEBUG("Node record or its metadata is NULL, skipping", NULL); + } + } + } } } - strcat(newLabel, originLabel); - strcat(newLabel, label->string); - BandLabelSetDisplayText(label, newLabel, 1); - return; } - SetSongAndArtistName(label, sortNode); - return; + + return (RndMat*)(intptr_t)MusicLibraryMat((void*)thisMusicLibrary, data, idx, (int*)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); } -void SetSongNameFromNodeHook(BandLabel *label, SortNode *sortNode) +int numGameOrigins; +GameOriginInfo originInfo[100] = {0}; + +void AddGameOriginToIconList(char *gameOrigin) { - char newLabel[1024] = {0}; - char *originLabel = "0 "; // default + if(gameOrigin != NULL && strcmp(gameOrigin, "") != 0) + { int i = 0; - RB3E_DEBUG("SetSongNameFromNode: %s", label->string); + // 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; + } - if (config.GameOriginIcons == 1 && strlen(label->string) < 1000) + // make sure the game origin isn't already in the array + for (i = 0; i < numGameOrigins; i++) { - SetSongNameFromNode(label, sortNode); - for (i = 0; i < numOriginToIcon; i++) + if (strcmp(originInfo[i].gameOrigin, gameOrigin) == 0) { - if (strcmp(sortNode->somethingElse->metaData->gameOrigin.sym, originToIcon[i][0]) == 0) - { - originLabel = originToIcon[i][1]; - break; - } + return; } - strcat(newLabel, originLabel); - strcat(newLabel, label->string); - BandLabelSetDisplayText(label, newLabel, 1); - return; } - SetSongNameFromNode(label, sortNode); - return; + + originInfo[numGameOrigins].gameOrigin = gameOrigin; + originInfo[numGameOrigins].num = 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) +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->gameOrigin.sym != 0) + { + AddGameOriginToIconList(thisSongMetadata->gameOrigin.sym); + 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->gameOrigin.sym != 0) + { + AddGameOriginToIconList(thisSongMetadata->gameOrigin.sym); + return ret; + } + + return ret; } \ No newline at end of file diff --git a/source/SongParserHooks.c b/source/SongParserHooks.c index 2069ebb..fbc9d59 100644 --- a/source/SongParserHooks.c +++ b/source/SongParserHooks.c @@ -21,7 +21,7 @@ int SongParserPitchToSlotHook(SongParser *thisSongParser, int pitch, int *diffic if (doubleBassModifier->enabled) { // make sure the current track type is drums - if (thisSongParser->mTrackType == DRUMS) + if (thisSongParser->mTrackType == kTrackDrum) { // check for MIDI note pitch 95 (which is the 2x bass pedal note) if (pitch == 95) diff --git a/source/_functions.c b/source/_functions.c index e7d3b5f..e8fc1d4 100644 --- a/source/_functions.c +++ b/source/_functions.c @@ -99,6 +99,31 @@ 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(MusicLibraryOnEnter) +RB3E_STUB(MusicLibraryOnUnload) +RB3E_STUB(RndCreateDefaultTexture) +RB3E_STUB(MusicLibraryConstructor) +RB3E_STUB(MusicLibraryGetNodeByIndex) +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) +RB3E_STUB(SongSortMgrGetSort) +RB3E_STUB(NodeSortGetNode) +RB3E_STUB(DynamicTexConstructor) +RB3E_STUB(DynamicTexDestructor) +RB3E_STUB(RndMatSetDiffuseTex) +RB3E_STUB(RndTexSetBitmap3) RB3E_STUB(BinstreamWrite) RB3E_STUB(BinstreamRead) RB3E_STUB(BinstreamReadEndian) diff --git a/source/rb3enhanced.c b/source/rb3enhanced.c index eee827c..37a8404 100644 --- a/source/rb3enhanced.c +++ b/source/rb3enhanced.c @@ -377,6 +377,7 @@ void InitialiseFunctions() POKE_B(&HmxFactoryFuncAt, PORT_HMXFACTORYFUNCAT); // TODO(Emma): port to bank8 POKE_B(&ObjectFindUIPanel, PORT_OBJECTFINDUIPANEL); + POKE_B(&vector_push_back, PORT_VECTORPUSHBACK); // otherwise unused it seems? #endif POKE_B(&RandomInt, PORT_RANDOMINT); POKE_B(&DataNodeEvaluate, PORT_DATANODEEVALUATE); @@ -388,6 +389,7 @@ void InitialiseFunctions() POKE_B(&GetMetadata, PORT_GETMETADATA); POKE_B(&GetSongIDFromShortname, PORT_GETSONGIDFROMSHORTNAME); POKE_B(&GetBandUsers, PORT_GETBANDUSERS); + POKE_B(&GetBandUserFromSlot, PORT_GETBANDUSERFROMSLOT); POKE_B(&FileStreamConstructor, PORT_FILESTREAM_CT); POKE_B(&ChunkStreamConstructor, PORT_CHUNKSTREAM_CT); POKE_B(&Dynamic_Cast, PORT_DYNAMICCAST); @@ -395,6 +397,18 @@ 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(&NodeSortGetNode, PORT_NODESORTGETNODE); + 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); POKE_B(&BinstreamWrite, PORT_BINSTREAMWRITE); POKE_B(&BinstreamRead, PORT_BINSTREAMREAD); POKE_B(&BinstreamWriteEndian, PORT_BINSTREAMWRITEENDIAN); @@ -419,17 +433,18 @@ void InitialiseFunctions() void ApplyHooks() { POKE_B(PORT_DATAINITFUNCS_TAIL, &AddDTAFunctions); + POKE_B(PORT_OVERSHELLPARTSELECTPROVIDERRELOAD, &OvershellPartSelectProviderReload); + //#ifndef RB3E_WII_BANK8 + // POKE_B(PORT_BUILDINSTRUMENTSELECTION, &BuildInstrumentSelectionList); + //#endif // TODO(Emma): fix this buggy set of hooks //POKE_B(PORT_ISSUPPORTEDLANGUAGE, &IsSupportedLanguageHook); -#ifndef RB3E_WII_BANK8 - POKE_B(PORT_BUILDINSTRUMENTSELECTION, &BuildInstrumentSelectionList); -#endif POKE_BL(PORT_OPTIONSTR_DEFINE, &DefinesHook); POKE_BL(PORT_RUNLOOP_SPARE, &RB3E_RunLoop); HookFunction(PORT_LOCALIZE, &Localize, &LocalizeHook); HookFunction(PORT_WILLBENOSTRUM, &WillBeNoStrum, &WillBeNoStrumHook); HookFunction(PORT_ADDGAMEGEM, &AddGameGem, &AddGameGemHook); - HookFunction(PORT_SETSONGANDARTISTNAME, &SetSongAndArtistName, SetSongAndArtistNameHook); + //HookFunction(PORT_SETSONGANDARTISTNAME, &SetSongAndArtistName, SetSongAndArtistNameHook); HookFunction(PORT_SETVENUE, &SetVenue, &SetVenueHook); HookFunction(PORT_MODIFIERMGR_CT, &ModifierManagerConstructor, &ModifierManagerConstructorHook); HookFunction(PORT_NEWFILE, &NewFile, &NewFileHook); @@ -447,19 +462,24 @@ 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); HookFunction(PORT_SONGPARSERPITCHTOSLOT, &SongParserPitchToSlot, &SongParserPitchToSlotHook); HookFunction(PORT_DATASET, &DataSet, &DataSetHook); HookFunction(PORT_DATASETELEM, &DataSetElem, &DataSetElemHook); HookFunction(PORT_DATAONELEM, &DataOnElem, &DataOnElemHook); - + 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); POKE_B(PORT_FILEISLOCAL, &FileIsLocalHook); #elif RB3E_XBOX // 360 exclusive hooks HookFunction(PORT_STAGEKIT_SET_STATE, &StagekitSetState, &StagekitSetStateHook); - HookFunction(PORT_SETSONGNAMEFROMNODE, &SetSongNameFromNode, &SetSongNameFromNodeHook); + //HookFunction(PORT_SETSONGNAMEFROMNODE, &SetSongNameFromNode, &SetSongNameFromNodeHook); // TODO: port these to Wii HookFunction(PORT_DATANODEGETOBJ, &DataNodeGetObj, &DataNodeGetObjHook); POKE_B(PORT_GETSONGID, &GetSongIDHook);