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/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/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/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/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/SetlistHooks.h b/include/SetlistHooks.h index 51d1e34..98dc84b 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); diff --git a/include/ports.h b/include/ports.h index e74abcf..0cb397d 100644 --- a/include/ports.h +++ b/include/ports.h @@ -46,87 +46,110 @@ #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 -#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_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_ADDSMASHERPLATETOVECTOR 0x82356980 // AddSmasherPlateToVector +#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_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 +#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_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 // instance addresses #define PORT_MODIFIERMGR_POINTER 0x82dfec08 // pointer to ModifierManager #define PORT_ROCKCENTRALGATEWAY 0x82cc8f60 // address of RockCentralGateway @@ -186,68 +209,92 @@ 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 -#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_ADDSMASHERPLATETOVECTOR 0x804316d4 // AddSmasherPlateToVector +#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_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 +#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_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 // 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 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..0e01eb6 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; - 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/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/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/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/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..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/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/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/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/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/MusicLibrary.h b/include/rb3/MusicLibrary.h index ac6d99c..de9a9df 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(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/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/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/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 032872d..0e7459a 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,10 @@ typedef struct _SongMetadata #else char unknown[0x28]; #endif - char *shortname; - int song_id; + Symbol mShortName; + int mSongID; char unknown2[0x4]; - char *gameOrigin; + Symbol mGameOrigin; char unknown3[0x10]; String title; String artist; @@ -32,5 +34,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..1b14d71 100644 --- a/include/rb3/SortNode.h +++ b/include/rb3/SortNode.h @@ -1,26 +1,68 @@ #ifndef _SORTNODE_H #define _SORTNODE_H +#include "Object.h" +#include "Symbol.h" #include "SongMetadata.h" -typedef struct _Unknown2 +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 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[0xfc]; + char unknown[0xf8]; #else - char unknown[0x108]; + char unknown[0x104]; #endif SongMetadata *metaData; -} Unknown2; +} SongRecord; -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; +}; #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/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..8dce691 --- /dev/null +++ b/include/rb3/Vector.h @@ -0,0 +1,23 @@ +#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; + +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 d786164..ee2a055 100644 --- a/include/rb3_include.h +++ b/include/rb3_include.h @@ -14,15 +14,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" @@ -30,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" @@ -40,7 +44,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/GameHooks.c b/source/GameHooks.c index 27387c3..b9d9057 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) { @@ -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); } @@ -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 87340f7..0e0370a 100644 --- a/source/GemHooks.c +++ b/source/GemHooks.c @@ -1,22 +1,24 @@ #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(int *gameGemListPtr, int *multiGemInfoPtr) +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; } else { - return WillBeNoStrum(gameGemListPtr, multiGemInfoPtr); + return WillBeNoStrum(thisGameGemList, gem); } } @@ -29,7 +31,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) { @@ -62,14 +64,14 @@ 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); + colorShuffleModifier = ModifierIsActive(*(int *)PORT_MODIFIERMGR_POINTER, globalSymbols.colorShuffle, 0); if (colorShuffleModifier->enabled) { @@ -99,27 +101,50 @@ Symbol GetSlotColorHook(int *bandUser) return slotColor; } -int AddGameGemHook(int *gameGemList, GameGem *gem, NoStrumState gemType) +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 = ModifierActive(*(int *)PORT_MODIFIERMGR_POINTER, globalSymbols.mirrorMode, 0); + 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 89419ef..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]); @@ -66,17 +67,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 +92,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 +113,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/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/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/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 6f1fd85..4e03c56 100644 --- a/source/SetlistHooks.c +++ b/source/SetlistHooks.c @@ -8,81 +8,254 @@ #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/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(MusicLibrary *thisMusicLibrary, int *songPreview) +{ + return MusicLibraryConstructor(thisMusicLibrary, songPreview); +} + +RndMat *MusicLibraryMatHook(MusicLibrary *thisMusicLibrary, int data, int idx, UIListSlot *listSlot) +{ + if (listSlot != NULL && thisMusicLibrary != NULL) { - SetSongAndArtistName(label, sortNode); - for (i = 0; i < numOriginToIcon; i++) + if (strcmp(listSlot->mMatchName.buf, "game_origin_icon") == 0) { - if (strcmp(sortNode->somethingElse->metaData->gameOrigin, originToIcon[i][0]) == 0) + int *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->mGameOrigin.sym != NULL) + { + // this shit fucking sucks lol + for (curInfo = 0; curInfo < numGameOrigins; curInfo++) + { + if (strcmp(node->record->metaData->mGameOrigin.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 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); } -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, 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->mGameOrigin.sym != 0) + { + AddGameOriginToIconList(thisSongMetadata->mGameOrigin.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->mGameOrigin.sym != 0) + { + AddGameOriginToIconList(thisSongMetadata->mGameOrigin.sym); + 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 c801ab7..9f3d012 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) @@ -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) @@ -92,3 +92,28 @@ 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) \ No newline at end of file diff --git a/source/net_http_server.c b/source/net_http_server.c index 18b1f78..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->shortname); + 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->gameOrigin); + 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->shortname); + strcat(response_buffer, song_metadata->mShortName.sym); strcat(response_buffer, "]\r\n"); strcat(response_buffer, "shortname="); - strcat(response_buffer, song_metadata->shortname); + 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->gameOrigin); + 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 4415c8d..2e521bf 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"; @@ -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) @@ -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); } @@ -302,7 +303,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); @@ -310,7 +311,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); @@ -323,6 +324,19 @@ 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(&vector_push_back, PORT_VECTORPUSHBACK); + 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); } @@ -330,13 +344,12 @@ 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); 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); @@ -354,15 +367,20 @@ 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_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); #elif RB3E_XBOX // 360 exclusive hooks HookFunction(PORT_STAGEKIT_SET_STATE, &StagekitSetState, &StagekitSetStateHook); - HookFunction(PORT_SETSONGNAMEFROMNODE, &SetSongNameFromNode, &SetSongNameFromNodeHook); - // TODO: port these to Wii + + // TODO: port these to Wii POKE_B(PORT_GETSONGID, &GetSongIDHook); POKE_BL(PORT_SONG_ID_EVALUATE, &MetadataSongIDHook); POKE_BL(PORT_LOADOBJS_BCTRL, &LoadObj);