From 3676c28114ac40b1f37c20aa5b1d9050497720d8 Mon Sep 17 00:00:00 2001 From: "Skyth (Asilkan)" <19259897+blueskythlikesclouds@users.noreply.github.com> Date: Fri, 7 Mar 2025 03:31:13 +0300 Subject: [PATCH 1/9] Fix the unsafe base address assumption. (#1098) --- tools/XenonRecomp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/XenonRecomp b/tools/XenonRecomp index cd6fcb3..7b8e37a 160000 --- a/tools/XenonRecomp +++ b/tools/XenonRecomp @@ -1 +1 @@ -Subproject commit cd6fcb33bdcaff37c8c9d2083c7951e1d73ae9da +Subproject commit 7b8e37aa3758c3ce2361433965cb94f2a0505eb2 From 676c3f0ff418d4eed27132b302a7b7476812d883 Mon Sep 17 00:00:00 2001 From: Hyper <34012267+hyperbx@users.noreply.github.com> Date: Fri, 7 Mar 2025 01:43:37 +0000 Subject: [PATCH 2/9] Prevent game from closing whilst autosaving (#967) --- UnleashedRecomp/app.h | 1 + UnleashedRecomp/patches/resident_patches.cpp | 2 ++ UnleashedRecomp/ui/game_window.cpp | 6 ++++++ 3 files changed, 9 insertions(+) diff --git a/UnleashedRecomp/app.h b/UnleashedRecomp/app.h index dccb251..9714d10 100644 --- a/UnleashedRecomp/app.h +++ b/UnleashedRecomp/app.h @@ -8,6 +8,7 @@ public: static inline bool s_isInit; static inline bool s_isMissingDLC; static inline bool s_isLoading; + static inline bool s_isSaving; static inline bool s_isWerehog; static inline bool s_isSaveDataCorrupt; diff --git a/UnleashedRecomp/patches/resident_patches.cpp b/UnleashedRecomp/patches/resident_patches.cpp index 791b415..64a220d 100644 --- a/UnleashedRecomp/patches/resident_patches.cpp +++ b/UnleashedRecomp/patches/resident_patches.cpp @@ -97,6 +97,8 @@ PPC_FUNC(sub_824E5170) __imp__sub_824E5170(ctx, base); + App::s_isSaving = pSaveIcon->m_IsVisible; + if (pSaveIcon->m_IsVisible) { App::s_isSaveDataCorrupt = false; diff --git a/UnleashedRecomp/ui/game_window.cpp b/UnleashedRecomp/ui/game_window.cpp index cc25ab6..2bd5ad1 100644 --- a/UnleashedRecomp/ui/game_window.cpp +++ b/UnleashedRecomp/ui/game_window.cpp @@ -34,8 +34,14 @@ int Window_OnSDLEvent(void*, SDL_Event* event) switch (event->type) { case SDL_QUIT: + { + if (App::s_isSaving) + break; + App::Exit(); + break; + } case SDL_KEYDOWN: { From 3c050887d8acf770e6c38065838bbd2a1dc8614e Mon Sep 17 00:00:00 2001 From: Hyper <34012267+hyperbx@users.noreply.github.com> Date: Fri, 7 Mar 2025 01:43:49 +0000 Subject: [PATCH 3/9] Fix shoe upgrade hints patch breaking sequence flags (#1130) --- UnleashedRecompLib/config/SWA.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/UnleashedRecompLib/config/SWA.toml b/UnleashedRecompLib/config/SWA.toml index 489aa13..2c070e9 100644 --- a/UnleashedRecompLib/config/SWA.toml +++ b/UnleashedRecompLib/config/SWA.toml @@ -181,8 +181,8 @@ jump_address_on_true = 0x829E40A0 # Disable Chip hints for shoe upgrades [[midasm_hook]] name = "DisableHintsMidAsmHook" -address = 0x82691CB0 -jump_address_on_true = 0x82691E24 +address = 0x82691DD0 +jump_address_on_true = 0x82691DD4 # Disable navigation volumes [[midasm_hook]] From c19a7b1e1100cba75140d6d9fa08c86d6cc993d1 Mon Sep 17 00:00:00 2001 From: Hyper <34012267+hyperbx@users.noreply.github.com> Date: Fri, 7 Mar 2025 01:45:58 +0000 Subject: [PATCH 4/9] Added check for AVX on boot (#1067) Co-authored-by: Wiseguy <68165316+mr-wiseguy@users.noreply.github.com> --- UnleashedRecomp/CMakeLists.txt | 2 +- UnleashedRecomp/main.cpp | 26 +++++++++++++++++++++++++- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/UnleashedRecomp/CMakeLists.txt b/UnleashedRecomp/CMakeLists.txt index ce05eb1..66b60a4 100644 --- a/UnleashedRecomp/CMakeLists.txt +++ b/UnleashedRecomp/CMakeLists.txt @@ -352,7 +352,7 @@ if (WIN32) Synchronization winmm ) -endif() +endif() target_link_libraries(UnleashedRecomp PRIVATE fmt::fmt diff --git a/UnleashedRecomp/main.cpp b/UnleashedRecomp/main.cpp index d3d1238..9158abf 100644 --- a/UnleashedRecomp/main.cpp +++ b/UnleashedRecomp/main.cpp @@ -1,4 +1,5 @@ #include +#include #include #include #include @@ -147,6 +148,29 @@ uint32_t LdrLoadModule(const std::filesystem::path &path) return entry; } +__attribute__((constructor(101), target("no-avx,no-avx2"), noinline)) +void init() +{ +#ifdef __x86_64__ + uint32_t eax, ebx, ecx, edx; + + // Execute CPUID for processor info and feature bits. + __get_cpuid(1, &eax, &ebx, &ecx, &edx); + + // Check for AVX support. + if ((ecx & (1 << 28)) == 0) + { + printf("[*] CPU does not support the AVX instruction set.\n"); + +#ifdef _WIN32 + MessageBoxA(nullptr, "Your CPU does not meet the minimum system requirements.", "Unleashed Recompiled", MB_ICONERROR); +#endif + + std::_Exit(1); + } +#endif +} + int main(int argc, char *argv[]) { #ifdef _WIN32 @@ -156,7 +180,7 @@ int main(int argc, char *argv[]) os::process::CheckConsole(); if (!os::registry::Init()) - LOGN_WARNING("OS doesn't support registry"); + LOGN_WARNING("OS does not support registry."); os::logger::Init(); From c64ef1fe15f4890b0c9aca99bf821722ab300a39 Mon Sep 17 00:00:00 2001 From: Hyper <34012267+hyperbx@users.noreply.github.com> Date: Fri, 7 Mar 2025 01:47:15 +0000 Subject: [PATCH 5/9] Added error message if included DirectX DLLs are missing (#998) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Added error message if included DirectX DLLs are missing * locale: added System_Win32_MissingDLLs localisation Co-Authored-By: LJSTAR <31629427+LJSTARbird@users.noreply.github.com> Co-Authored-By: Kitzuku <25226941+Kitzuku@users.noreply.github.com> Co-Authored-By: NextinHKRY <38560522+NextinMono@users.noreply.github.com> Co-Authored-By: brianuuu <38166666+brianuuu@users.noreply.github.com> Co-Authored-By: Darío <538504+DarioSamo@users.noreply.github.com> * Fix ifdefs --------- Co-authored-by: LJSTAR <31629427+LJSTARbird@users.noreply.github.com> Co-authored-by: Kitzuku <25226941+Kitzuku@users.noreply.github.com> Co-authored-by: NextinHKRY <38560522+NextinMono@users.noreply.github.com> Co-authored-by: brianuuu <38166666+brianuuu@users.noreply.github.com> Co-authored-by: Darío <538504+DarioSamo@users.noreply.github.com> --- UnleashedRecomp/locale/locale.cpp | 11 +++++++++++ UnleashedRecomp/main.cpp | 22 ++++++++++++++++++++++ UnleashedRecomp/user/paths.h | 2 ++ 3 files changed, 35 insertions(+) diff --git a/UnleashedRecomp/locale/locale.cpp b/UnleashedRecomp/locale/locale.cpp index eafb24b..138dc41 100644 --- a/UnleashedRecomp/locale/locale.cpp +++ b/UnleashedRecomp/locale/locale.cpp @@ -692,6 +692,17 @@ std::unordered_map> { ELanguage::Italian, "Impossibile creare un backend D3D12 (Windows) o Vulkan.\n\nAssicurati che:\n\n- Il tuo sistema soddisfi i requisiti minimi.\n- I driver della scheda grafica siano aggiornati.\n- Il tuo sistema operativo sia aggiornato." } } }, + { + "System_Win32_MissingDLLs", + { + { ELanguage::English, "The module \"%s\" could not be found.\n\nPlease make sure that:\n\n- You extracted this copy of Unleashed Recompiled fully and not just the *.exe file.\n- You are not running Unleashed Recompiled from a *.zip file." }, + { ELanguage::Japanese, "モジュール\"%s\"が見つかりませんでした\n\n次の点を確認してください:\n\n※Unleashed Recompiledの*.exeファイルだけを抽出していなく、 コピーを完全に抽出してること\n※Unleashed Recompiledを*.zipファイルから実行していないこと" }, + { ELanguage::German, "Das Modul \"%s\" konnte nicht gefunden werden.\n\nBitte stelle sicher, dass:\n\n- Diese Kopie von Unleashed Recompiled vollständig entpackt wurde und nicht nur die *.exe-Datei.\n- Unleashed Recompiled nicht direkt aus einer *.zip-Datei ausgeführt wird." }, + { ELanguage::French, "Le module \"%s\" n'a pas pu être trouvé.\n\nVeuillez vous assurer que :\n\n- Vous avez extrait Unleashed Recompiled dans son entièreté et pas seulement le fichier *.exe.\n- Vous n'exécutez pas Unleashed Recompiled à partir d'un fichier *.zip." }, + { ELanguage::Spanish, "No se pudo encontrar el módulo \"%s\".\n\nAsegúrese de que:\n\n- Ha extraido esta copia de Unleashed Recompiled por completo y no solo el archivo *.exe.\n- No está ejecutando Unleashed Recompiled desde un archivo *.zip." }, + { ELanguage::Italian, "Impossibile trovare il modulo \"%s\".\n\nAssicurati che:\n\n- Hai estratto questa copia di Unleashed Recompiled correttamente e non solo il file *.exe.\n- Non stai eseguendo Unleashed Recompiled da un file *.zip." } + } + }, { "Common_On", { diff --git a/UnleashedRecomp/main.cpp b/UnleashedRecomp/main.cpp index 9158abf..a55c018 100644 --- a/UnleashedRecomp/main.cpp +++ b/UnleashedRecomp/main.cpp @@ -28,6 +28,15 @@ #include #endif +#if defined(_WIN32) && defined(UNLEASHED_RECOMP_D3D12) +static std::array g_D3D12RequiredModules = +{ + "D3D12/D3D12Core.dll", + "dxcompiler.dll", + "dxil.dll" +}; +#endif + const size_t XMAIOBegin = 0x7FEA0000; const size_t XMAIOEnd = XMAIOBegin + 0x0000FFFF; @@ -204,6 +213,19 @@ int main(int argc, char *argv[]) Config::Load(); +#if defined(_WIN32) && defined(UNLEASHED_RECOMP_D3D12) + for (auto& dll : g_D3D12RequiredModules) + { + if (!std::filesystem::exists(g_executableRoot / dll)) + { + char text[512]; + snprintf(text, sizeof(text), Localise("System_Win32_MissingDLLs").c_str(), dll.data()); + SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, GameWindow::GetTitle(), text, GameWindow::s_pWindow); + std::_Exit(1); + } + } +#endif + // Check the time since the last time an update was checked. Store the new time if the difference is more than six hours. constexpr double TimeBetweenUpdateChecksInSeconds = 6 * 60 * 60; time_t timeNow = std::time(nullptr); diff --git a/UnleashedRecomp/user/paths.h b/UnleashedRecomp/user/paths.h index d914213..c083520 100644 --- a/UnleashedRecomp/user/paths.h +++ b/UnleashedRecomp/user/paths.h @@ -8,6 +8,8 @@ #define GAME_INSTALL_DIRECTORY "." #endif +extern std::filesystem::path g_executableRoot; + inline std::filesystem::path GetGamePath() { return GAME_INSTALL_DIRECTORY; From a9e280e11625476d1c9e735d4b345261b2718b4e Mon Sep 17 00:00:00 2001 From: Hyper <34012267+hyperbx@users.noreply.github.com> Date: Fri, 7 Mar 2025 01:54:17 +0000 Subject: [PATCH 6/9] Fix Homing Attack on Jump not affecting Cool Edge Act 3 (Day) (#904) --- UnleashedRecomp/patches/input_patches.cpp | 12 ++++++++++++ UnleashedRecomp/patches/player_patches.cpp | 7 ------- UnleashedRecompLib/config/SWA.toml | 7 +++++++ 3 files changed, 19 insertions(+), 7 deletions(-) diff --git a/UnleashedRecomp/patches/input_patches.cpp b/UnleashedRecomp/patches/input_patches.cpp index 9db182c..afc5096 100644 --- a/UnleashedRecomp/patches/input_patches.cpp +++ b/UnleashedRecomp/patches/input_patches.cpp @@ -318,6 +318,18 @@ void PostureSpaceHurrierDPadSupportYMidAsmHook(PPCRegister& pPadState, PPCVRegis vector.f32[3] = -1.0f; } +void SetXButtonHomingMidAsmHook(PPCRegister& r1) +{ + auto pXButtonHoming = (bool*)(g_memory.base + r1.u32 + 0x63); + + *pXButtonHoming = !Config::HomingAttackOnJump; +} + +bool IsHomingAttackOnJump() +{ + return Config::HomingAttackOnJump; +} + // ------------- WORLD MAP ------------- // bool WorldMapDeadzoneMidAsmHook(PPCRegister& pPadState) diff --git a/UnleashedRecomp/patches/player_patches.cpp b/UnleashedRecomp/patches/player_patches.cpp index e951199..cce0a58 100644 --- a/UnleashedRecomp/patches/player_patches.cpp +++ b/UnleashedRecomp/patches/player_patches.cpp @@ -95,13 +95,6 @@ void PostUnleashMidAsmHook(PPCRegister& r30) g_isUnleashCancelled = false; } -void SetXButtonHomingMidAsmHook(PPCRegister& r1) -{ - auto pXButtonHoming = (bool*)(g_memory.base + r1.u32 + 0x63); - - *pXButtonHoming = !Config::HomingAttackOnJump; -} - // SWA::Player::CEvilSonicContext PPC_FUNC_IMPL(__imp__sub_823B49D8); PPC_FUNC(sub_823B49D8) diff --git a/UnleashedRecompLib/config/SWA.toml b/UnleashedRecompLib/config/SWA.toml index 2c070e9..2c0177e 100644 --- a/UnleashedRecompLib/config/SWA.toml +++ b/UnleashedRecompLib/config/SWA.toml @@ -197,11 +197,18 @@ address = 0x823A4FF0 registers = ["r4", "r5"] return_on_false = true +# Set default value for XButtonHoming. [[midasm_hook]] name = "SetXButtonHomingMidAsmHook" address = 0x8237AC90 registers = ["r1"] +# Disable XML reading for XButtonHoming. +[[midasm_hook]] +name = "IsHomingAttackOnJump" +address = 0x8237ACE4 +jump_address_on_true = 0x8237ACE8 + # Down force HFR fix [[midasm_hook]] name = "DownForceDeltaTimeFixMidAsmHook" From 024c35c1fec03f32a1f752c8c60896f1790d2b0d Mon Sep 17 00:00:00 2001 From: "Skyth (Asilkan)" <19259897+blueskythlikesclouds@users.noreply.github.com> Date: Fri, 7 Mar 2025 13:52:01 +0300 Subject: [PATCH 7/9] Force WASAPI on Windows. (#1134) --- UnleashedRecomp/apu/driver/sdl2_driver.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/UnleashedRecomp/apu/driver/sdl2_driver.cpp b/UnleashedRecomp/apu/driver/sdl2_driver.cpp index f487620..787fab3 100644 --- a/UnleashedRecomp/apu/driver/sdl2_driver.cpp +++ b/UnleashedRecomp/apu/driver/sdl2_driver.cpp @@ -38,6 +38,11 @@ static void CreateAudioDevice() void XAudioInitializeSystem() { +#ifdef _WIN32 + // Force wasapi on Windows. + SDL_setenv("SDL_AUDIODRIVER", "wasapi", true); +#endif + SDL_SetHint(SDL_HINT_AUDIO_CATEGORY, "playback"); SDL_SetHint(SDL_HINT_AUDIO_DEVICE_APP_NAME, "Unleashed Recompiled"); From 45c08801451e283b2741937bf1d7f7763ed05e71 Mon Sep 17 00:00:00 2001 From: Hyper <34012267+hyperbx@users.noreply.github.com> Date: Fri, 7 Mar 2025 10:52:42 +0000 Subject: [PATCH 8/9] Rename DisableDPadAsAnalogInput to DisableDPadMovement (#1146) --- UnleashedRecomp/patches/input_patches.cpp | 12 ++++++------ UnleashedRecomp/user/config_def.h | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/UnleashedRecomp/patches/input_patches.cpp b/UnleashedRecomp/patches/input_patches.cpp index afc5096..0ec8f33 100644 --- a/UnleashedRecomp/patches/input_patches.cpp +++ b/UnleashedRecomp/patches/input_patches.cpp @@ -212,7 +212,7 @@ g_sdlEventListenerForInputPatches; static bool IsDPadThreshold(const SWA::SPadState* pPadState) { - if (Config::DisableDPadAsAnalogInput) + if (Config::DisableDPadMovement) return false; return pPadState->IsDown(SWA::eKeyState_DpadUp) || @@ -240,7 +240,7 @@ static bool IsCursorThreshold(double deadzone = 0, bool isBelowThreshold = false static void SetDPadAnalogDirectionX(PPCRegister& pPadState, PPCRegister& x, bool invert, float max = 1.0f) { - if (Config::DisableDPadAsAnalogInput) + if (Config::DisableDPadMovement) return; auto pGuestPadState = (SWA::SPadState*)g_memory.Translate(pPadState.u32); @@ -254,7 +254,7 @@ static void SetDPadAnalogDirectionX(PPCRegister& pPadState, PPCRegister& x, bool static void SetDPadAnalogDirectionY(PPCRegister& pPadState, PPCRegister& y, bool invert, float max = 1.0f) { - if (Config::DisableDPadAsAnalogInput) + if (Config::DisableDPadMovement) return; auto pGuestPadState = (SWA::SPadState*)g_memory.Translate(pPadState.u32); @@ -292,7 +292,7 @@ void PostureDPadSupportYMidAsmHook(PPCRegister& pPadState, PPCRegister& y) void PostureSpaceHurrierDPadSupportXMidAsmHook(PPCRegister& pPadState, PPCVRegister& vector) { - if (Config::DisableDPadAsAnalogInput) + if (Config::DisableDPadMovement) return; auto pGuestPadState = (SWA::SPadState*)g_memory.Translate(pPadState.u32); @@ -306,7 +306,7 @@ void PostureSpaceHurrierDPadSupportXMidAsmHook(PPCRegister& pPadState, PPCVRegis void PostureSpaceHurrierDPadSupportYMidAsmHook(PPCRegister& pPadState, PPCVRegister& vector) { - if (Config::DisableDPadAsAnalogInput) + if (Config::DisableDPadMovement) return; auto pGuestPadState = (SWA::SPadState*)g_memory.Translate(pPadState.u32); @@ -430,7 +430,7 @@ PPC_FUNC(sub_8256C938) pWorldMapCursor->m_LeftStickVertical = rPadState.LeftStickVertical; pWorldMapCursor->m_LeftStickHorizontal = rPadState.LeftStickHorizontal; - if (!Config::DisableDPadAsAnalogInput) + if (!Config::DisableDPadMovement) { if (rPadState.IsDown(SWA::eKeyState_DpadUp)) pWorldMapCursor->m_LeftStickVertical = 1.0f; diff --git a/UnleashedRecomp/user/config_def.h b/UnleashedRecomp/user/config_def.h index 4138572..37fd59c 100644 --- a/UnleashedRecomp/user/config_def.h +++ b/UnleashedRecomp/user/config_def.h @@ -79,7 +79,9 @@ CONFIG_DEFINE_HIDDEN("Codes", bool, AllowCancellingUnleash, false); CONFIG_DEFINE_HIDDEN("Codes", bool, DisableAutoSaveWarning, false); CONFIG_DEFINE_HIDDEN("Codes", bool, DisableBoostFilter, false); CONFIG_DEFINE_HIDDEN("Codes", bool, DisableDLCIcon, false); +CONFIG_DEFINE_HIDDEN("Codes", bool, DisableDPadMovement, false); CONFIG_DEFINE_HIDDEN("Codes", bool, DisableDWMRoundedCorners, false); +CONFIG_DEFINE_HIDDEN("Codes", bool, DisableLowResolutionFontOnCustomUI, false); CONFIG_DEFINE_HIDDEN("Codes", bool, EnableEventCollisionDebugView, false); CONFIG_DEFINE_HIDDEN("Codes", bool, EnableGIMipLevelDebugView, false); CONFIG_DEFINE_HIDDEN("Codes", bool, EnableObjectCollisionDebugView, false); @@ -92,7 +94,5 @@ CONFIG_DEFINE_HIDDEN("Codes", bool, SaveScoreAtCheckpoints, false); CONFIG_DEFINE_HIDDEN("Codes", bool, SkipIntroLogos, false); CONFIG_DEFINE_HIDDEN("Codes", bool, UseArrowsForTimeOfDayTransition, false); CONFIG_DEFINE_HIDDEN("Codes", bool, UseOfficialTitleOnTitleBar, false); -CONFIG_DEFINE_HIDDEN("Codes", bool, DisableLowResolutionFontOnCustomUI, false); -CONFIG_DEFINE_HIDDEN("Codes", bool, DisableDPadAsAnalogInput, false); CONFIG_DEFINE("Update", time_t, LastChecked, 0); From 131427e017588fe349e10694bdaf2a37900683d7 Mon Sep 17 00:00:00 2001 From: "Skyth (Asilkan)" <19259897+blueskythlikesclouds@users.noreply.github.com> Date: Fri, 7 Mar 2025 18:52:49 +0300 Subject: [PATCH 9/9] Update version to v1.0.2. (#1149) --- UnleashedRecomp/res/version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/UnleashedRecomp/res/version.txt b/UnleashedRecomp/res/version.txt index e58d90d..a486ce0 100644 --- a/UnleashedRecomp/res/version.txt +++ b/UnleashedRecomp/res/version.txt @@ -1,4 +1,4 @@ VERSION_MILESTONE="" VERSION_MAJOR=1 VERSION_MINOR=0 -VERSION_REVISION=1 +VERSION_REVISION=2