From 4b269938916649ac88fc9c4cd4ac48f1294e0937 Mon Sep 17 00:00:00 2001 From: Guus Waals <_@guusw.nl> Date: Thu, 26 Sep 2024 03:12:43 +0800 Subject: [PATCH] WIP --- game_re/CMakeLists.txt | 18 +- game_re/_gh_fix | 1 + game_re/gh_fix/Erm_fn_v_UpdateLastError.cxx | 53 ++ game_re/gh_fix/FUN_0043ff60.cxx | 26 + game_re/gh_fix/binkInit.cxx | 16 + .../r3_checkCmdlineLevel.cxx} | 9 +- game_re/gh_fix/r3_initUnusedSM.cxx | 24 + game_re/gh_fix/r3_module10_init.cxx | 24 + .../gh_fix/r3_validateBinkVideoQuality.cxx | 29 + game_re/gh_global.cxx | 51 +- game_re/gh_global.h | 51 +- game_re/gh_stub/r3_module10input_init.cxx | 14 - game_re/gh_stub/r3_module11_init.cxx | 14 - game_re/gh_stub/r3_module12_init.cxx | 14 - game_re/gh_stub/r3_module14_init.cxx | 14 - game_re/gh_stub/r3_module15_init.cxx | 14 - game_re/gh_stub/r3_module16_init.cxx | 14 - game_re/gh_stub/r3_module5_init.cxx | 14 - game_re/gh_stub/r3_module8_init.cxx | 14 - game_re/gh_stub/r3_module9_init.cxx | 14 - ...0470ef0.cxx => r3_readBinkVideoConfig.cxx} | 8 +- game_re/globals.txt | 51 +- game_re/r3/binders/auto.h | 7 + game_re/r3/binders/base.h | 4 + game_re/third_party/bink/bink.h | 714 ++++++++++++++++++ game_re/third_party/bink/binkw32.dll | Bin 0 -> 291840 bytes game_re/third_party/bink/binkw32.lib | Bin 0 -> 20056 bytes game_re/third_party/bink/radbase.h | 389 ++++++++++ scripts/DumpCurrentFunctionRecursive.java | 71 ++ scripts/re3lib/GlobalDumper.java | 3 + scripts/re3lib/PCallTracer.java | 3 +- 31 files changed, 1525 insertions(+), 153 deletions(-) create mode 120000 game_re/_gh_fix create mode 100644 game_re/gh_fix/Erm_fn_v_UpdateLastError.cxx create mode 100644 game_re/gh_fix/FUN_0043ff60.cxx create mode 100644 game_re/gh_fix/binkInit.cxx rename game_re/{gh_stub/r3_module2_init.cxx => gh_fix/r3_checkCmdlineLevel.cxx} (54%) create mode 100644 game_re/gh_fix/r3_initUnusedSM.cxx create mode 100644 game_re/gh_fix/r3_module10_init.cxx create mode 100644 game_re/gh_fix/r3_validateBinkVideoQuality.cxx delete mode 100644 game_re/gh_stub/r3_module10input_init.cxx delete mode 100644 game_re/gh_stub/r3_module11_init.cxx delete mode 100644 game_re/gh_stub/r3_module12_init.cxx delete mode 100644 game_re/gh_stub/r3_module14_init.cxx delete mode 100644 game_re/gh_stub/r3_module15_init.cxx delete mode 100644 game_re/gh_stub/r3_module16_init.cxx delete mode 100644 game_re/gh_stub/r3_module5_init.cxx delete mode 100644 game_re/gh_stub/r3_module8_init.cxx delete mode 100644 game_re/gh_stub/r3_module9_init.cxx rename game_re/gh_stub/{FUN_00470ef0.cxx => r3_readBinkVideoConfig.cxx} (60%) create mode 100644 game_re/third_party/bink/bink.h create mode 100644 game_re/third_party/bink/binkw32.dll create mode 100644 game_re/third_party/bink/binkw32.lib create mode 100644 game_re/third_party/bink/radbase.h create mode 100644 scripts/DumpCurrentFunctionRecursive.java diff --git a/game_re/CMakeLists.txt b/game_re/CMakeLists.txt index 884bc131..05179d80 100644 --- a/game_re/CMakeLists.txt +++ b/game_re/CMakeLists.txt @@ -13,7 +13,23 @@ add_executable(game_re target_compile_features(game_re PUBLIC cxx_std_20) target_include_directories(game_re PUBLIC - ${CMAKE_CURRENT_SOURCE_DIR}) + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/third_party/bink +) + +if(WIN32) + target_link_directories(game_re PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/third_party/bink) + target_include_directories(game_re PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/third_party/bink) + target_link_libraries(game_re PRIVATE binkw32) + + # Copy to output dir + add_custom_command( + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/binkw32.dll + COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/third_party/bink/binkw32.dll ${CMAKE_CURRENT_BINARY_DIR} + ) + add_custom_target(copy_binkw32 ALL DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/binkw32.dll) + add_dependencies(game_re copy_binkw32) +endif() target_compile_definitions(game_re PRIVATE R3_GAME_DATA_DIR=\"${GAME_DATA_DIR}\" diff --git a/game_re/_gh_fix b/game_re/_gh_fix new file mode 120000 index 00000000..4b138403 --- /dev/null +++ b/game_re/_gh_fix @@ -0,0 +1 @@ +gh_fix \ No newline at end of file diff --git a/game_re/gh_fix/Erm_fn_v_UpdateLastError.cxx b/game_re/gh_fix/Erm_fn_v_UpdateLastError.cxx new file mode 100644 index 00000000..b5886d2a --- /dev/null +++ b/game_re/gh_fix/Erm_fn_v_UpdateLastError.cxx @@ -0,0 +1,53 @@ +// AUTO-GENERATED FILE, MOVE TO 'gh_fix' FOLDER PREVENT OVERWRITING!!!!! + +#include +#include +#include + +extern "C" { +void r3_noop(void *p_cTxt1, void *p_cTxt2); // 00401100 // r3_noop +tdstLastErrorInfo *Erm_fn_p_stFindstMyLastErrorInfo( + ulong ulChannelId); // 0043e2b0 // Erm_fn_p_stFindstMyLastErrorInfo + +// 0043e410 +/* Check CpaError.h */ + +void Erm_fn_v_UpdateLastError(ushort uwStartOfWarningsId, byte ucModuleId, + ulong ulChannelId, ushort uwErrNum, + long lDebugData, uchar ucOpenInfoWindow, + uchar ucStopForDebug, char *szPersonalMsg) + +{ + tdstLastErrorInfo *ptVar2; + + ptVar2 = Erm_fn_p_stFindstMyLastErrorInfo(ulChannelId); + if (ptVar2 == (tdstLastErrorInfo *)0x0) { + throw std::runtime_error( + fmt::format("{} {}", s_Error_in_the_Erm__005bd374, + s_There_is_no_more_Channel_error_t_005bd388)); + } + if (ptVar2->lastErr != 0) { + throw std::runtime_error( + fmt::format("{}", s_Strange__The_last_error_was_neve_005bd348)); + } + ptVar2->lastErr = uwErrNum; + ptVar2->ucLastFailedModuleId = ucModuleId; + ptVar2->ulChannelId = ulChannelId; + if (uwErrNum < uwStartOfWarningsId) { + if (szPersonalMsg == (char *)0x0) { + throw std::runtime_error(fmt::format( + "Unkown fatal error ({}, module: {})", uwErrNum, ucModuleId)); + } else { + throw std::runtime_error( + fmt::format("Unkown fatal error ({}, module: {}, {})", uwErrNum, + ucModuleId, szPersonalMsg)); + } + } + if (szPersonalMsg == (char *)0x0) { + return; + } else { + SPDLOG_WARN("Erm_Warn: {}, module: {}, {}", uwErrNum, ucModuleId, + szPersonalMsg); + } +} +} diff --git a/game_re/gh_fix/FUN_0043ff60.cxx b/game_re/gh_fix/FUN_0043ff60.cxx new file mode 100644 index 00000000..931d9b87 --- /dev/null +++ b/game_re/gh_fix/FUN_0043ff60.cxx @@ -0,0 +1,26 @@ +// AUTO-GENERATED FILE, MOVE TO 'gh_fix' FOLDER PREVENT OVERWRITING!!!!! + +#include +#include + +extern "C" { + +// 0043ff60 +/* WARNING: Globals starting with '_' overlap smaller symbols at the same address */ + +void FUN_0043ff60(float param_1,float param_2,float param_3) + +{ + longlong lVar1; + longlong lVar2; + longlong lVar3; + + lVar1 = r3_ftol(param_1 * 255.0); + lVar2 = r3_ftol(param_2 * 255.0); + lVar3 = r3_ftol(param_3 * 255.0); + DAT_007a2c14 = ((int)lVar1 << 8 | (uint)lVar2) << 8 | (uint)lVar3; + return; +} + +} + diff --git a/game_re/gh_fix/binkInit.cxx b/game_re/gh_fix/binkInit.cxx new file mode 100644 index 00000000..f40b6025 --- /dev/null +++ b/game_re/gh_fix/binkInit.cxx @@ -0,0 +1,16 @@ +// AUTO-GENERATED FILE, MOVE TO 'gh_fix' FOLDER PREVENT OVERWRITING!!!!! + +#include +#include +#include + +extern "C" { + +// 00441e40 +void binkInit(void) { + BinkSetSoundSystem(&BinkOpenDirectSound, 0); + BinkSetSoundOnOff(0, 0); + BinkSetIOSize(0x80000000); + return; +} +} diff --git a/game_re/gh_stub/r3_module2_init.cxx b/game_re/gh_fix/r3_checkCmdlineLevel.cxx similarity index 54% rename from game_re/gh_stub/r3_module2_init.cxx rename to game_re/gh_fix/r3_checkCmdlineLevel.cxx index ccc7b189..addba5dd 100644 --- a/game_re/gh_stub/r3_module2_init.cxx +++ b/game_re/gh_fix/r3_checkCmdlineLevel.cxx @@ -6,9 +6,8 @@ #include #include -// 00442cc0 -// r3_module2_init -extern "C" undefined r3_module2_init(void) { - // TODO: Implement this function - throw GHStubException("Function not implemented: r3_module2_init"); +// 00445580 +// r3_checkCmdlineLevel +extern "C" void r3_checkCmdlineLevel(void) { + // NOOP } diff --git a/game_re/gh_fix/r3_initUnusedSM.cxx b/game_re/gh_fix/r3_initUnusedSM.cxx new file mode 100644 index 00000000..c439e82f --- /dev/null +++ b/game_re/gh_fix/r3_initUnusedSM.cxx @@ -0,0 +1,24 @@ +// AUTO-GENERATED FILE, MOVE TO 'gh_fix' FOLDER PREVENT OVERWRITING!!!!! + +#include +#include + +extern "C" { + +// 0045d2e0 +void r3_initUnusedSM(void) + +{ + WORD_007d9e68 = 1; + /* 0x53 */ + sz_S[0] = s_S_005bf008[0]; + sz_S[1] = s_S_005bf008[1]; + WORD_007d9e6c = 2; + /* 0x4d */ + sz_M[0] = s_M_005bf004[0]; + sz_M[1] = s_M_005bf004[1]; + return; +} + +} + diff --git a/game_re/gh_fix/r3_module10_init.cxx b/game_re/gh_fix/r3_module10_init.cxx new file mode 100644 index 00000000..2751cfff --- /dev/null +++ b/game_re/gh_fix/r3_module10_init.cxx @@ -0,0 +1,24 @@ +// AUTO-GENERATED FILE, MOVE TO 'gh_fix' FOLDER PREVENT OVERWRITING!!!!! + +#include +#include + +extern "C" { +void Erm_fn_v_UpdateLastError(ushort uwStartOfWarningsId, byte ucModuleId, ulong ulChannelId, ushort uwErrNum, long lDebugData, uchar ucOpenInfoWindow, uchar ucStopForDebug, char * szPersonalMsg); // 0043e410 // Erm_fn_v_UpdateLastError +byte Erm_fn_ucInitErrMsg(void); // 0043e1d0 // Erm_fn_ucInitErrMsg + +// 00504ef0 +void r3_module10_init(void) + +{ + /* 0x104ef0 95 IPT_fn_vFirstInitInput */ + if (g_errMod10 == 0xff) { + g_errMod10 = Erm_fn_ucInitErrMsg(); + return; + } + Erm_fn_v_UpdateLastError(3,g_errMod0,0,4,-1,0xff,0xff,(char *)0x0); + return; +} + +} + diff --git a/game_re/gh_fix/r3_validateBinkVideoQuality.cxx b/game_re/gh_fix/r3_validateBinkVideoQuality.cxx new file mode 100644 index 00000000..77f97cd0 --- /dev/null +++ b/game_re/gh_fix/r3_validateBinkVideoQuality.cxx @@ -0,0 +1,29 @@ +// AUTO-GENERATED FILE, MOVE TO 'gh_fix' FOLDER PREVENT OVERWRITING!!!!! + +#include +#include + +extern "C" { + +// 00442090 +void r3_validateBinkVideoQuality(byte videoBpp, byte wantedVideoQuality) + +{ + byte bVar1; + + bVar1 = wantedVideoQuality; + if (4 < wantedVideoQuality) { + bVar1 = 4; + } + g_bink_realVideoQuality = g_bink_wantedVideoQuality; + if ((g_bink_wantedVideoQuality <= bVar1) && + (g_bink_realVideoQuality = 4, wantedVideoQuality < 5)) { + g_bink_realVideoQuality = wantedVideoQuality; + } + wantedVideoQuality = (uint)g_bink_realVideoQuality; + g_bink_videoBpp = videoBpp; + g_bink_wantedVideoQualityPlus1 = wantedVideoQuality + 1; + DAT_007a2e0c = -(uint)(wantedVideoQuality != 0) & 0x80000000; + return; +} +} diff --git a/game_re/gh_global.cxx b/game_re/gh_global.cxx index debd6bd9..5cf177cf 100644 --- a/game_re/gh_global.cxx +++ b/game_re/gh_global.cxx @@ -1,5 +1,7 @@ // AUTO-GENERATED FILE #include +undefined *& PTR__BinkOpenDirectSound_4_0059733c= (undefined *&) GH_MEM(0x0059733c); +undefined& DAT_005a9ed4= (undefined&) GH_MEM(0x005a9ed4); char(&s__s_not_initialized__005b63e0)[20] = reinterpret_cast(GH_MEM(0x005b63e0)); char(&s_Please_run_the__s_setup__005b63f4)[28] = reinterpret_cast(GH_MEM(0x005b63f4)); char(&s_dashCC)[4] = reinterpret_cast(GH_MEM(0x005b6410)); @@ -59,9 +61,22 @@ const char* s_None = "None"; // 005b6904 const char* s_UbiSoft_Ubi_ini = "/UbiSoft/Ubi.ini"; // 005b690c undefined& s_percent_d= (undefined&) GH_MEM(0x005bad58); byte& g_errMod0= (byte&) GH_MEM(0x005bd29c); +const char* s_Warning_error__005bd318 = "Warning error: "; // 005bd318 +const char* s_Fatale_error__005bd328 = "\nFatale error: "; // 005bd328 +const char* s_Fatale_error__005bd338 = "Fatale error: "; // 005bd338 +const char* s_Strange__The_last_error_was_neve_005bd348 = "Strange!\nThe last error was never treated"; // 005bd348 +const char* s_Error_in_the_Erm__005bd374 = "Error in the Erm:"; // 005bd374 +const char* s_There_is_no_more_Channel_error_t_005bd388 = "There is no more Channel error to raise the new error.\nPerhaps the constant C_ucErmNbOfErrorChannel is too low."; // 005bd388 byte& g_errMod1= (byte&) GH_MEM(0x005bd4cc); byte& g_errModMmg= (byte&) GH_MEM(0x005bd58c); +char& DAT_005bd5f4= (char&) GH_MEM(0x005bd5f4); +const char* s_Video_AutoAdjustQuality_005bd630 = "Video_AutoAdjustQuality"; // 005bd630 +const char* s_Video_BPP_005bd648 = "Video_BPP"; // 005bd648 +const char* s_Video_RealQuality_005bd654 = "Video_RealQuality"; // 005bd654 +const char* s_Rayman_Arena_005bd668 = "Rayman Arena"; // 005bd668 +const char* s_Video_WantedQuality_005bd678 = "Video_WantedQuality"; // 005bd678 const char* s_Videos_005bd72c = "Videos"; // 005bd72c +byte& g_errMod2Bink= (byte&) GH_MEM(0x005bd7ac); const char* s__World_Sound_005bd9e8 = "\\World\\Sound"; // 005bd9e8 const char* s__Options_005bd9f8 = "\\Options"; // 005bd9f8 const char* s__Vignette_005bda04 = "\\Vignette"; // 005bda04 @@ -110,8 +125,9 @@ const char* s_fmt_c_colon_s = "%c:%s"; // 005be540 const char* s_r3_program_files = "\\program files\\Ubi Soft\\Rayman3"; // 005be548 undefined *& PTR_DAT_005be568= (undefined *&) GH_MEM(0x005be568); byte& g_errModFirst= (byte&) GH_MEM(0x005be6f0); -word& DAT_005bf004= (word&) GH_MEM(0x005bf004); -word& DAT_005bf008= (word&) GH_MEM(0x005bf008); +byte& g_errMod5= (byte&) GH_MEM(0x005befbc); +char(&s_M_005bf004)[2] = reinterpret_cast(GH_MEM(0x005bf004)); +char(&s_S_005bf008)[2] = reinterpret_cast(GH_MEM(0x005bf008)); const char* s__08X__04X__04X__02X_02X__02X_02X_005bf6d8 = "%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X"; // 005bf6d8 dword& r3_textureMemMode= (dword&) GH_MEM(0x005bf740); const char* s_Agp8_005bf744 = "Agp8"; // 005bf744 @@ -123,13 +139,25 @@ const char* s_Vram = "Vram"; // 005bf76c byte& g_errMod7= (byte&) GH_MEM(0x005c069c); undefined2& DAT_005c0f20= (undefined2&) GH_MEM(0x005c0f20); char& DAT_005c0f22= (char&) GH_MEM(0x005c0f22); +byte& g_errMod17= (byte&) GH_MEM(0x005c1400); +byte& g_errMod8= (byte&) GH_MEM(0x005c4b0c); +byte& g_errMod9= (byte&) GH_MEM(0x005c4dcc); +byte& g_errMod7= (byte&) GH_MEM(0x005c506c); +byte& g_errMod10= (byte&) GH_MEM(0x005c51f4); UINT& g_config_camera_hor_axis= (UINT&) GH_MEM(0x005c67c8); UINT& g_config_camera_ver_axis= (UINT&) GH_MEM(0x005c67cc); +byte& g_errMod11= (byte&) GH_MEM(0x005caf2c); +byte& g_errMod12= (byte&) GH_MEM(0x005cb16c); +byte& g_errMod14= (byte&) GH_MEM(0x005cf5d4); +byte& g_errMod15= (byte&) GH_MEM(0x005cf814); +byte& g_errMod16= (byte&) GH_MEM(0x005cf874); HWND& g_gameHWND1= (HWND&) GH_MEM(0x005cf964); long& lpDefault_005cf96c= (long&) GH_MEM(0x005cf96c); byte& g_ucErmNbOfModule= (byte&) GH_MEM(0x005d2638); mod1_ptrs& g_mod1_ptrs= (mod1_ptrs&) GH_MEM(0x005d2644); undefined4& DAT_005d2660= (undefined4&) GH_MEM(0x005d2660); +undefined& DAT_005d266c= (undefined&) GH_MEM(0x005d266c); +undefined1& DAT_005d266d= (undefined1&) GH_MEM(0x005d266d); undefined1& DAT_005d26a8= (undefined1&) GH_MEM(0x005d26a8); undefined& lpVolumeNameBuffer_005d27b0= (undefined&) GH_MEM(0x005d27b0); r3_main_data& r3_main_data_005d28b6= (r3_main_data&) GH_MEM(0x005d28b6); @@ -165,11 +193,23 @@ char(&s_quitting1)[64] = reinterpret_cast(GH_MEM(0x007825c0)); char(&s_wndStrQuiting)[56] = reinterpret_cast(GH_MEM(0x00782600)); tdstLastErrorInfo(&g_stErmTheLastErrorInfo)[3] = reinterpret_cast(GH_MEM(0x00782640)); pointer& g_errDat4= (pointer&) GH_MEM(0x00782644); +undefined1& DAT_0078266c= (undefined1&) GH_MEM(0x0078266c); tdstBlockInfoPriv *(&g_a_p_stMmgModuleBlocksInfo)[255] = reinterpret_cast(GH_MEM(0x0078f6a0)); undefined& g_MmgCriticalSection= (undefined&) GH_MEM(0x0078faa0); char(&g_a_ucBlocksNbInModule)[255] = reinterpret_cast(GH_MEM(0x0078fac0)); tdstGeneralChannelsInfo_& g_stGeneralChannelInfo= (tdstGeneralChannelsInfo_&) GH_MEM(0x0078fbc0); tdstCurrentModeInfo *& g_d_stCurrentModeInfo= (tdstCurrentModeInfo *&) GH_MEM(0x0078fbc8); +undefined4& DAT_00794cec= (undefined4&) GH_MEM(0x00794cec); +dword& DWORD_00794d00= (dword&) GH_MEM(0x00794d00); +dword& DWORD_00794d04= (dword&) GH_MEM(0x00794d04); +undefined1& DAT_007a0cd8= (undefined1&) GH_MEM(0x007a0cd8); +uint& DAT_007a2c14= (uint&) GH_MEM(0x007a2c14); +byte& g_bink_videoBpp= (byte&) GH_MEM(0x007a2e00); +byte& g_bink_wantedVideoQuality= (byte&) GH_MEM(0x007a2e02); +byte& g_bink_realVideoQuality= (byte&) GH_MEM(0x007a2e03); +byte& g_bink_autoAdjustQuality= (byte&) GH_MEM(0x007a2e04); +uint& DAT_007a2e0c= (uint&) GH_MEM(0x007a2e0c); +int& g_bink_wantedVideoQualityPlus1= (int&) GH_MEM(0x007a2e10); undefined& DAT_007d7d84= (undefined&) GH_MEM(0x007d7d84); GAM_tdstEngineStructure& g_r3_engine= (GAM_tdstEngineStructure&) GH_MEM(0x007d7dc0); undefined2& DAT_007d7ea8= (undefined2&) GH_MEM(0x007d7ea8); @@ -183,12 +223,13 @@ uint& DAT_007d9cc4= (uint&) GH_MEM(0x007d9cc4); undefined& g_config_unused0= (undefined&) GH_MEM(0x007d9df0); undefined& lpSystemTime_007d9e40= (undefined&) GH_MEM(0x007d9e40); undefined4& DAT_007d9e60= (undefined4&) GH_MEM(0x007d9e60); -undefined2& DAT_007d9e68= (undefined2&) GH_MEM(0x007d9e68); -word& WORD_007d9e6a= (word&) GH_MEM(0x007d9e6a); +word& WORD_007d9e68= (word&) GH_MEM(0x007d9e68); +char(&sz_S)[2] = reinterpret_cast(GH_MEM(0x007d9e6a)); word& WORD_007d9e6c= (word&) GH_MEM(0x007d9e6c); -word& WORD_007d9e6e= (word&) GH_MEM(0x007d9e6e); +char(&sz_M)[2] = reinterpret_cast(GH_MEM(0x007d9e6e)); undefined& lpRootPathName_007d9e70= (undefined&) GH_MEM(0x007d9e70); undefined3& UNK_007d9e71= (undefined3&) GH_MEM(0x007d9e71); +dword& DWORD_007eb200= (dword&) GH_MEM(0x007eb200); undefined& g_GLI_fullscreen= (undefined&) GH_MEM(0x007edd40); int& g_GLI_width0= (int&) GH_MEM(0x007edd44); int& g_GLI_height0= (int&) GH_MEM(0x007edd48); diff --git a/game_re/gh_global.h b/game_re/gh_global.h index 89deedc2..b8f757ec 100644 --- a/game_re/gh_global.h +++ b/game_re/gh_global.h @@ -5,6 +5,8 @@ #include +extern undefined *& PTR__BinkOpenDirectSound_4_0059733c; // 0059733c +extern undefined& DAT_005a9ed4; // 005a9ed4 extern char(&s__s_not_initialized__005b63e0)[20]; // 005b63e0 extern char(&s_Please_run_the__s_setup__005b63f4)[28]; // 005b63f4 extern char(&s_dashCC)[4]; // 005b6410 @@ -64,9 +66,22 @@ extern const char* s_None; // 005b6904 extern const char* s_UbiSoft_Ubi_ini; // 005b690c extern undefined& s_percent_d; // 005bad58 extern byte& g_errMod0; // 005bd29c +extern const char* s_Warning_error__005bd318; // 005bd318 +extern const char* s_Fatale_error__005bd328; // 005bd328 +extern const char* s_Fatale_error__005bd338; // 005bd338 +extern const char* s_Strange__The_last_error_was_neve_005bd348; // 005bd348 +extern const char* s_Error_in_the_Erm__005bd374; // 005bd374 +extern const char* s_There_is_no_more_Channel_error_t_005bd388; // 005bd388 extern byte& g_errMod1; // 005bd4cc extern byte& g_errModMmg; // 005bd58c +extern char& DAT_005bd5f4; // 005bd5f4 +extern const char* s_Video_AutoAdjustQuality_005bd630; // 005bd630 +extern const char* s_Video_BPP_005bd648; // 005bd648 +extern const char* s_Video_RealQuality_005bd654; // 005bd654 +extern const char* s_Rayman_Arena_005bd668; // 005bd668 +extern const char* s_Video_WantedQuality_005bd678; // 005bd678 extern const char* s_Videos_005bd72c; // 005bd72c +extern byte& g_errMod2Bink; // 005bd7ac extern const char* s__World_Sound_005bd9e8; // 005bd9e8 extern const char* s__Options_005bd9f8; // 005bd9f8 extern const char* s__Vignette_005bda04; // 005bda04 @@ -115,8 +130,9 @@ extern const char* s_fmt_c_colon_s; // 005be540 extern const char* s_r3_program_files; // 005be548 extern undefined *& PTR_DAT_005be568; // 005be568 extern byte& g_errModFirst; // 005be6f0 -extern word& DAT_005bf004; // 005bf004 -extern word& DAT_005bf008; // 005bf008 +extern byte& g_errMod5; // 005befbc +extern char(&s_M_005bf004)[2]; // 005bf004 +extern char(&s_S_005bf008)[2]; // 005bf008 extern const char* s__08X__04X__04X__02X_02X__02X_02X_005bf6d8; // 005bf6d8 extern dword& r3_textureMemMode; // 005bf740 extern const char* s_Agp8_005bf744; // 005bf744 @@ -128,13 +144,25 @@ extern const char* s_Vram; // 005bf76c extern byte& g_errMod7; // 005c069c extern undefined2& DAT_005c0f20; // 005c0f20 extern char& DAT_005c0f22; // 005c0f22 +extern byte& g_errMod17; // 005c1400 +extern byte& g_errMod8; // 005c4b0c +extern byte& g_errMod9; // 005c4dcc +extern byte& g_errMod7; // 005c506c +extern byte& g_errMod10; // 005c51f4 extern UINT& g_config_camera_hor_axis; // 005c67c8 extern UINT& g_config_camera_ver_axis; // 005c67cc +extern byte& g_errMod11; // 005caf2c +extern byte& g_errMod12; // 005cb16c +extern byte& g_errMod14; // 005cf5d4 +extern byte& g_errMod15; // 005cf814 +extern byte& g_errMod16; // 005cf874 extern HWND& g_gameHWND1; // 005cf964 extern long& lpDefault_005cf96c; // 005cf96c extern byte& g_ucErmNbOfModule; // 005d2638 extern mod1_ptrs& g_mod1_ptrs; // 005d2644 extern undefined4& DAT_005d2660; // 005d2660 +extern undefined& DAT_005d266c; // 005d266c +extern undefined1& DAT_005d266d; // 005d266d extern undefined1& DAT_005d26a8; // 005d26a8 extern undefined& lpVolumeNameBuffer_005d27b0; // 005d27b0 extern r3_main_data& r3_main_data_005d28b6; // 005d28b6 @@ -170,11 +198,23 @@ extern char(&s_quitting1)[64]; // 007825c0 extern char(&s_wndStrQuiting)[56]; // 00782600 extern tdstLastErrorInfo(&g_stErmTheLastErrorInfo)[3]; // 00782640 extern pointer& g_errDat4; // 00782644 +extern undefined1& DAT_0078266c; // 0078266c extern tdstBlockInfoPriv *(&g_a_p_stMmgModuleBlocksInfo)[255]; // 0078f6a0 extern undefined& g_MmgCriticalSection; // 0078faa0 extern char(&g_a_ucBlocksNbInModule)[255]; // 0078fac0 extern tdstGeneralChannelsInfo_& g_stGeneralChannelInfo; // 0078fbc0 extern tdstCurrentModeInfo *& g_d_stCurrentModeInfo; // 0078fbc8 +extern undefined4& DAT_00794cec; // 00794cec +extern dword& DWORD_00794d00; // 00794d00 +extern dword& DWORD_00794d04; // 00794d04 +extern undefined1& DAT_007a0cd8; // 007a0cd8 +extern uint& DAT_007a2c14; // 007a2c14 +extern byte& g_bink_videoBpp; // 007a2e00 +extern byte& g_bink_wantedVideoQuality; // 007a2e02 +extern byte& g_bink_realVideoQuality; // 007a2e03 +extern byte& g_bink_autoAdjustQuality; // 007a2e04 +extern uint& DAT_007a2e0c; // 007a2e0c +extern int& g_bink_wantedVideoQualityPlus1; // 007a2e10 extern undefined& DAT_007d7d84; // 007d7d84 extern GAM_tdstEngineStructure& g_r3_engine; // 007d7dc0 extern undefined2& DAT_007d7ea8; // 007d7ea8 @@ -188,12 +228,13 @@ extern uint& DAT_007d9cc4; // 007d9cc4 extern undefined& g_config_unused0; // 007d9df0 extern undefined& lpSystemTime_007d9e40; // 007d9e40 extern undefined4& DAT_007d9e60; // 007d9e60 -extern undefined2& DAT_007d9e68; // 007d9e68 -extern word& WORD_007d9e6a; // 007d9e6a +extern word& WORD_007d9e68; // 007d9e68 +extern char(&sz_S)[2]; // 007d9e6a extern word& WORD_007d9e6c; // 007d9e6c -extern word& WORD_007d9e6e; // 007d9e6e +extern char(&sz_M)[2]; // 007d9e6e extern undefined& lpRootPathName_007d9e70; // 007d9e70 extern undefined3& UNK_007d9e71; // 007d9e71 +extern dword& DWORD_007eb200; // 007eb200 extern undefined& g_GLI_fullscreen; // 007edd40 extern int& g_GLI_width0; // 007edd44 extern int& g_GLI_height0; // 007edd48 diff --git a/game_re/gh_stub/r3_module10input_init.cxx b/game_re/gh_stub/r3_module10input_init.cxx deleted file mode 100644 index 8249fac6..00000000 --- a/game_re/gh_stub/r3_module10input_init.cxx +++ /dev/null @@ -1,14 +0,0 @@ -// AUTO-GENERATED FILE!!!! -// This function has yet to be decompiled using 'Dump Current Function' in ghidra -// with possible manualy fixes - -#include -#include -#include - -// 00504ef0 -// r3_module10input_init -extern "C" undefined r3_module10input_init(void) { - // TODO: Implement this function - throw GHStubException("Function not implemented: r3_module10input_init"); -} diff --git a/game_re/gh_stub/r3_module11_init.cxx b/game_re/gh_stub/r3_module11_init.cxx deleted file mode 100644 index 6c73b869..00000000 --- a/game_re/gh_stub/r3_module11_init.cxx +++ /dev/null @@ -1,14 +0,0 @@ -// AUTO-GENERATED FILE!!!! -// This function has yet to be decompiled using 'Dump Current Function' in ghidra -// with possible manualy fixes - -#include -#include -#include - -// 00554fc0 -// r3_module11_init -extern "C" undefined r3_module11_init(void) { - // TODO: Implement this function - throw GHStubException("Function not implemented: r3_module11_init"); -} diff --git a/game_re/gh_stub/r3_module12_init.cxx b/game_re/gh_stub/r3_module12_init.cxx deleted file mode 100644 index 50c4e456..00000000 --- a/game_re/gh_stub/r3_module12_init.cxx +++ /dev/null @@ -1,14 +0,0 @@ -// AUTO-GENERATED FILE!!!! -// This function has yet to be decompiled using 'Dump Current Function' in ghidra -// with possible manualy fixes - -#include -#include -#include - -// 0055ab30 -// r3_module12_init -extern "C" undefined r3_module12_init(void) { - // TODO: Implement this function - throw GHStubException("Function not implemented: r3_module12_init"); -} diff --git a/game_re/gh_stub/r3_module14_init.cxx b/game_re/gh_stub/r3_module14_init.cxx deleted file mode 100644 index 5beff603..00000000 --- a/game_re/gh_stub/r3_module14_init.cxx +++ /dev/null @@ -1,14 +0,0 @@ -// AUTO-GENERATED FILE!!!! -// This function has yet to be decompiled using 'Dump Current Function' in ghidra -// with possible manualy fixes - -#include -#include -#include - -// 00588120 -// r3_module14_init -extern "C" undefined r3_module14_init(void) { - // TODO: Implement this function - throw GHStubException("Function not implemented: r3_module14_init"); -} diff --git a/game_re/gh_stub/r3_module15_init.cxx b/game_re/gh_stub/r3_module15_init.cxx deleted file mode 100644 index 99ed4792..00000000 --- a/game_re/gh_stub/r3_module15_init.cxx +++ /dev/null @@ -1,14 +0,0 @@ -// AUTO-GENERATED FILE!!!! -// This function has yet to be decompiled using 'Dump Current Function' in ghidra -// with possible manualy fixes - -#include -#include -#include - -// 0058eb70 -// r3_module15_init -extern "C" undefined r3_module15_init(void) { - // TODO: Implement this function - throw GHStubException("Function not implemented: r3_module15_init"); -} diff --git a/game_re/gh_stub/r3_module16_init.cxx b/game_re/gh_stub/r3_module16_init.cxx deleted file mode 100644 index 49609a29..00000000 --- a/game_re/gh_stub/r3_module16_init.cxx +++ /dev/null @@ -1,14 +0,0 @@ -// AUTO-GENERATED FILE!!!! -// This function has yet to be decompiled using 'Dump Current Function' in ghidra -// with possible manualy fixes - -#include -#include -#include - -// 0058ee90 -// r3_module16_init -extern "C" undefined r3_module16_init(void) { - // TODO: Implement this function - throw GHStubException("Function not implemented: r3_module16_init"); -} diff --git a/game_re/gh_stub/r3_module5_init.cxx b/game_re/gh_stub/r3_module5_init.cxx deleted file mode 100644 index 2d3d8aa7..00000000 --- a/game_re/gh_stub/r3_module5_init.cxx +++ /dev/null @@ -1,14 +0,0 @@ -// AUTO-GENERATED FILE!!!! -// This function has yet to be decompiled using 'Dump Current Function' in ghidra -// with possible manualy fixes - -#include -#include -#include - -// 0045d2c0 -// r3_module5_init -extern "C" undefined r3_module5_init(void) { - // TODO: Implement this function - throw GHStubException("Function not implemented: r3_module5_init"); -} diff --git a/game_re/gh_stub/r3_module8_init.cxx b/game_re/gh_stub/r3_module8_init.cxx deleted file mode 100644 index b8791ad1..00000000 --- a/game_re/gh_stub/r3_module8_init.cxx +++ /dev/null @@ -1,14 +0,0 @@ -// AUTO-GENERATED FILE!!!! -// This function has yet to be decompiled using 'Dump Current Function' in ghidra -// with possible manualy fixes - -#include -#include -#include - -// 004fa430 -// r3_module8_init -extern "C" undefined r3_module8_init(void) { - // TODO: Implement this function - throw GHStubException("Function not implemented: r3_module8_init"); -} diff --git a/game_re/gh_stub/r3_module9_init.cxx b/game_re/gh_stub/r3_module9_init.cxx deleted file mode 100644 index 3a616502..00000000 --- a/game_re/gh_stub/r3_module9_init.cxx +++ /dev/null @@ -1,14 +0,0 @@ -// AUTO-GENERATED FILE!!!! -// This function has yet to be decompiled using 'Dump Current Function' in ghidra -// with possible manualy fixes - -#include -#include -#include - -// 00500570 -// r3_module9_init -extern "C" undefined r3_module9_init(void) { - // TODO: Implement this function - throw GHStubException("Function not implemented: r3_module9_init"); -} diff --git a/game_re/gh_stub/FUN_00470ef0.cxx b/game_re/gh_stub/r3_readBinkVideoConfig.cxx similarity index 60% rename from game_re/gh_stub/FUN_00470ef0.cxx rename to game_re/gh_stub/r3_readBinkVideoConfig.cxx index 1f3c33cc..020d75f6 100644 --- a/game_re/gh_stub/FUN_00470ef0.cxx +++ b/game_re/gh_stub/r3_readBinkVideoConfig.cxx @@ -6,9 +6,9 @@ #include #include -// 00470ef0 -// FUN_00470ef0 -extern "C" undefined FUN_00470ef0(undefined4 param_1) { +// 00441e70 +// r3_readBinkVideoConfig +extern "C" void r3_readBinkVideoConfig(void) { // TODO: Implement this function - throw GHStubException("Function not implemented: FUN_00470ef0"); + throw GHStubException("Function not implemented: r3_readBinkVideoConfig"); } diff --git a/game_re/globals.txt b/game_re/globals.txt index 8b4589f1..82335ee9 100644 --- a/game_re/globals.txt +++ b/game_re/globals.txt @@ -1,3 +1,5 @@ +0059733c || PTR__BinkOpenDirectSound@4_0059733c || / || undefined * +005a9ed4 || DAT_005a9ed4 || / || undefined 005b63e0 || s__s_not_initialized__005b63e0 || / || char[20] 005b63f4 || s_Please_run_the__s_setup__005b63f4 || / || char[28] 005b6410 || s_dashCC || / || char[4] @@ -57,9 +59,22 @@ 005b690c || s_UbiSoft_Ubi_ini || / || TerminatedCString 005bad58 || s_percent_d || / || undefined 005bd29c || g_errMod0 || / || byte +005bd318 || s_Warning_error__005bd318 || / || string +005bd328 || s_Fatale_error__005bd328 || / || string +005bd338 || s_Fatale_error__005bd338 || / || string +005bd348 || s_Strange__The_last_error_was_neve_005bd348 || / || string +005bd374 || s_Error_in_the_Erm__005bd374 || / || string +005bd388 || s_There_is_no_more_Channel_error_t_005bd388 || / || string 005bd4cc || g_errMod1 || / || byte 005bd58c || g_errModMmg || / || byte +005bd5f4 || DAT_005bd5f4 || / || char +005bd630 || s_Video_AutoAdjustQuality_005bd630 || / || string +005bd648 || s_Video_BPP_005bd648 || / || string +005bd654 || s_Video_RealQuality_005bd654 || / || string +005bd668 || s_Rayman_Arena_005bd668 || / || string +005bd678 || s_Video_WantedQuality_005bd678 || / || string 005bd72c || s_Videos_005bd72c || / || string +005bd7ac || g_errMod2Bink || / || byte 005bd9e8 || s__World_Sound_005bd9e8 || / || string 005bd9f8 || s__Options_005bd9f8 || / || string 005bda04 || s__Vignette_005bda04 || / || string @@ -108,8 +123,9 @@ 005be548 || s_r3_program_files || / || string 005be568 || PTR_DAT_005be568 || / || undefined * 005be6f0 || g_errModFirst || / || byte -005bf004 || DAT_005bf004 || / || word -005bf008 || DAT_005bf008 || / || word +005befbc || g_errMod5 || / || byte +005bf004 || s_M_005bf004 || / || char[2] +005bf008 || s_S_005bf008 || / || char[2] 005bf6d8 || s__08X__04X__04X__02X_02X__02X_02X_005bf6d8 || / || string 005bf740 || r3_textureMemMode || / || dword 005bf744 || s_Agp8_005bf744 || / || TerminatedCString @@ -121,13 +137,25 @@ 005c069c || g_errMod7 || / || byte 005c0f20 || DAT_005c0f20 || / || undefined2 005c0f22 || DAT_005c0f22 || / || char +005c1400 || g_errMod17 || / || byte +005c4b0c || g_errMod8 || / || byte +005c4dcc || g_errMod9 || / || byte +005c506c || g_errMod7 || / || byte +005c51f4 || g_errMod10 || / || byte 005c67c8 || g_config_camera_hor_axis || /windef.h || UINT 005c67cc || g_config_camera_ver_axis || /windef.h || UINT +005caf2c || g_errMod11 || / || byte +005cb16c || g_errMod12 || / || byte +005cf5d4 || g_errMod14 || / || byte +005cf814 || g_errMod15 || / || byte +005cf874 || g_errMod16 || / || byte 005cf964 || g_gameHWND1 || /windef.h || HWND 005cf96c || lpDefault_005cf96c || / || long 005d2638 || g_ucErmNbOfModule || / || byte 005d2644 || g_mod1_ptrs || / || mod1_ptrs 005d2660 || DAT_005d2660 || / || undefined4 +005d266c || DAT_005d266c || / || undefined +005d266d || DAT_005d266d || / || undefined1 005d26a8 || DAT_005d26a8 || / || undefined1 005d27b0 || lpVolumeNameBuffer_005d27b0 || / || undefined 005d28b6 || r3_main_data_005d28b6 || / || r3_main_data @@ -163,11 +191,23 @@ 00782600 || s_wndStrQuiting || / || char[56] 00782640 || g_stErmTheLastErrorInfo || / || tdstLastErrorInfo[3] 00782644 || g_errDat4 || / || pointer +0078266c || DAT_0078266c || / || undefined1 0078f6a0 || g_a_p_stMmgModuleBlocksInfo || /mmg.h || tdstBlockInfoPriv *[255] 0078faa0 || g_MmgCriticalSection || / || undefined 0078fac0 || g_a_ucBlocksNbInModule || / || char[255] 0078fbc0 || g_stGeneralChannelInfo || /mmg.h || tdstGeneralChannelsInfo_ 0078fbc8 || g_d_stCurrentModeInfo || /mmg.h || tdstCurrentModeInfo * +00794cec || DAT_00794cec || / || undefined4 +00794d00 || DWORD_00794d00 || / || dword +00794d04 || DWORD_00794d04 || / || dword +007a0cd8 || DAT_007a0cd8 || / || undefined1 +007a2c14 || DAT_007a2c14 || / || uint +007a2e00 || g_bink_videoBpp || / || byte +007a2e02 || g_bink_wantedVideoQuality || / || byte +007a2e03 || g_bink_realVideoQuality || / || byte +007a2e04 || g_bink_autoAdjustQuality || / || byte +007a2e0c || DAT_007a2e0c || / || uint +007a2e10 || g_bink_wantedVideoQualityPlus1 || / || int 007d7d84 || DAT_007d7d84 || / || undefined 007d7dc0 || g_r3_engine || /engine.h || GAM_tdstEngineStructure 007d7ea8 || DAT_007d7ea8 || / || undefined2 @@ -181,12 +221,13 @@ 007d9df0 || g_config_unused0 || / || undefined 007d9e40 || lpSystemTime_007d9e40 || / || undefined 007d9e60 || DAT_007d9e60 || / || undefined4 -007d9e68 || DAT_007d9e68 || / || undefined2 -007d9e6a || WORD_007d9e6a || / || word +007d9e68 || WORD_007d9e68 || / || word +007d9e6a || sz_S || / || char[2] 007d9e6c || WORD_007d9e6c || / || word -007d9e6e || WORD_007d9e6e || / || word +007d9e6e || sz_M || / || char[2] 007d9e70 || lpRootPathName_007d9e70 || / || undefined 007d9e71 || UNK_007d9e71 || / || undefined3 +007eb200 || DWORD_007eb200 || / || dword 007edd40 || g_GLI_fullscreen || / || undefined 007edd44 || g_GLI_width0 || / || int 007edd48 || g_GLI_height0 || / || int diff --git a/game_re/r3/binders/auto.h b/game_re/r3/binders/auto.h index b0b3ec95..1cb96277 100644 --- a/game_re/r3/binders/auto.h +++ b/game_re/r3/binders/auto.h @@ -87,6 +87,11 @@ inline constexpr cc_type_t CONCAT23(T0 a, T1 b) { return cc_type_t(a) << 24 | cc_type_t(b); } +template +inline constexpr cc_type_t CONCAT31(T0 a, T1 b) { + return cc_type_t(a) << 8 | cc_type_t(b); +} + template inline constexpr char SUB21(T0 a, size_t b) { return cc_type_t(a) >> (b * 8); } @@ -99,6 +104,8 @@ template inline constexpr uint16_t SUB42(T0 a, size_t b) { return cc_type_t(a) >> (b * 8); } +inline longlong r3_ftol(float a) { return (longlong)a; } + constexpr byte R3ModId_not_initialized = 0xff; #include "stubexcept.h" diff --git a/game_re/r3/binders/base.h b/game_re/r3/binders/base.h index 518500fc..150242c3 100644 --- a/game_re/r3/binders/base.h +++ b/game_re/r3/binders/base.h @@ -12,6 +12,7 @@ #include #include +typedef long long longlong; typedef uint8_t undefined; typedef uint32_t undefined4; typedef uint16_t undefined2; @@ -28,6 +29,9 @@ struct undefined3 { _2 = (other >> 16) & 0xff; return *this; } + operator uint32_t() const { + return _0 | (_1 << 8) | (_2 << 16); + } }; typedef unsigned char byte; typedef byte undefined1; diff --git a/game_re/third_party/bink/bink.h b/game_re/third_party/bink/bink.h new file mode 100644 index 00000000..5c09e767 --- /dev/null +++ b/game_re/third_party/bink/bink.h @@ -0,0 +1,714 @@ +#ifndef __BINKH__ +#define __BINKH__ + +#define BINKMAJORVERSION 1 +#define BINKMINORVERSION 5 +#define BINKSUBVERSION 21 +#define BINKVERSION "1.5y" +#define BINKDATE "2003-09-23" + +#ifndef __RADRES__ + +#ifndef __RADBASEH__ +#include "radbase.h" +#endif + +RADDEFSTART + +typedef struct BINK PTR4* HBINK; + +struct BINKIO; +typedef S32 (RADLINK PTR4* BINKIOOPEN) (struct BINKIO PTR4* Bnkio, const char PTR4 *name, U32 flags); +typedef U32 (RADLINK PTR4* BINKIOREADHEADER) (struct BINKIO PTR4* Bnkio, S32 Offset, void PTR4* Dest,U32 Size); +typedef U32 (RADLINK PTR4* BINKIOREADFRAME) (struct BINKIO PTR4* Bnkio, U32 Framenum,S32 origofs,void PTR4* dest,U32 size); +typedef U32 (RADLINK PTR4* BINKIOGETBUFFERSIZE)(struct BINKIO PTR4* Bnkio, U32 Size); +typedef void (RADLINK PTR4* BINKIOSETINFO) (struct BINKIO PTR4* Bnkio, void PTR4* Buf,U32 Size,U32 FileSize,U32 simulate); +typedef U32 (RADLINK PTR4* BINKIOIDLE) (struct BINKIO PTR4* Bnkio); +typedef void (RADLINK PTR4* BINKIOCLOSE) (struct BINKIO PTR4* Bnkio); + +typedef void (RADLINK PTR4* BINKCBSUSPEND) (struct BINKIO PTR4* Bnkio); +typedef S32 (RADLINK PTR4* BINKCBTRYSUSPEND) (struct BINKIO PTR4* Bnkio); +typedef void (RADLINK PTR4* BINKCBRESUME) (struct BINKIO PTR4* Bnkio); +typedef void (RADLINK PTR4* BINKCBIDLE) (struct BINKIO PTR4* Bnkio); + +typedef struct BINKIO { + BINKIOREADHEADER ReadHeader; + BINKIOREADFRAME ReadFrame; + BINKIOGETBUFFERSIZE GetBufferSize; + BINKIOSETINFO SetInfo; + BINKIOIDLE Idle; + BINKIOCLOSE Close; + HBINK bink; + volatile U32 ReadError; + volatile U32 DoingARead; + volatile U32 BytesRead; + volatile U32 Working; + volatile U32 TotalTime; + volatile U32 ForegroundTime; + volatile U32 IdleTime; + volatile U32 ThreadTime; + volatile U32 BufSize; + volatile U32 BufHighUsed; + volatile U32 CurBufSize; + volatile U32 CurBufUsed; + volatile U8 iodata[128+32]; + + // filled in by the caller + BINKCBSUSPEND suspend_callback; + BINKCBTRYSUSPEND try_suspend_callback; + BINKCBRESUME resume_callback; + BINKCBIDLE idle_on_callback; + volatile U32 callback_control[16]; // buffer for background IO callback +} BINKIO; + +struct BINKSND; +typedef S32 (RADLINK PTR4* BINKSNDOPEN) (struct BINKSND PTR4* BnkSnd, U32 freq, S32 bits, S32 chans, U32 flags, HBINK bink); +typedef S32 (RADLINK PTR4* BINKSNDREADY) (struct BINKSND PTR4* BnkSnd); +typedef S32 (RADLINK PTR4* BINKSNDLOCK) (struct BINKSND PTR4* BnkSnd, U8 PTR4* PTR4* addr, U32 PTR4* len); +typedef S32 (RADLINK PTR4* BINKSNDUNLOCK) (struct BINKSND PTR4* BnkSnd, U32 filled); +typedef void (RADLINK PTR4* BINKSNDVOLUME) (struct BINKSND PTR4* BnkSnd, S32 volume); +typedef void (RADLINK PTR4* BINKSNDPAN) (struct BINKSND PTR4* BnkSnd, S32 pan); +typedef void (RADLINK PTR4* BINKSNDMIXBINS) (struct BINKSND PTR4* BnkSnd, U32 PTR4* mix_bins, U32 total); +typedef void (RADLINK PTR4* BINKSNDMIXBINVOLS) (struct BINKSND PTR4* BnkSnd, U32 PTR4* vol_mix_bins, S32 PTR4* volumes, U32 total ); +typedef S32 (RADLINK PTR4* BINKSNDONOFF) (struct BINKSND PTR4* BnkSnd, S32 status); +typedef S32 (RADLINK PTR4* BINKSNDPAUSE) (struct BINKSND PTR4* BnkSnd, S32 status); +typedef void (RADLINK PTR4* BINKSNDCLOSE) (struct BINKSND PTR4* BnkSnd); + +typedef BINKSNDOPEN (RADLINK PTR4* BINKSNDSYSOPEN) (U32 param); + +typedef struct BINKSND { + BINKSNDREADY Ready; + BINKSNDLOCK Lock; + BINKSNDUNLOCK Unlock; + BINKSNDVOLUME Volume; + BINKSNDPAN Pan; + BINKSNDPAUSE Pause; + BINKSNDONOFF SetOnOff; + BINKSNDCLOSE Close; + BINKSNDMIXBINS MixBins; + BINKSNDMIXBINVOLS MixBinVols; + + U32 sndbufsize; // sound buffer size + U8 PTR4* sndbuf; // sound buffer + U8 PTR4* sndend; // end of the sound buffer + U8 PTR4* sndwritepos; // current write position + U8 PTR4* sndreadpos; // current read position + U32 sndcomp; // sound compression handle + U32 sndamt; // amount of sound currently in the buffer + U32 sndconvert8; // convert back to 8-bit sound at runtime + U32 sndendframe; // frame number that the sound ends on + U32 sndprime; // amount of data to prime the playahead + U32 sndpad; // padded this much audio + + U32 BestSizeIn16; + U32 BestSizeMask; + U32 SoundDroppedOut; + S32 NoThreadService; + S32 OnOff; + U32 Latency; + U32 VideoScale; + U32 freq; + S32 bits,chans; + U8 snddata[256]; +} BINKSND; + +typedef struct BINKRECT { + S32 Left,Top,Width,Height; +} BINKRECT; + +#define BINKMAXDIRTYRECTS 8 + +typedef struct BUNDLEPOINTERS { + void* typeptr; + void* type16ptr; + void* colorptr; + void* bits2ptr; + void* motionXptr; + void* motionYptr; + void* dctptr; + void* mdctptr; + void* patptr; +} BUNDLEPOINTERS; + + +typedef struct BINK { + U32 Width; // Width (1 based, 640 for example) + U32 Height; // Height (1 based, 480 for example) + U32 Frames; // Number of frames (1 based, 100 = 100 frames) + U32 FrameNum; // Frame to *be* displayed (1 based) + U32 LastFrameNum; // Last frame decompressed or skipped (1 based) + + U32 FrameRate; // Frame Rate Numerator + U32 FrameRateDiv; // Frame Rate Divisor (frame rate=numerator/divisor) + + U32 ReadError; // Non-zero if a read error has ocurred + U32 OpenFlags; // flags used on open + U32 BinkType; // Bink flags + + U32 Size; // size of file + U32 FrameSize; // The current frame's size in bytes + U32 SndSize; // The current frame sound tracks' size in bytes + + BINKRECT FrameRects[BINKMAXDIRTYRECTS];// Dirty rects from BinkGetRects + S32 NumRects; + + U32 PlaneNum; // which set of planes is current + void PTR4* YPlane[2]; // pointer to the uncompressed Y (Cr and Cr follow) + void PTR4* APlane[2]; // decompressed alpha plane (if present) + U32 YWidth; // widths and heights of the video planes + U32 YHeight; + U32 UVWidth; + U32 UVHeight; + + void PTR4* MaskPlane; // pointer to the mask plane (Ywidth/16*Yheight/16) + U32 MaskPitch; // Mask Pitch + U32 MaskLength; // total length of the mask plane + + U32 LargestFrameSize; // Largest frame size + U32 InternalFrames; // how many frames were potentially compressed + + S32 NumTracks; // how many tracks + + U32 Highest1SecRate; // Highest 1 sec data rate + U32 Highest1SecFrame; // Highest 1 sec data rate starting frame + + S32 Paused; // is the bink movie paused? + + U32 BackgroundThread; // handle to background thread + + // everything below is for internal Bink use + + void PTR4* compframe; // compressed frame data + void PTR4* preloadptr; // preloaded compressed frame data + U32* frameoffsets; // offsets of each of the frames + + BINKIO bio; // IO structure + U8 PTR4* ioptr; // io buffer ptr + U32 iosize; // io buffer size + U32 decompwidth; // width not include scaling + U32 decompheight; // height not include scaling + + S32 PTR4* trackindexes; // track indexes + U32 PTR4* tracksizes; // largest single frame of track + U32 PTR4* tracktypes; // type of each sound track + S32 PTR4* trackIDs; // external track numbers + + U32 numrects; // number of rects from BinkGetRects + + U32 playedframes; // how many frames have we played + U32 firstframetime; // very first frame start + U32 startframetime; // start frame start + U32 startblittime; // start of blit period + U32 startsynctime; // start of synched time + U32 startsyncframe; // frame of startsynctime + U32 twoframestime; // two frames worth of time + U32 entireframetime; // entire frame time + + U32 slowestframetime; // slowest frame in ms + U32 slowestframe; // slowest frame number + U32 slowest2frametime; // second slowest frame in ms + U32 slowest2frame; // second slowest frame + + U32 soundon; // sound turned on? + U32 videoon; // video turned on? + + U32 totalmem; // total memory used + U32 timevdecomp; // total time decompressing video + U32 timeadecomp; // total time decompressing audio + U32 timeblit; // total time blitting + U32 timeopen; // total open time + + U32 fileframerate; // frame rate originally in the file + U32 fileframeratediv; + + U32 runtimeframes; // max frames for runtime analysis + U32 runtimemoveamt; // bytes to move each frame + U32 PTR4* rtframetimes; // start times for runtime frames + U32 PTR4* rtadecomptimes; // decompress times for runtime frames + U32 PTR4* rtvdecomptimes; // decompress times for runtime frames + U32 PTR4* rtblittimes; // blit times for runtime frames + U32 PTR4* rtreadtimes; // read times for runtime frames + U32 PTR4* rtidlereadtimes; // idle read times for runtime frames + U32 PTR4* rtthreadreadtimes;// thread read times for runtime frames + + U32 lastblitflags; // flags used on last blit + U32 lastdecompframe; // last frame number decompressed + + U32 lastresynctime; // last loop point that we did a resync on + U32 doresync; // should we do a resync in the next doframe? + + U32 playingtracks; // how many tracks are playing + U32 soundskips; // number of sound stops + BINKSND PTR4* bsnd; // SND structures + U32 skippedlastblit; // skipped last frame? + U32 skipped_this_frame; // skipped the current frame? + U32 skippedblits; // how many blits were skipped + + BUNDLEPOINTERS bunp; // pointers to internal temporary memory + U32 skipped_in_a_row; // how many frames have we skipped in a row + U32 big_sound_skip_adj; // adjustment for large skips + U32 big_sound_skip_reduce; // amount to reduce large skips by each frame + U32 last_time_almost_empty; // time of last almost empty IO buffer + U32 last_read_count; // counter to keep track of the last bink IO + U32 last_sound_count; // counter to keep track of the last bink sound + U32 snd_callback_buffer[16]; // buffer for background sound callback +} BINK; + + +typedef struct BINKSUMMARY { + U32 Width; // Width of frames + U32 Height; // Height of frames + U32 TotalTime; // total time (ms) + U32 FileFrameRate; // frame rate + U32 FileFrameRateDiv; // frame rate divisor + U32 FrameRate; // frame rate + U32 FrameRateDiv; // frame rate divisor + U32 TotalOpenTime; // Time to open and prepare for decompression + U32 TotalFrames; // Total Frames + U32 TotalPlayedFrames; // Total Frames played + U32 SkippedFrames; // Total number of skipped frames + U32 SkippedBlits; // Total number of skipped blits + U32 SoundSkips; // Total number of sound skips + U32 TotalBlitTime; // Total time spent blitting + U32 TotalReadTime; // Total time spent reading + U32 TotalVideoDecompTime; // Total time spent decompressing video + U32 TotalAudioDecompTime; // Total time spent decompressing audio + U32 TotalIdleReadTime; // Total time spent reading while idle + U32 TotalBackReadTime; // Total time spent reading in background + U32 TotalReadSpeed; // Total io speed (bytes/second) + U32 SlowestFrameTime; // Slowest single frame time (ms) + U32 Slowest2FrameTime; // Second slowest single frame time (ms) + U32 SlowestFrameNum; // Slowest single frame number + U32 Slowest2FrameNum; // Second slowest single frame number + U32 AverageDataRate; // Average data rate of the movie + U32 AverageFrameSize; // Average size of the frame + U32 HighestMemAmount; // Highest amount of memory allocated + U32 TotalIOMemory; // Total extra memory allocated + U32 HighestIOUsed; // Highest extra memory actually used + U32 Highest1SecRate; // Highest 1 second rate + U32 Highest1SecFrame; // Highest 1 second start frame +} BINKSUMMARY; + + +typedef struct BINKREALTIME { + U32 FrameNum; // Current frame number + U32 FrameRate; // frame rate + U32 FrameRateDiv; // frame rate divisor + U32 Frames; // frames in this sample period + U32 FramesTime; // time is ms for these frames + U32 FramesVideoDecompTime; // time decompressing these frames + U32 FramesAudioDecompTime; // time decompressing these frames + U32 FramesReadTime; // time reading these frames + U32 FramesIdleReadTime; // time reading these frames at idle + U32 FramesThreadReadTime; // time reading these frames in background + U32 FramesBlitTime; // time blitting these frames + U32 ReadBufferSize; // size of read buffer + U32 ReadBufferUsed; // amount of read buffer currently used + U32 FramesDataRate; // data rate for these frames +} BINKREALTIME; + +#define BINKMARKER1 'fKIB' +#define BINKMARKER2 'gKIB' // new Bink files use this tag +#define BINKMARKER3 'hKIB' // newer Bink files use this tag +#define BINKMARKER4 'iKIB' // even newer Bink files use this tag + +typedef struct BINKHDR { + U32 Marker; // Bink marker + U32 Size; // size of the file-8 + U32 Frames; // Number of frames (1 based, 100 = 100 frames) + U32 LargestFrameSize; // Size in bytes of largest frame + U32 InternalFrames; // Number of internal frames + + U32 Width; // Width (1 based, 640 for example) + U32 Height; // Height (1 based, 480 for example) + U32 FrameRate; // frame rate + U32 FrameRateDiv; // frame rate divisor (framerate/frameratediv=fps) + + U32 Flags; // height compression options + U32 NumTracks; // number of tracks +} BINKHDR; + + +//======================================================================= +#define BINKYAINVERT 0x00000800L // Reverse Y and A planes when blitting (for debugging) +#define BINKFRAMERATE 0x00001000L // Override fr (call BinkFrameRate first) +#define BINKPRELOADALL 0x00002000L // Preload the entire animation +#define BINKSNDTRACK 0x00004000L // Set the track number to play +#define BINKOLDFRAMEFORMAT 0x00008000L // using the old Bink frame format (internal use only) +#define BINKRBINVERT 0x00010000L // use reversed R and B planes (internal use only) +#define BINKGRAYSCALE 0x00020000L // Force Bink to use grayscale +#define BINKNOMMX 0x00040000L // Don't use MMX +#define BINKNOSKIP 0x00080000L // Don't skip frames if falling behind +#define BINKALPHA 0x00100000L // Decompress alpha plane (if present) +#define BINKNOFILLIOBUF 0x00200000L // Fill the IO buffer in SmackOpen +#define BINKSIMULATE 0x00400000L // Simulate the speed (call BinkSim first) +#define BINKFILEHANDLE 0x00800000L // Use when passing in a file handle +#define BINKIOSIZE 0x01000000L // Set an io size (call BinkIOSize first) +#define BINKIOPROCESSOR 0x02000000L // Set an io processor (call BinkIO first) +#define BINKFROMMEMORY 0x04000000L // Use when passing in a pointer to the file +#define BINKNOTHREADEDIO 0x08000000L // Don't use a background thread for IO + +#define BINKSURFACEFAST 0x00000000L +#define BINKSURFACESLOW 0x08000000L +#define BINKSURFACEDIRECT 0x04000000L + +#define BINKCOPYALL 0x80000000L // copy all pixels (not just changed) +#define BINKCOPY2XH 0x10000000L // Force doubling height scaling +#define BINKCOPY2XHI 0x20000000L // Force interleaving height scaling +#define BINKCOPY2XW 0x30000000L // copy the width zoomed by two +#define BINKCOPY2XWH 0x40000000L // copy the width and height zoomed by two +#define BINKCOPY2XWHI 0x50000000L // copy the width and height zoomed by two +#define BINKCOPY1XI 0x60000000L // copy the width and height zoomed by two +#define BINKCOPYNOSCALING 0x70000000L // Force scaling off + +//#define BINKALPHA 0x00100000L // Decompress alpha plane (if present) +//#define BINKNOSKIP 0x00080000L // don't skip the blit if behind in sound +//#define BINKNOMMX 0x00040000L // Don't skip frames if falling behind +//#define BINKGRAYSCALE 0x00020000L // force Bink to use grayscale +//#define BINKRBINVERT 0x00010000L // use reversed R and B planes + +#define BINKSURFACE8P 0 +#define BINKSURFACE24 1 +#define BINKSURFACE24R 2 +#define BINKSURFACE32 3 +#define BINKSURFACE32R 4 +#define BINKSURFACE32A 5 +#define BINKSURFACE32RA 6 +#define BINKSURFACE4444 7 +#define BINKSURFACE5551 8 +#define BINKSURFACE555 9 +#define BINKSURFACE565 10 +#define BINKSURFACE655 11 +#define BINKSURFACE664 12 +#define BINKSURFACEYUY2 13 +#define BINKSURFACEUYVY 14 +#define BINKSURFACEYV12 15 +#define BINKSURFACEMASK 15 + +#ifdef __RADXBOX__ + +#define BINKSURFACESALL 32 +#define BINKCONVERTERSMONO 64 +#define BINKCONVERTERS2X 256 + +#define BINKCONVERTERSALL (BINKSURFACESALL|BINKCONVERTERSMONO|BINKCONVERTERS2X) + +#define BinkLoad() BinkLoadUnload(1) +#define BinkUnload() BinkLoadUnload(0) + +#define BinkLoadConverter(val) BinkLoadUnloadConverter(val,1) +#define BinkUnloadConverter(val) BinkLoadUnloadConverter(val,0) + +RADEXPFUNC void RADEXPLINK BinkLoadUnload( S32 inout ); +RADEXPFUNC void RADEXPLINK BinkLoadUnloadConverter( U32 surfaces, S32 inout ); + +#endif + +#define BINKGOTOQUICK 1 +#define BINKGOTOQUICKSOUND 2 + +#define BINKGETKEYPREVIOUS 0 +#define BINKGETKEYNEXT 1 +#define BINKGETKEYCLOSEST 2 +#define BINKGETKEYNOTEQUAL 128 + +//======================================================================= + +#ifdef __RADMAC__ + #pragma export on + + RADEXPFUNC HBINK RADEXPLINK BinkMacOpen(void /*FSSpec*/ * fsp,U32 flags); +#endif + +RADEXPFUNC void PTR4* RADEXPLINK BinkLogoAddress(void); + +RADEXPFUNC void RADEXPLINK BinkSetError(const char PTR4* err); +RADEXPFUNC char PTR4* RADEXPLINK BinkGetError(void); + +RADEXPFUNC HBINK RADEXPLINK BinkOpen(const char PTR4* name,U32 flags); + +RADEXPFUNC S32 RADEXPLINK BinkDoFrame(HBINK bnk); +RADEXPFUNC void RADEXPLINK BinkNextFrame(HBINK bnk); +RADEXPFUNC S32 RADEXPLINK BinkWait(HBINK bnk); +RADEXPFUNC void RADEXPLINK BinkClose(HBINK bnk); +RADEXPFUNC S32 RADEXPLINK BinkPause(HBINK bnk,S32 pause); +RADEXPFUNC S32 RADEXPLINK BinkCopyToBuffer(HBINK bnk,void* dest,S32 destpitch,U32 destheight,U32 destx,U32 desty,U32 flags); +RADEXPFUNC S32 RADEXPLINK BinkCopyToBufferRect(HBINK bnk,void* dest,S32 destpitch,U32 destheight,U32 destx,U32 desty,U32 srcx, U32 srcy, U32 srcw, U32 srch, U32 flags); +RADEXPFUNC S32 RADEXPLINK BinkGetRects(HBINK bnk,U32 flags); +RADEXPFUNC void RADEXPLINK BinkGoto(HBINK bnk,U32 frame,S32 flags); // use 1 for the first frame +RADEXPFUNC U32 RADEXPLINK BinkGetKeyFrame(HBINK bnk,U32 frame,S32 flags); + +RADEXPFUNC S32 RADEXPLINK BinkSetVideoOnOff(HBINK bnk,S32 onoff); +RADEXPFUNC S32 RADEXPLINK BinkSetSoundOnOff(HBINK bnk,S32 onoff); +RADEXPFUNC void RADEXPLINK BinkFreeGlocalMemory( void ); +RADEXPFUNC void RADEXPLINK BinkSetVolume(HBINK bnk, U32 trackid, S32 volume); +RADEXPFUNC void RADEXPLINK BinkSetPan(HBINK bnk,U32 trackid, S32 pan); +RADEXPFUNC void RADEXPLINK BinkSetMixBins(HBINK bnk,U32 trackid, U32 PTR4* mix_bins, U32 total); +RADEXPFUNC void RADEXPLINK BinkSetMixBinVolumes(HBINK bnk,U32 trackid, U32 PTR4* vol_mix_bins, S32 PTR4* volumes, U32 total); +RADEXPFUNC void RADEXPLINK BinkService(HBINK bink); + +typedef struct BINKTRACK PTR4* HBINKTRACK; + +typedef struct BINKTRACK +{ + U32 Frequency; + U32 Bits; + U32 Channels; + U32 MaxSize; + + HBINK bink; + U32 sndcomp; + S32 trackindex; +} BINKTRACK; + + +RADEXPFUNC HBINKTRACK RADEXPLINK BinkOpenTrack(HBINK bnk,U32 trackindex); +RADEXPFUNC void RADEXPLINK BinkCloseTrack(HBINKTRACK bnkt); +RADEXPFUNC U32 RADEXPLINK BinkGetTrackData(HBINKTRACK bnkt,void PTR4* dest); + +RADEXPFUNC U32 RADEXPLINK BinkGetTrackType(HBINK bnk,U32 trackindex); +RADEXPFUNC U32 RADEXPLINK BinkGetTrackMaxSize(HBINK bnk,U32 trackindex); +RADEXPFUNC U32 RADEXPLINK BinkGetTrackID(HBINK bnk,U32 trackindex); + +RADEXPFUNC void RADEXPLINK BinkGetSummary(HBINK bnk,BINKSUMMARY PTR4* sum); +RADEXPFUNC void RADEXPLINK BinkGetRealtime(HBINK bink,BINKREALTIME PTR4* run,U32 frames); + +RADEXPFUNC void RADEXPLINK BinkSetSoundTrack(U32 total_tracks, U32 PTR4* tracks); +RADEXPFUNC void RADEXPLINK BinkSetIO(BINKIOOPEN io); +RADEXPFUNC void RADEXPLINK BinkSetFrameRate(U32 forcerate,U32 forceratediv); +RADEXPFUNC void RADEXPLINK BinkSetSimulate(U32 sim); +RADEXPFUNC void RADEXPLINK BinkSetIOSize(U32 iosize); + +RADEXPFUNC S32 RADEXPLINK BinkSetSoundSystem(BINKSNDSYSOPEN open, U32 param); + +#ifdef __RADWIN__ + + RADEXPFUNC BINKSNDOPEN RADEXPLINK BinkOpenDirectSound(U32 param); // don't call directly + #define BinkSoundUseDirectSound(lpDS) BinkSetSoundSystem(BinkOpenDirectSound,(U32)lpDS) + + RADEXPFUNC BINKSNDOPEN RADEXPLINK BinkOpenWaveOut(U32 param); // don't call directly + #define BinkSoundUseWaveOut() BinkSetSoundSystem(BinkOpenWaveOut,0) + +#endif + + +#ifndef __RADMAC__ + + RADEXPFUNC BINKSNDOPEN RADEXPLINK BinkOpenMiles(U32 param); // don't call directly + #define BinkSoundUseMiles(hdigdriver) BinkSetSoundSystem(BinkOpenMiles,(U32)hdigdriver) + +#endif + + +#ifdef __RADMAC__ + + RADEXPFUNC BINKSNDOPEN RADEXPLINK BinkOpenSoundManager(U32 param); // don't call directly + #define BinkSoundUseSoundManager() BinkSetSoundSystem(BinkOpenSoundManager,0) + +#endif + +#ifdef __RADLINUX__ + + RADEXPFUNC BINKSNDOPEN RADEXPLINK BinkOpenSDLMixer(U32 param); // don't call directly + #define BinkSoundUseSDLMixer() BinkSetSoundSystem(BinkOpenSDLMixer,0) + +#endif + +#ifdef __RADNGC__ + + typedef void PTR4 * (RADLINK PTR4* RADARAMALLOC) ( U32 num_bytes ); + typedef void (RADLINK PTR4* RADARAMFREE) ( void PTR4 * ptr ); + + typedef struct RADARAMCALLBACKS + { + RADARAMALLOC aram_malloc; + RADARAMFREE aram_free; + } RADARAMCALLBACKS; + + RADEXPFUNC BINKSNDOPEN RADEXPLINK BinkOpenAX(U32 param); // don't call directly + #define BinkSoundUseAX( functions ) BinkSetSoundSystem(BinkOpenAX,(U32)functions) // takes a pointer to RADARAMCALLBACKS + + RADEXPFUNC BINKSNDOPEN RADEXPLINK BinkOpenMusyXSound(U32 param); // don't call directly + #define BinkSoundUseMusyX( ) BinkSetSoundSystem(BinkOpenMusyXSound,0) + +#endif + +#if defined(__RADXBOX__) || defined(__RADWIN__) + +RADEXPFUNC S32 RADEXPLINK BinkDX8SurfaceType(void* lpD3Ds); + +#endif + +#if defined(__RADWIN__) + +RADEXPFUNC S32 RADEXPLINK BinkDX9SurfaceType(void* lpD3Ds); + +#endif + + +// The BinkBuffer API isn't implemented on DOS, Xbox or GameCube +#if !defined(__RADDOS__) && !defined(__RADXBOX__) && !defined(__RADNGC__) + +//========================================================================= +typedef struct BINKBUFFER * HBINKBUFFER; + +#define BINKBUFFERSTRETCHXINT 0x80000000 +#define BINKBUFFERSTRETCHX 0x40000000 +#define BINKBUFFERSHRINKXINT 0x20000000 +#define BINKBUFFERSHRINKX 0x10000000 +#define BINKBUFFERSTRETCHYINT 0x08000000 +#define BINKBUFFERSTRETCHY 0x04000000 +#define BINKBUFFERSHRINKYINT 0x02000000 +#define BINKBUFFERSHRINKY 0x01000000 +#define BINKBUFFERSCALES 0xff000000 +#define BINKBUFFERRESOLUTION 0x00800000 + +#ifdef __RADMAC__ + +//#include +//#include +//#include + +typedef struct BINKBUFFER { + U32 Width; + U32 Height; + U32 WindowWidth; + U32 WindowHeight; + U32 SurfaceType; + void* Buffer; + S32 BufferPitch; + U32 ScreenWidth; + U32 ScreenHeight; + U32 ScreenDepth; + U32 ScaleFlags; + + S32 destx,desty; + S32 wndx,wndy; + U32 wnd; + + S32 noclipping; + U32 type; + S32 issoftcur; + U32 cursorcount; + +} BINKBUFFER; + + +#define BINKBUFFERAUTO 0 +#define BINKBUFFERDIRECT 1 +#define BINKBUFFERGWORLD 2 +#define BINKBUFFERTYPEMASK 31 + +RADEXPFUNC HBINKBUFFER RADEXPLINK BinkBufferOpen( void* /*WindowPtr*/ wnd, U32 width, U32 height, U32 bufferflags); +RADEXPFUNC S32 RADEXPLINK BinkGDSurfaceType( void* /*GDHandle*/ gd ); +RADEXPFUNC S32 RADEXPLINK BinkIsSoftwareCursor(void* /*GDHandle*/ gd); +RADEXPFUNC S32 RADEXPLINK BinkCheckCursor(void* /*WindowPtr*/ wp,S32 x,S32 y,S32 w,S32 h); + +#else + +typedef struct BINKBUFFER { + U32 Width; + U32 Height; + U32 WindowWidth; + U32 WindowHeight; + U32 SurfaceType; + void* Buffer; + S32 BufferPitch; + S32 ClientOffsetX; + S32 ClientOffsetY; + U32 ScreenWidth; + U32 ScreenHeight; + U32 ScreenDepth; + U32 ExtraWindowWidth; + U32 ExtraWindowHeight; + U32 ScaleFlags; + U32 StretchWidth; + U32 StretchHeight; + + S32 surface; + void* ddsurface; + void* ddclipper; + S32 destx,desty; + S32 wndx,wndy; + U32 wnd; + S32 minimized; + S32 ddoverlay; + S32 ddoffscreen; + S32 lastovershow; + + S32 issoftcur; + U32 cursorcount; + void* buffertop; + U32 type; + S32 noclipping; + + S32 loadeddd; + S32 loadedwin; + + void* dibh; + void* dibbuffer; + S32 dibpitch; + void* dibinfo; + U32 dibdc; + U32 diboldbitmap; + +} BINKBUFFER; + + +#define BINKBUFFERAUTO 0 +#define BINKBUFFERPRIMARY 1 +#define BINKBUFFERDIBSECTION 2 +#define BINKBUFFERYV12OVERLAY 3 +#define BINKBUFFERYUY2OVERLAY 4 +#define BINKBUFFERUYVYOVERLAY 5 +#define BINKBUFFERYV12OFFSCREEN 6 +#define BINKBUFFERYUY2OFFSCREEN 7 +#define BINKBUFFERUYVYOFFSCREEN 8 +#define BINKBUFFERRGBOFFSCREENVIDEO 9 +#define BINKBUFFERRGBOFFSCREENSYSTEM 10 +#define BINKBUFFERLAST 10 +#define BINKBUFFERTYPEMASK 31 + +RADEXPFUNC HBINKBUFFER RADEXPLINK BinkBufferOpen( void* /*HWND*/ wnd, U32 width, U32 height, U32 bufferflags); +RADEXPFUNC S32 RADEXPLINK BinkBufferSetHWND( HBINKBUFFER buf, void* /*HWND*/ newwnd); +RADEXPFUNC S32 RADEXPLINK BinkDDSurfaceType(void PTR4* lpDDS); +RADEXPFUNC S32 RADEXPLINK BinkIsSoftwareCursor(void PTR4* lpDDSP, void* /*HCURSOR*/ cur); +RADEXPFUNC S32 RADEXPLINK BinkCheckCursor(void* /*HWND*/ wnd,S32 x,S32 y,S32 w,S32 h); +RADEXPFUNC S32 RADEXPLINK BinkBufferSetDirectDraw(void PTR4* lpDirectDraw, void PTR4* lpPrimary); + +#endif + +RADEXPFUNC void RADEXPLINK BinkBufferClose( HBINKBUFFER buf); +RADEXPFUNC S32 RADEXPLINK BinkBufferLock( HBINKBUFFER buf); +RADEXPFUNC S32 RADEXPLINK BinkBufferUnlock( HBINKBUFFER buf); +RADEXPFUNC void RADEXPLINK BinkBufferSetResolution( S32 w, S32 h, S32 bits); +RADEXPFUNC void RADEXPLINK BinkBufferCheckWinPos( HBINKBUFFER buf, S32 PTR4* NewWindowX, S32 PTR4* NewWindowY); +RADEXPFUNC S32 RADEXPLINK BinkBufferSetOffset( HBINKBUFFER buf, S32 destx, S32 desty); +RADEXPFUNC void RADEXPLINK BinkBufferBlit( HBINKBUFFER buf, BINKRECT PTR4* rects, U32 numrects ); +RADEXPFUNC S32 RADEXPLINK BinkBufferSetScale( HBINKBUFFER buf, U32 w, U32 h); +RADEXPFUNC char PTR4* RADEXPLINK BinkBufferGetDescription( HBINKBUFFER buf); +RADEXPFUNC char PTR4* RADEXPLINK BinkBufferGetError(); +RADEXPFUNC void RADEXPLINK BinkRestoreCursor(S32 checkcount); +RADEXPFUNC S32 RADEXPLINK BinkBufferClear(HBINKBUFFER buf, U32 RGB); + +#endif + +typedef void PTR4* (RADLINK PTR4* BINKMEMALLOC) (U32 bytes); +typedef void (RADLINK PTR4* BINKMEMFREE) (void PTR4* ptr); + +RADEXPFUNC void RADEXPLINK BinkSetMemory(BINKMEMALLOC a,BINKMEMFREE f); + +#ifdef __RADMAC__ + +#pragma export off + +#endif + +RADDEFEND + +#endif + +// @cdep pre $set(INCs,$INCs -I$clipfilename($file)) $ignore(TakeCPP) + +#endif + diff --git a/game_re/third_party/bink/binkw32.dll b/game_re/third_party/bink/binkw32.dll new file mode 100644 index 0000000000000000000000000000000000000000..b2074623524340b527ed37967630016432597737 GIT binary patch literal 291840 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
ZIU?g_*^V~%iH2A~sj81|^L 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 L*Kgqe{s#UFW4rQM literal 0 HcmV?d00001 diff --git a/game_re/third_party/bink/binkw32.lib b/game_re/third_party/bink/binkw32.lib new file mode 100644 index 0000000000000000000000000000000000000000..fb62cb1f60a509f336bbc3b8053582bbf2f0b6d3 GIT binary patch literal 20056 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 literal 0 HcmV?d00001 diff --git a/game_re/third_party/bink/radbase.h b/game_re/third_party/bink/radbase.h new file mode 100644 index 00000000..505d12bc --- /dev/null +++ b/game_re/third_party/bink/radbase.h @@ -0,0 +1,389 @@ +// __RAD16__ means 16 bit code (Win16) +// __RAD32__ means 32 bit code (DOS, Win386, Win32s, Mac) + +// __RADDOS__ means DOS code (16 or 32 bit) +// __RADWIN__ means Windows code (Win16, Win386, Win32s) +// __RADWINEXT__ means Windows 386 extender (Win386) +// __RADNT__ means Win32s code +// __RADMAC__ means Macintosh +// __RADCARBON__ means Carbon +// __RADMACH__ means MachO +// __RADXBOX__ means the XBox console +// __RADNGC__ means the Nintendo GameCube +// __RADNTBUILDLINUX__ means building Linux on NT +// __RADLINUX__ means actually building on Linux (most likely with GCC) + +// __RADX86__ means Intel x86 +// __RADMMX__ means Intel x86 MMX instructions are allowed +// __RAD68K__ means 68K +// __RADPPC__ means PowerPC + +// __RADLITTLEENDIAN__ means processor is little-endian (x86) +// __RADBIGENDIAN__ means processor is big-endian (680x0, PPC) + +#ifndef __RADBASEH__ + #define __RADBASEH__ + + #define RADCOPYRIGHT "Copyright (C) 1994-2003, RAD Game Tools, Inc." + + #ifndef __RADRES__ + + #if defined(GEKKO) + + #define __RADNGC__ + #define __RAD32__ + #define __RADPPC__ + #define __RADBIGENDIAN__ + #define RADINLINE inline + + #elif (defined(__MWERKS__) && !defined(__INTEL__)) || defined(__MRC__) || defined(THINK_C) || defined(powerc) || defined(macintosh) || defined(__powerc) || defined(__APPLE__) || defined(__MACH__) + #define __RADMAC__ + #if defined(powerc) || defined(__powerc) || defined(__ppc__) + #define __RADPPC__ + #else + #define __RAD68K__ + #endif + + #define __RAD32__ + #define __RADBIGENDIAN__ + + #if defined(__MWERKS__) + #if (defined(__cplusplus) || ! __option(only_std_keywords)) + #define RADINLINE inline + #endif + #elif defined(__MRC__) + #if defined(__cplusplus) + #define RADINLINE inline + #endif + #elif defined(__GNUC__) || defined(__GNUG__) + #define RADINLINE inline + #define __RADMACH__ + #endif + + #ifdef __MACH__ + #define __RADMACH__ + #endif + + #ifdef TARGET_API_MAC_CARBON + #if TARGET_API_MAC_CARBON + #ifndef __RADCARBON__ + #define __RADCARBON__ + #endif + #endif + #endif + + #elif defined(linux) + + #define __RADLINUX__ + #define __RADX86__ + #define __RADMMX__ + #define __RAD32__ + #define __RADLITTLEENDIAN__ + #define RADINLINE inline + + #else + + #define __RADX86__ + #define __RADMMX__ + + #ifdef __MWERKS__ + #define _WIN32 + #endif + + #ifdef __DOS__ + #define __RADDOS__ + #endif + + #ifdef __386__ + #define __RAD32__ + #endif + + #ifdef _Windows //For Borland + #ifdef __WIN32__ + #define WIN32 + #else + #define __WINDOWS__ + #endif + #endif + + #ifdef _WINDOWS //For MS + #ifndef _WIN32 + #define __WINDOWS__ + #endif + #endif + + #ifdef _WIN32 + #ifdef _XBOX + #define __RADXBOX__ + #else + #define __RADNT__ + #endif + #define __RADWIN__ + #define __RAD32__ + #else + #ifdef __NT__ + #ifdef _XBOX + #define __RADXBOX__ + #else + #define __RADNT__ + #endif + #define __RADWIN__ + #define __RAD32__ + #else + #ifdef __WINDOWS_386__ + #define __RADWIN__ + #define __RADWINEXT__ + #define __RAD32__ + #else + #ifdef __WINDOWS__ + #define __RADWIN__ + #define __RAD16__ + #else + #ifdef WIN32 + #ifdef _XBOX + #define __RADXBOX__ + #else + #define __RADNT__ + #endif + #define __RADWIN__ + #define __RAD32__ + #endif + #endif + #endif + #endif + #endif + + #define __RADLITTLEENDIAN__ + #ifdef __WATCOMC__ + #define RADINLINE + #else + #define RADINLINE __inline + #endif + #endif + + #if (!defined(__RADDOS__) && !defined(__RADWIN__) && !defined(__RADMAC__) && !defined(__RADNGC__) && !defined(__RADXBOX__) && !defined(__RADLINUX__)) + #error "RAD.H did not detect your platform. Define __DOS__, __WINDOWS__, WIN32, macintosh, or powerc." + #endif + + #ifdef __RADFINAL__ + #define RADTODO(str) { char __str[0]=str; } + #else + #define RADTODO(str) + #endif + + #ifdef __RADNGC__ + + #define RADLINK + #define RADEXPLINK + #define RADEXPFUNC RADDEFFUNC + #define RADASMLINK + #define PTR4 + + #elif defined(__RADLINUX__) + + #define RADLINK __attribute__((cdecl)) + #define RADEXPLINK __attribute__((cdecl)) + #define RADEXPFUNC RADDEFFUNC + #define RADASMLINK + #define PTR4 + + #elif defined(__RADMAC__) + + // this define is for CodeWarrior 11's stupid new libs (even though + // we don't use longlong's). + + #define __MSL_LONGLONG_SUPPORT__ + + #define RADLINK + #define RADEXPLINK + + #ifdef __CFM68K__ + #ifdef __RADINDLL__ + #define RADEXPFUNC RADDEFFUNC __declspec(export) + #else + #define RADEXPFUNC RADDEFFUNC __declspec(import) + #endif + #else + #define RADEXPFUNC RADDEFFUNC + #endif + #define RADASMLINK + + #else + + #ifdef __RADNT__ + #ifndef _WIN32 + #define _WIN32 + #endif + #ifndef WIN32 + #define WIN32 + #endif + #endif + + #ifdef __RADWIN__ + #ifdef __RAD32__ + #ifdef __RADXBOX__ + + #define RADLINK __stdcall + #define RADEXPLINK __stdcall + #define RADEXPFUNC RADDEFFUNC + + #elif defined(__RADNTBUILDLINUX__) + + #define RADLINK __cdecl + #define RADEXPLINK __cdecl + #define RADEXPFUNC RADDEFFUNC + + #else + #ifdef __RADNT__ + + #define RADLINK __stdcall + #define RADEXPLINK __stdcall + + #ifdef __RADINEXE__ + #define RADEXPFUNC RADDEFFUNC + #else + #ifndef __RADINDLL__ + #define RADEXPFUNC RADDEFFUNC __declspec(dllimport) + #ifdef __BORLANDC__ + #if __BORLANDC__<=0x460 + #undef RADEXPFUNC + #define RADEXPFUNC RADDEFFUNC + #endif + #endif + #else + #define RADEXPFUNC RADDEFFUNC __declspec(dllexport) + #endif + #endif + #else + #define RADLINK __pascal + #define RADEXPLINK __far __pascal + #define RADEXPFUNC RADDEFFUNC + #endif + #endif + #else + #define RADLINK __pascal + #define RADEXPLINK __far __pascal __export + #define RADEXPFUNC RADDEFFUNC + #endif + #else + #define RADLINK __pascal + #define RADEXPLINK __pascal + #define RADEXPFUNC RADDEFFUNC + #endif + + #define RADASMLINK __cdecl + + #endif + + #ifndef __RADXBOX__ + #ifdef __RADWIN__ + #ifndef _WINDOWS + #define _WINDOWS + #endif + #endif + #endif + + #ifndef RADDEFFUNC + + #ifdef __cplusplus + #define RADDEFFUNC extern "C" + #define RADDEFSTART extern "C" { + #define RADDEFEND } + #define RADDEFINEDATA extern "C" + #define RADDECLAREDATA extern "C" + #define RADDEFAULT( val ) =val + #else + #define RADDEFFUNC + #define RADDEFSTART + #define RADDEFEND + #define RADDEFINEDATA + #define RADDECLAREDATA extern + #define RADDEFAULT( val ) + #endif + + #endif + + #ifdef __RADNGC__ + #define RAD_ATTRIBUTE_ALIGN(num) __attribute__ ((aligned (num))) + #else + #ifdef __RADX86__ + #ifdef __WATCOMC__ + #define RAD_ATTRIBUTE_ALIGN(num) + #else + #define RAD_ATTRIBUTE_ALIGN(num) __declspec(align(num)) + #endif + #else + #define RAD_ATTRIBUTE_ALIGN(num) + #endif + #endif + + #ifdef __RADX86__ + #ifdef __WATCOMC__ + #define RAD_ALIGN_TYPE double + #define RAD_ALIGN_DEF 0.0 + #else + #define RAD_ALIGN_TYPE double __declspec(align(8)) + #define RAD_ALIGN_DEF 0.0 + #endif + #else + #define RAD_ALIGN_TYPE double + #define RAD_ALIGN_DEF 0.0 + #endif + + #define RAD_ALIGN_ADD_TYPE(var) RAD_ALIGN_TYPE var##align = RAD_ALIGN_DEF + + #define S8 signed char + #define U8 unsigned char + #define U32 unsigned long + #define S32 signed long + #define F32 float + #define F64 double + + #if defined(__MWERKS__) || defined(__MRC__) || defined( GEKKO ) + #define U64 unsigned long long + #define S64 signed long long + #else + #define U64 unsigned __int64 + #define S64 signed __int64 + #endif + + #ifdef __RAD32__ + #define PTR4 + #define U16 unsigned short + #define S16 signed short + #else + #define PTR4 __far + #define U16 unsigned int + #define S16 signed int + #endif + + #ifndef RAD_NO_LOWERCASE_TYPES + + #ifdef __RADNGC__ + + // Unfortunately dolphin\types.h typedefs the + // same types that we use. + // So we use the typedefs for this platform. + + #include + + #else + + #define u8 U8 + #define s8 S8 + #define u16 U16 + #define s16 S16 + #define u32 U32 + #define s32 S32 + #define u64 U64 + #define s64 S64 + #define f32 F32 + #define f64 F64 + + #endif + + #endif + + #endif + +#endif diff --git a/scripts/DumpCurrentFunctionRecursive.java b/scripts/DumpCurrentFunctionRecursive.java new file mode 100644 index 00000000..76f93c43 --- /dev/null +++ b/scripts/DumpCurrentFunctionRecursive.java @@ -0,0 +1,71 @@ +// Decompile selected function recursively +// @category _Reman3 +// @menupath Reman3.Dump Current Function (recursive) + +import java.util.ArrayList; +import java.util.List; + +import ghidra.app.script.GhidraScript; +import ghidra.program.model.listing.Function; +import re3lib.FunctionDumper; +import re3lib.GlobalDumper; +import re3lib.PCallTracer; +import re3lib.RecompileConfig; + +public class DumpCurrentFunctionRecursive extends GhidraScript { + @Override + public void run() throws Exception { + RecompileConfig.INSTANCE = new RecompileConfig(this); + RecompileConfig.INSTANCE.createDirectories(); + + GlobalDumper globalDumper = new GlobalDumper(this); + globalDumper.loadGlobalManifest(); + + PCallTracer tracer = new PCallTracer(); + tracer.traceCalls(getFunctionContaining(currentAddress)); + + List functionsToDump = new ArrayList<>(); + List functionsToDumpNew = new ArrayList<>(); + for (Function func : tracer.out) { + if (FunctionDumper.isDumpedFix(func)) + continue; + + println("Dump: " + func.getName()); + functionsToDump.add(func); + + if (!FunctionDumper.isDumpedAuto(func)) + functionsToDumpNew.add(func); + } + + if (!functionsToDump.isEmpty()) { + String newOpt = "Only new (" + functionsToDumpNew.size() + ")"; + String okOpt = "Yes (" + functionsToDump.size() + ")"; + String choice = askChoice("Confirmation", "About to generate " + functionsToDump.size() + " functions (" + + functionsToDumpNew.size() + " new), continue?", + new ArrayList() { + { + add(okOpt); + add(newOpt); + add("No"); + } + }, okOpt); + if (choice == okOpt) { + } else if (choice == newOpt) { + functionsToDump = functionsToDumpNew; + } else { + return; + } + + FunctionDumper functionDumper = new FunctionDumper(this, globalDumper); + for (Function func : functionsToDump) { + functionDumper.dump(func); + } + + if (functionDumper.createdFile) + RecompileConfig.INSTANCE.touchCMakeTimestamp(); + + globalDumper.dumpGlobals(); + globalDumper.saveGlobalManifest(); + } + } +} diff --git a/scripts/re3lib/GlobalDumper.java b/scripts/re3lib/GlobalDumper.java index 7d680789..b995e4d0 100644 --- a/scripts/re3lib/GlobalDumper.java +++ b/scripts/re3lib/GlobalDumper.java @@ -128,6 +128,9 @@ public class GlobalDumper { String escapeCString(String str) { str = str.replace("\\", "\\\\"); str = str.replace("\"", "\\\""); + str = str.replace("\n", "\\n"); + str = str.replace("\r", "\\r"); + str = str.replace("\t", "\\t"); return str; } diff --git a/scripts/re3lib/PCallTracer.java b/scripts/re3lib/PCallTracer.java index d1ef5309..1503e115 100644 --- a/scripts/re3lib/PCallTracer.java +++ b/scripts/re3lib/PCallTracer.java @@ -52,7 +52,6 @@ public class PCallTracer { Address callAddr = target.getAddress(); Function calledFunction = script.getFunctionAt(callAddr); if (calledFunction == null) { - script.println("PCallTracer, called function not found: " + op.toString() + " - " + highFunction.getFunction().getName()); continue; @@ -69,7 +68,7 @@ public class PCallTracer { if (!visited.contains(function.getEntryPoint())) { visited.add(function.getEntryPoint()); if (trace) { - // script.println("PCallTracer, visiting " + function.getName() + " (depth:" + depth + ")"); + script.println("PCallTracer, visiting " + function.getName() + " (depth:" + depth + ")"); } DecompileResults decompRes = decomp.getOrInsert(function); visit(decompRes.getHighFunction(), depth);