mirror of
https://github.com/hedge-dev/UnleashedRecomp
synced 2026-06-09 12:46:50 -04:00
Compare commits
18 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 131427e017 | |||
| 45c0880145 | |||
| 024c35c1fe | |||
| a9e280e116 | |||
| c64ef1fe15 | |||
| c19a7b1e11 | |||
| 3c050887d8 | |||
| 676c3f0ff4 | |||
| 3676c28114 | |||
| df5e48f528 | |||
| c07a754f4f | |||
| 8a80db141d | |||
| 48458cb903 | |||
| 1c225184a1 | |||
| 6ef7789b17 | |||
| 756d001d35 | |||
| 0866be0c3d | |||
| 4705ffddc2 |
@@ -14,9 +14,12 @@ jobs:
|
|||||||
build-linux:
|
build-linux:
|
||||||
name: Build Linux
|
name: Build Linux
|
||||||
runs-on: ubuntu-24.04
|
runs-on: ubuntu-24.04
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
preset: ["linux-debug", "linux-release", "linux-relwithdebinfo"]
|
||||||
env:
|
env:
|
||||||
LLVM_VERSION: 18
|
LLVM_VERSION: 18
|
||||||
CMAKE_PRESET: linux-release
|
CMAKE_PRESET: ${{ matrix.preset }}
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout Repository
|
- name: Checkout Repository
|
||||||
@@ -34,7 +37,7 @@ jobs:
|
|||||||
- name: Setup ccache
|
- name: Setup ccache
|
||||||
uses: hendrikmuhs/ccache-action@v1.2
|
uses: hendrikmuhs/ccache-action@v1.2
|
||||||
with:
|
with:
|
||||||
key: ccache-${{ runner.os }}
|
key: ccache-${{ runner.os }}-${{ matrix.preset }}
|
||||||
|
|
||||||
- name: Cache vcpkg
|
- name: Cache vcpkg
|
||||||
uses: actions/cache@v4
|
uses: actions/cache@v4
|
||||||
@@ -55,7 +58,7 @@ jobs:
|
|||||||
uses: actions/cache@v4
|
uses: actions/cache@v4
|
||||||
with:
|
with:
|
||||||
path: /tmp/ccache
|
path: /tmp/ccache
|
||||||
key: ccache-${{ runner.os }}
|
key: ccache-${{ runner.os }}-${{ matrix.preset }}
|
||||||
|
|
||||||
- name: Prepare Project
|
- name: Prepare Project
|
||||||
run: cp ./private/* ./UnleashedRecompLib/private
|
run: cp ./private/* ./UnleashedRecompLib/private
|
||||||
@@ -73,13 +76,16 @@ jobs:
|
|||||||
- name: Upload Artifact
|
- name: Upload Artifact
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: UnleashedRecomp-Linux
|
name: UnleashedRecomp-Linux-${{ env.CMAKE_PRESET }}
|
||||||
path: ./out/build/${{ env.CMAKE_PRESET }}/UnleashedRecomp/UnleashedRecomp
|
path: ./out/build/${{ env.CMAKE_PRESET }}/UnleashedRecomp/UnleashedRecomp
|
||||||
build-windows:
|
build-windows:
|
||||||
name: Build Windows
|
name: Build Windows
|
||||||
runs-on: windows-latest
|
runs-on: windows-latest
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
preset: ["x64-Clang-Debug", "x64-Clang-Release", "x64-Clang-RelWithDebInfo"]
|
||||||
env:
|
env:
|
||||||
CMAKE_PRESET: x64-Clang-Release
|
CMAKE_PRESET: ${{ matrix.preset }}
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
@@ -97,7 +103,7 @@ jobs:
|
|||||||
- name: Setup ccache
|
- name: Setup ccache
|
||||||
uses: hendrikmuhs/ccache-action@v1.2
|
uses: hendrikmuhs/ccache-action@v1.2
|
||||||
with:
|
with:
|
||||||
key: ccache-${{ runner.os }}
|
key: ccache-${{ runner.os }}-${{ matrix.preset }}
|
||||||
|
|
||||||
- name: Cache vcpkg
|
- name: Cache vcpkg
|
||||||
uses: actions/cache@v4
|
uses: actions/cache@v4
|
||||||
@@ -144,8 +150,15 @@ jobs:
|
|||||||
- name: Upload Artifact
|
- name: Upload Artifact
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: UnleashedRecomp-Windows
|
name: UnleashedRecomp-Windows-${{ env.CMAKE_PRESET }}
|
||||||
path: .\UnleashedRecomp-Windows.zip
|
path: .\UnleashedRecomp-Windows.zip
|
||||||
|
|
||||||
|
- name: Upload PDB
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
if: ${{ matrix.preset != 'x64-Clang-Release' }}
|
||||||
|
with:
|
||||||
|
name: UnleashedRecomp-Windows-${{ env.CMAKE_PRESET }}-PDB
|
||||||
|
path: .\out\build\${{ env.CMAKE_PRESET }}\UnleashedRecomp\UnleashedRecomp.pdb
|
||||||
build-flatpak:
|
build-flatpak:
|
||||||
name: Build Flatpak
|
name: Build Flatpak
|
||||||
runs-on: ubuntu-24.04
|
runs-on: ubuntu-24.04
|
||||||
|
|||||||
@@ -182,6 +182,9 @@ Many options have been integrated to address some common quality of life improve
|
|||||||
- The day/night transformation cutscene in towns can use either the Xbox 360 or PlayStation 3 version, with the Xbox version artificially extending loading times for the full video play out, whilst the PlayStation version ends as soon as it's done loading.
|
- The day/night transformation cutscene in towns can use either the Xbox 360 or PlayStation 3 version, with the Xbox version artificially extending loading times for the full video play out, whilst the PlayStation version ends as soon as it's done loading.
|
||||||
- Music Attenuation is a feature that was originally present in the Xbox 360 version of the game, where it'd automatically mute the background music if the console's media player was in use. This feature has been implemented using information provided by the [Windows Media Control](https://learn.microsoft.com/en-us/uwp/api/windows.media.control?view=winrt-26100) APIs in [WinRT](https://en.wikipedia.org/wiki/Windows_Runtime). Applications that interface with Windows 10/11 to display media controls are supported.
|
- Music Attenuation is a feature that was originally present in the Xbox 360 version of the game, where it'd automatically mute the background music if the console's media player was in use. This feature has been implemented using information provided by the [Windows Media Control](https://learn.microsoft.com/en-us/uwp/api/windows.media.control?view=winrt-26100) APIs in [WinRT](https://en.wikipedia.org/wiki/Windows_Runtime). Applications that interface with Windows 10/11 to display media controls are supported.
|
||||||
|
|
||||||
|
> [!TIP]
|
||||||
|
> You may refer to Music Presence's [list of supported media players](https://github.com/ungive/discord-music-presence/blob/master/documentation/supported-media-players.md) for players that work with Music Attenuation out of the box.
|
||||||
|
|
||||||
> [!NOTE]
|
> [!NOTE]
|
||||||
> Please note that Music Attenuation is not currently available on Linux. Support for this feature may be added in a future update.
|
> Please note that Music Attenuation is not currently available on Linux. Support for this feature may be added in a future update.
|
||||||
|
|
||||||
@@ -206,6 +209,8 @@ Modded files for the Xbox 360 version of the game are compatible with Unleashed
|
|||||||
|
|
||||||
> [!NOTE]
|
> [!NOTE]
|
||||||
> Code modding is currently not possible and is [planned for a future update](#code-modding). As a workaround for the time being, some codes have been directly embedded into the game and can be accessed through Hedge Mod Manager's Codes tab.
|
> Code modding is currently not possible and is [planned for a future update](#code-modding). As a workaround for the time being, some codes have been directly embedded into the game and can be accessed through Hedge Mod Manager's Codes tab.
|
||||||
|
>
|
||||||
|
> For information on the mod format, check out Hedge Mod Manager's [Basic Mod File Structure](https://github.com/thesupersonic16/HedgeModManager/wiki/Basic-Mod-File-Structure) wiki page.
|
||||||
|
|
||||||
## Update Roadmap
|
## Update Roadmap
|
||||||
|
|
||||||
|
|||||||
@@ -352,7 +352,7 @@ if (WIN32)
|
|||||||
Synchronization
|
Synchronization
|
||||||
winmm
|
winmm
|
||||||
)
|
)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
target_link_libraries(UnleashedRecomp PRIVATE
|
target_link_libraries(UnleashedRecomp PRIVATE
|
||||||
fmt::fmt
|
fmt::fmt
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ public:
|
|||||||
static inline bool s_isInit;
|
static inline bool s_isInit;
|
||||||
static inline bool s_isMissingDLC;
|
static inline bool s_isMissingDLC;
|
||||||
static inline bool s_isLoading;
|
static inline bool s_isLoading;
|
||||||
|
static inline bool s_isSaving;
|
||||||
static inline bool s_isWerehog;
|
static inline bool s_isWerehog;
|
||||||
static inline bool s_isSaveDataCorrupt;
|
static inline bool s_isSaveDataCorrupt;
|
||||||
|
|
||||||
|
|||||||
@@ -38,6 +38,11 @@ static void CreateAudioDevice()
|
|||||||
|
|
||||||
void XAudioInitializeSystem()
|
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_CATEGORY, "playback");
|
||||||
SDL_SetHint(SDL_HINT_AUDIO_DEVICE_APP_NAME, "Unleashed Recompiled");
|
SDL_SetHint(SDL_HINT_AUDIO_DEVICE_APP_NAME, "Unleashed Recompiled");
|
||||||
|
|
||||||
|
|||||||
@@ -287,8 +287,8 @@ static constexpr bool g_vulkan = true;
|
|||||||
|
|
||||||
static bool g_triangleStripWorkaround = false;
|
static bool g_triangleStripWorkaround = false;
|
||||||
|
|
||||||
static constexpr bool g_hardwareResolve = true;
|
static bool g_hardwareResolve = true;
|
||||||
static constexpr bool g_hardwareDepthResolve = true;
|
static bool g_hardwareDepthResolve = true;
|
||||||
|
|
||||||
static std::unique_ptr<RenderInterface> g_interface;
|
static std::unique_ptr<RenderInterface> g_interface;
|
||||||
static std::unique_ptr<RenderDevice> g_device;
|
static std::unique_ptr<RenderDevice> g_device;
|
||||||
@@ -1698,6 +1698,10 @@ bool Video::CreateHostDevice(const char *sdlVideoDriver)
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Hardware resolve seems to be completely bugged on Intel D3D12 drivers.
|
||||||
|
g_hardwareResolve = (deviceDescription.vendor != RenderDeviceVendor::INTEL);
|
||||||
|
g_hardwareDepthResolve = (deviceDescription.vendor != RenderDeviceVendor::INTEL);
|
||||||
}
|
}
|
||||||
|
|
||||||
g_vulkan = (interfaceFunction == CreateVulkanInterfaceWrapper);
|
g_vulkan = (interfaceFunction == CreateVulkanInterfaceWrapper);
|
||||||
@@ -2326,6 +2330,8 @@ static void DrawProfiler()
|
|||||||
ImGui::Text("Triangle Fan: %s", g_capabilities.triangleFan ? "Supported" : "Unsupported");
|
ImGui::Text("Triangle Fan: %s", g_capabilities.triangleFan ? "Supported" : "Unsupported");
|
||||||
ImGui::Text("Dynamic Depth Bias: %s", g_capabilities.dynamicDepthBias ? "Supported" : "Unsupported");
|
ImGui::Text("Dynamic Depth Bias: %s", g_capabilities.dynamicDepthBias ? "Supported" : "Unsupported");
|
||||||
ImGui::Text("Triangle Strip Workaround: %s", g_triangleStripWorkaround ? "Enabled" : "Disabled");
|
ImGui::Text("Triangle Strip Workaround: %s", g_triangleStripWorkaround ? "Enabled" : "Disabled");
|
||||||
|
ImGui::Text("Hardware Resolve: %s", g_hardwareResolve ? "Enabled" : "Disabled");
|
||||||
|
ImGui::Text("Hardware Depth Resolve: %s", g_hardwareDepthResolve ? "Enabled" : "Disabled");
|
||||||
ImGui::NewLine();
|
ImGui::NewLine();
|
||||||
|
|
||||||
ImGui::Text("API: %s", g_vulkan ? "Vulkan" : "D3D12");
|
ImGui::Text("API: %s", g_vulkan ? "Vulkan" : "D3D12");
|
||||||
|
|||||||
@@ -562,9 +562,9 @@ CONFIG_DEFINE_ENUM_LOCALE(EAspectRatio)
|
|||||||
ELanguage::German,
|
ELanguage::German,
|
||||||
{
|
{
|
||||||
{ EAspectRatio::Auto, { "AUTO", "Auto: Das Seitenverhältnis passt sich automatisch der Fenstergröße an." } },
|
{ EAspectRatio::Auto, { "AUTO", "Auto: Das Seitenverhältnis passt sich automatisch der Fenstergröße an." } },
|
||||||
{ EAspectRatio::Wide, { "16:9", "16:9: Stellt das Spiel in einem Breitbildschirm-Vormat dar." } },
|
{ EAspectRatio::Wide, { "16:9", "16:9: Stellt das Spiel in einem Breitbildschirm-Format dar." } },
|
||||||
{ EAspectRatio::Narrow, { "4:3", "4:3: Stellt das Spiel in einem Mittel-Vormat dar." } },
|
{ EAspectRatio::Narrow, { "4:3", "4:3: Stellt das Spiel in einem Mittel-Format dar." } },
|
||||||
{ EAspectRatio::OriginalNarrow, { "ORIGINAL 4:3", "Original 4:3: Stellt das Spiel in einem Mittel-Vormat dar, was der ursprünglichen Implementation originalgetreut bleibt." } }
|
{ EAspectRatio::OriginalNarrow, { "ORIGINAL 4:3", "Original 4:3: Stellt das Spiel in einem Mittel-Format dar, was der ursprünglichen Implementation originalgetreut bleibt." } }
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -378,7 +378,7 @@ std::unordered_map<std::string_view, std::unordered_map<ELanguage, std::string>>
|
|||||||
{ ELanguage::English, "Installation failed.\n\nError: " },
|
{ ELanguage::English, "Installation failed.\n\nError: " },
|
||||||
{ ELanguage::Japanese, "インストールに[失敗:しっぱい]しました\n\nエラー: " },
|
{ ELanguage::Japanese, "インストールに[失敗:しっぱい]しました\n\nエラー: " },
|
||||||
{ ELanguage::German, "Installation fehlgeschlagen.\n\nFehler: " },
|
{ ELanguage::German, "Installation fehlgeschlagen.\n\nFehler: " },
|
||||||
{ ELanguage::French, "L'installation a échouée.\n\nErreur : " },
|
{ ELanguage::French, "L'installation a échoué.\n\nErreur : " },
|
||||||
{ ELanguage::Spanish, "La instalación falló.\n\nError: " },
|
{ ELanguage::Spanish, "La instalación falló.\n\nError: " },
|
||||||
{ ELanguage::Italian, "Installazione fallita.\n\nErrore: " }
|
{ ELanguage::Italian, "Installazione fallita.\n\nErrore: " }
|
||||||
}
|
}
|
||||||
@@ -692,6 +692,17 @@ std::unordered_map<std::string_view, std::unordered_map<ELanguage, std::string>>
|
|||||||
{ 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." }
|
{ 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",
|
"Common_On",
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
#include <stdafx.h>
|
#include <stdafx.h>
|
||||||
|
#include <cpuid.h>
|
||||||
#include <cpu/guest_thread.h>
|
#include <cpu/guest_thread.h>
|
||||||
#include <gpu/video.h>
|
#include <gpu/video.h>
|
||||||
#include <kernel/function.h>
|
#include <kernel/function.h>
|
||||||
@@ -27,6 +28,15 @@
|
|||||||
#include <timeapi.h>
|
#include <timeapi.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(_WIN32) && defined(UNLEASHED_RECOMP_D3D12)
|
||||||
|
static std::array<std::string_view, 3> g_D3D12RequiredModules =
|
||||||
|
{
|
||||||
|
"D3D12/D3D12Core.dll",
|
||||||
|
"dxcompiler.dll",
|
||||||
|
"dxil.dll"
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
const size_t XMAIOBegin = 0x7FEA0000;
|
const size_t XMAIOBegin = 0x7FEA0000;
|
||||||
const size_t XMAIOEnd = XMAIOBegin + 0x0000FFFF;
|
const size_t XMAIOEnd = XMAIOBegin + 0x0000FFFF;
|
||||||
|
|
||||||
@@ -147,6 +157,29 @@ uint32_t LdrLoadModule(const std::filesystem::path &path)
|
|||||||
return entry;
|
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[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
@@ -156,7 +189,7 @@ int main(int argc, char *argv[])
|
|||||||
os::process::CheckConsole();
|
os::process::CheckConsole();
|
||||||
|
|
||||||
if (!os::registry::Init())
|
if (!os::registry::Init())
|
||||||
LOGN_WARNING("OS doesn't support registry");
|
LOGN_WARNING("OS does not support registry.");
|
||||||
|
|
||||||
os::logger::Init();
|
os::logger::Init();
|
||||||
|
|
||||||
@@ -180,6 +213,19 @@ int main(int argc, char *argv[])
|
|||||||
|
|
||||||
Config::Load();
|
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.
|
// 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;
|
constexpr double TimeBetweenUpdateChecksInSeconds = 6 * 60 * 60;
|
||||||
time_t timeNow = std::time(nullptr);
|
time_t timeNow = std::time(nullptr);
|
||||||
|
|||||||
@@ -212,6 +212,9 @@ g_sdlEventListenerForInputPatches;
|
|||||||
|
|
||||||
static bool IsDPadThreshold(const SWA::SPadState* pPadState)
|
static bool IsDPadThreshold(const SWA::SPadState* pPadState)
|
||||||
{
|
{
|
||||||
|
if (Config::DisableDPadMovement)
|
||||||
|
return false;
|
||||||
|
|
||||||
return pPadState->IsDown(SWA::eKeyState_DpadUp) ||
|
return pPadState->IsDown(SWA::eKeyState_DpadUp) ||
|
||||||
pPadState->IsDown(SWA::eKeyState_DpadDown) ||
|
pPadState->IsDown(SWA::eKeyState_DpadDown) ||
|
||||||
pPadState->IsDown(SWA::eKeyState_DpadLeft) ||
|
pPadState->IsDown(SWA::eKeyState_DpadLeft) ||
|
||||||
@@ -237,6 +240,9 @@ static bool IsCursorThreshold(double deadzone = 0, bool isBelowThreshold = false
|
|||||||
|
|
||||||
static void SetDPadAnalogDirectionX(PPCRegister& pPadState, PPCRegister& x, bool invert, float max = 1.0f)
|
static void SetDPadAnalogDirectionX(PPCRegister& pPadState, PPCRegister& x, bool invert, float max = 1.0f)
|
||||||
{
|
{
|
||||||
|
if (Config::DisableDPadMovement)
|
||||||
|
return;
|
||||||
|
|
||||||
auto pGuestPadState = (SWA::SPadState*)g_memory.Translate(pPadState.u32);
|
auto pGuestPadState = (SWA::SPadState*)g_memory.Translate(pPadState.u32);
|
||||||
|
|
||||||
if (pGuestPadState->IsDown(SWA::eKeyState_DpadLeft))
|
if (pGuestPadState->IsDown(SWA::eKeyState_DpadLeft))
|
||||||
@@ -248,6 +254,9 @@ static void SetDPadAnalogDirectionX(PPCRegister& pPadState, PPCRegister& x, bool
|
|||||||
|
|
||||||
static void SetDPadAnalogDirectionY(PPCRegister& pPadState, PPCRegister& y, bool invert, float max = 1.0f)
|
static void SetDPadAnalogDirectionY(PPCRegister& pPadState, PPCRegister& y, bool invert, float max = 1.0f)
|
||||||
{
|
{
|
||||||
|
if (Config::DisableDPadMovement)
|
||||||
|
return;
|
||||||
|
|
||||||
auto pGuestPadState = (SWA::SPadState*)g_memory.Translate(pPadState.u32);
|
auto pGuestPadState = (SWA::SPadState*)g_memory.Translate(pPadState.u32);
|
||||||
|
|
||||||
if (pGuestPadState->IsDown(SWA::eKeyState_DpadUp))
|
if (pGuestPadState->IsDown(SWA::eKeyState_DpadUp))
|
||||||
@@ -283,6 +292,9 @@ void PostureDPadSupportYMidAsmHook(PPCRegister& pPadState, PPCRegister& y)
|
|||||||
|
|
||||||
void PostureSpaceHurrierDPadSupportXMidAsmHook(PPCRegister& pPadState, PPCVRegister& vector)
|
void PostureSpaceHurrierDPadSupportXMidAsmHook(PPCRegister& pPadState, PPCVRegister& vector)
|
||||||
{
|
{
|
||||||
|
if (Config::DisableDPadMovement)
|
||||||
|
return;
|
||||||
|
|
||||||
auto pGuestPadState = (SWA::SPadState*)g_memory.Translate(pPadState.u32);
|
auto pGuestPadState = (SWA::SPadState*)g_memory.Translate(pPadState.u32);
|
||||||
|
|
||||||
if (pGuestPadState->IsDown(SWA::eKeyState_DpadLeft))
|
if (pGuestPadState->IsDown(SWA::eKeyState_DpadLeft))
|
||||||
@@ -294,6 +306,9 @@ void PostureSpaceHurrierDPadSupportXMidAsmHook(PPCRegister& pPadState, PPCVRegis
|
|||||||
|
|
||||||
void PostureSpaceHurrierDPadSupportYMidAsmHook(PPCRegister& pPadState, PPCVRegister& vector)
|
void PostureSpaceHurrierDPadSupportYMidAsmHook(PPCRegister& pPadState, PPCVRegister& vector)
|
||||||
{
|
{
|
||||||
|
if (Config::DisableDPadMovement)
|
||||||
|
return;
|
||||||
|
|
||||||
auto pGuestPadState = (SWA::SPadState*)g_memory.Translate(pPadState.u32);
|
auto pGuestPadState = (SWA::SPadState*)g_memory.Translate(pPadState.u32);
|
||||||
|
|
||||||
if (pGuestPadState->IsDown(SWA::eKeyState_DpadUp))
|
if (pGuestPadState->IsDown(SWA::eKeyState_DpadUp))
|
||||||
@@ -303,6 +318,18 @@ void PostureSpaceHurrierDPadSupportYMidAsmHook(PPCRegister& pPadState, PPCVRegis
|
|||||||
vector.f32[3] = -1.0f;
|
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 ------------- //
|
// ------------- WORLD MAP ------------- //
|
||||||
|
|
||||||
bool WorldMapDeadzoneMidAsmHook(PPCRegister& pPadState)
|
bool WorldMapDeadzoneMidAsmHook(PPCRegister& pPadState)
|
||||||
@@ -403,17 +430,20 @@ PPC_FUNC(sub_8256C938)
|
|||||||
pWorldMapCursor->m_LeftStickVertical = rPadState.LeftStickVertical;
|
pWorldMapCursor->m_LeftStickVertical = rPadState.LeftStickVertical;
|
||||||
pWorldMapCursor->m_LeftStickHorizontal = rPadState.LeftStickHorizontal;
|
pWorldMapCursor->m_LeftStickHorizontal = rPadState.LeftStickHorizontal;
|
||||||
|
|
||||||
if (rPadState.IsDown(SWA::eKeyState_DpadUp))
|
if (!Config::DisableDPadMovement)
|
||||||
pWorldMapCursor->m_LeftStickVertical = 1.0f;
|
{
|
||||||
|
if (rPadState.IsDown(SWA::eKeyState_DpadUp))
|
||||||
if (rPadState.IsDown(SWA::eKeyState_DpadDown))
|
pWorldMapCursor->m_LeftStickVertical = 1.0f;
|
||||||
pWorldMapCursor->m_LeftStickVertical = -1.0f;
|
|
||||||
|
if (rPadState.IsDown(SWA::eKeyState_DpadDown))
|
||||||
if (rPadState.IsDown(SWA::eKeyState_DpadLeft))
|
pWorldMapCursor->m_LeftStickVertical = -1.0f;
|
||||||
pWorldMapCursor->m_LeftStickHorizontal = -1.0f;
|
|
||||||
|
if (rPadState.IsDown(SWA::eKeyState_DpadLeft))
|
||||||
if (rPadState.IsDown(SWA::eKeyState_DpadRight))
|
pWorldMapCursor->m_LeftStickHorizontal = -1.0f;
|
||||||
pWorldMapCursor->m_LeftStickHorizontal = 1.0f;
|
|
||||||
|
if (rPadState.IsDown(SWA::eKeyState_DpadRight))
|
||||||
|
pWorldMapCursor->m_LeftStickHorizontal = 1.0f;
|
||||||
|
}
|
||||||
|
|
||||||
if (sqrtl((pWorldMapCursor->m_LeftStickHorizontal * pWorldMapCursor->m_LeftStickHorizontal) +
|
if (sqrtl((pWorldMapCursor->m_LeftStickHorizontal * pWorldMapCursor->m_LeftStickHorizontal) +
|
||||||
(pWorldMapCursor->m_LeftStickVertical * pWorldMapCursor->m_LeftStickVertical)) > WORLD_MAP_ROTATE_DEADZONE)
|
(pWorldMapCursor->m_LeftStickVertical * pWorldMapCursor->m_LeftStickVertical)) > WORLD_MAP_ROTATE_DEADZONE)
|
||||||
|
|||||||
@@ -146,3 +146,13 @@ PPC_FUNC(sub_824C1E60)
|
|||||||
|
|
||||||
__imp__sub_824C1E60(ctx, base);
|
__imp__sub_824C1E60(ctx, base);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Remove boost filter
|
||||||
|
void DisableBoostFilterMidAsmHook(PPCRegister& r11)
|
||||||
|
{
|
||||||
|
if (Config::DisableBoostFilter)
|
||||||
|
{
|
||||||
|
if (r11.u32 == 1)
|
||||||
|
r11.u32 = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -95,13 +95,6 @@ void PostUnleashMidAsmHook(PPCRegister& r30)
|
|||||||
g_isUnleashCancelled = false;
|
g_isUnleashCancelled = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SetXButtonHomingMidAsmHook(PPCRegister& r1)
|
|
||||||
{
|
|
||||||
auto pXButtonHoming = (bool*)(g_memory.base + r1.u32 + 0x63);
|
|
||||||
|
|
||||||
*pXButtonHoming = !Config::HomingAttackOnJump;
|
|
||||||
}
|
|
||||||
|
|
||||||
// SWA::Player::CEvilSonicContext
|
// SWA::Player::CEvilSonicContext
|
||||||
PPC_FUNC_IMPL(__imp__sub_823B49D8);
|
PPC_FUNC_IMPL(__imp__sub_823B49D8);
|
||||||
PPC_FUNC(sub_823B49D8)
|
PPC_FUNC(sub_823B49D8)
|
||||||
|
|||||||
@@ -97,6 +97,8 @@ PPC_FUNC(sub_824E5170)
|
|||||||
|
|
||||||
__imp__sub_824E5170(ctx, base);
|
__imp__sub_824E5170(ctx, base);
|
||||||
|
|
||||||
|
App::s_isSaving = pSaveIcon->m_IsVisible;
|
||||||
|
|
||||||
if (pSaveIcon->m_IsVisible)
|
if (pSaveIcon->m_IsVisible)
|
||||||
{
|
{
|
||||||
App::s_isSaveDataCorrupt = false;
|
App::s_isSaveDataCorrupt = false;
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
VERSION_MILESTONE=""
|
VERSION_MILESTONE=""
|
||||||
VERSION_MAJOR=1
|
VERSION_MAJOR=1
|
||||||
VERSION_MINOR=0
|
VERSION_MINOR=0
|
||||||
VERSION_REVISION=1
|
VERSION_REVISION=2
|
||||||
|
|||||||
@@ -34,8 +34,14 @@ int Window_OnSDLEvent(void*, SDL_Event* event)
|
|||||||
switch (event->type)
|
switch (event->type)
|
||||||
{
|
{
|
||||||
case SDL_QUIT:
|
case SDL_QUIT:
|
||||||
|
{
|
||||||
|
if (App::s_isSaving)
|
||||||
|
break;
|
||||||
|
|
||||||
App::Exit();
|
App::Exit();
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
case SDL_KEYDOWN:
|
case SDL_KEYDOWN:
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -95,7 +95,7 @@ enum class ETripleBuffering : uint32_t
|
|||||||
};
|
};
|
||||||
|
|
||||||
static constexpr int32_t FPS_MIN = 15;
|
static constexpr int32_t FPS_MIN = 15;
|
||||||
static constexpr int32_t FPS_MAX = 240;
|
static constexpr int32_t FPS_MAX = 241;
|
||||||
|
|
||||||
enum class EAntiAliasing : uint32_t
|
enum class EAntiAliasing : uint32_t
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -77,8 +77,11 @@ CONFIG_DEFINE_ENUM_LOCALISED("Video", EUIAlignmentMode, UIAlignmentMode, EUIAlig
|
|||||||
|
|
||||||
CONFIG_DEFINE_HIDDEN("Codes", bool, AllowCancellingUnleash, false);
|
CONFIG_DEFINE_HIDDEN("Codes", bool, AllowCancellingUnleash, false);
|
||||||
CONFIG_DEFINE_HIDDEN("Codes", bool, DisableAutoSaveWarning, 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, DisableDLCIcon, false);
|
||||||
|
CONFIG_DEFINE_HIDDEN("Codes", bool, DisableDPadMovement, false);
|
||||||
CONFIG_DEFINE_HIDDEN("Codes", bool, DisableDWMRoundedCorners, 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, EnableEventCollisionDebugView, false);
|
||||||
CONFIG_DEFINE_HIDDEN("Codes", bool, EnableGIMipLevelDebugView, false);
|
CONFIG_DEFINE_HIDDEN("Codes", bool, EnableGIMipLevelDebugView, false);
|
||||||
CONFIG_DEFINE_HIDDEN("Codes", bool, EnableObjectCollisionDebugView, false);
|
CONFIG_DEFINE_HIDDEN("Codes", bool, EnableObjectCollisionDebugView, false);
|
||||||
@@ -91,6 +94,5 @@ CONFIG_DEFINE_HIDDEN("Codes", bool, SaveScoreAtCheckpoints, false);
|
|||||||
CONFIG_DEFINE_HIDDEN("Codes", bool, SkipIntroLogos, false);
|
CONFIG_DEFINE_HIDDEN("Codes", bool, SkipIntroLogos, false);
|
||||||
CONFIG_DEFINE_HIDDEN("Codes", bool, UseArrowsForTimeOfDayTransition, false);
|
CONFIG_DEFINE_HIDDEN("Codes", bool, UseArrowsForTimeOfDayTransition, false);
|
||||||
CONFIG_DEFINE_HIDDEN("Codes", bool, UseOfficialTitleOnTitleBar, false);
|
CONFIG_DEFINE_HIDDEN("Codes", bool, UseOfficialTitleOnTitleBar, false);
|
||||||
CONFIG_DEFINE_HIDDEN("Codes", bool, DisableLowResolutionFontOnCustomUI, false);
|
|
||||||
|
|
||||||
CONFIG_DEFINE("Update", time_t, LastChecked, 0);
|
CONFIG_DEFINE("Update", time_t, LastChecked, 0);
|
||||||
|
|||||||
@@ -8,6 +8,8 @@
|
|||||||
#define GAME_INSTALL_DIRECTORY "."
|
#define GAME_INSTALL_DIRECTORY "."
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
extern std::filesystem::path g_executableRoot;
|
||||||
|
|
||||||
inline std::filesystem::path GetGamePath()
|
inline std::filesystem::path GetGamePath()
|
||||||
{
|
{
|
||||||
return GAME_INSTALL_DIRECTORY;
|
return GAME_INSTALL_DIRECTORY;
|
||||||
|
|||||||
@@ -181,8 +181,8 @@ jump_address_on_true = 0x829E40A0
|
|||||||
# Disable Chip hints for shoe upgrades
|
# Disable Chip hints for shoe upgrades
|
||||||
[[midasm_hook]]
|
[[midasm_hook]]
|
||||||
name = "DisableHintsMidAsmHook"
|
name = "DisableHintsMidAsmHook"
|
||||||
address = 0x82691CB0
|
address = 0x82691DD0
|
||||||
jump_address_on_true = 0x82691E24
|
jump_address_on_true = 0x82691DD4
|
||||||
|
|
||||||
# Disable navigation volumes
|
# Disable navigation volumes
|
||||||
[[midasm_hook]]
|
[[midasm_hook]]
|
||||||
@@ -197,11 +197,18 @@ address = 0x823A4FF0
|
|||||||
registers = ["r4", "r5"]
|
registers = ["r4", "r5"]
|
||||||
return_on_false = true
|
return_on_false = true
|
||||||
|
|
||||||
|
# Set default value for XButtonHoming.
|
||||||
[[midasm_hook]]
|
[[midasm_hook]]
|
||||||
name = "SetXButtonHomingMidAsmHook"
|
name = "SetXButtonHomingMidAsmHook"
|
||||||
address = 0x8237AC90
|
address = 0x8237AC90
|
||||||
registers = ["r1"]
|
registers = ["r1"]
|
||||||
|
|
||||||
|
# Disable XML reading for XButtonHoming.
|
||||||
|
[[midasm_hook]]
|
||||||
|
name = "IsHomingAttackOnJump"
|
||||||
|
address = 0x8237ACE4
|
||||||
|
jump_address_on_true = 0x8237ACE8
|
||||||
|
|
||||||
# Down force HFR fix
|
# Down force HFR fix
|
||||||
[[midasm_hook]]
|
[[midasm_hook]]
|
||||||
name = "DownForceDeltaTimeFixMidAsmHook"
|
name = "DownForceDeltaTimeFixMidAsmHook"
|
||||||
@@ -1093,3 +1100,8 @@ registers = ["r31", "r29", "r28"]
|
|||||||
name = "ObjGrindDashPanelAllocMidAsmHook"
|
name = "ObjGrindDashPanelAllocMidAsmHook"
|
||||||
address = 0x82614948
|
address = 0x82614948
|
||||||
registers = ["r3"]
|
registers = ["r3"]
|
||||||
|
|
||||||
|
[[midasm_hook]]
|
||||||
|
name = "DisableBoostFilterMidAsmHook"
|
||||||
|
address = 0x82B48C9C
|
||||||
|
registers = ["r11"]
|
||||||
|
|||||||
+6
-1
@@ -37,10 +37,15 @@ In the installer, you must select the following **Workloads** and **Individual c
|
|||||||
- C++ CMake tools for Windows
|
- C++ CMake tools for Windows
|
||||||
|
|
||||||
### Linux
|
### Linux
|
||||||
The following command will install the required dependencies on a distro that uses `apt` (such as Ubuntu), but you can find the equivalent packages for your preferred distro.
|
The following command will install the required dependencies on a distro that uses `apt` (such as Debian-based distros).
|
||||||
```bash
|
```bash
|
||||||
sudo apt install autoconf automake libtool pkg-config curl cmake ninja-build clang clang-tools libgtk-3-dev
|
sudo apt install autoconf automake libtool pkg-config curl cmake ninja-build clang clang-tools libgtk-3-dev
|
||||||
```
|
```
|
||||||
|
The following command will install the required dependencies on a distro that uses `pacman` (such as Arch-based distros).
|
||||||
|
```bash
|
||||||
|
sudo pacman -S base-devel ninja lld clang gtk3
|
||||||
|
```
|
||||||
|
You can also find the equivalent packages for your preferred distro.
|
||||||
|
|
||||||
> [!NOTE]
|
> [!NOTE]
|
||||||
> This list may not be comprehensive for your particular distro and you may be required to install additional packages, should an error occur during configuration.
|
> This list may not be comprehensive for your particular distro and you may be required to install additional packages, should an error occur during configuration.
|
||||||
|
|||||||
+1
-1
Submodule tools/XenonRecomp updated: cd6fcb33bd...7b8e37aa37
Reference in New Issue
Block a user