Static recompilation of Castlevania: Symphony of the Night (Xbox Live Arcade) for Windows and Linux, built on the ReXGlue SDK.
This project converts the Xbox 360 PowerPC default.xex into native x86_64
code at build time, then wraps it with a small host runtime (logging,
overlays, hooks) so the game runs natively and can be modded like a PC port.
You must own the game. This project does not ship any NocturneRecomp code, data, or assets. You provide your own legally dumped ISO.
Get the game on Goopie!
paru -S clang20 cmake ninja vulkan-headersscoop install llvm cmake ninjagit clone https://github.com/birabittoh/NocturneRecomp
cd NocturneRecomppython scripts/download-sdk.pyPlace your legally dumped XBLA package (the LIVE/STFS file) into game/, then extract it into assets/:
python scripts/extract-game.pyassets/default.xex must exist before running codegen.
Use this script:
# Vanilla
python scripts/build.py
# Title Update
python scripts/build.py --tu /path/to/TU_*python scripts/run.pyThis runs the freshly built executable with the correct CLI arguments
(--game_data_root=assets, --gpu_plugin=xenos, --license_mask=1).
Any extra arguments are forwarded to the executable, e.g.:
python scripts/run.py --vulkan_device 1Options can be persisted by adding them to nocturnerecomp.toml next to the game executable, for example:
vulkan_device = 1 # NVIDIA GPU
user_language = 1 # EnglishKeyboard and mouse controls are enabled by default. All bindings are overridable in the F4 menu or nocturnerecomp.toml. For example:
keybind_a = "F"
keybind_left_trigger = "LControl"
mnk_sensitivity = 0.5Mouse sensitivity is controlled by mnk_sensitivity (default 1.0).
If you have multiple GPUs, you can force a specific one:
python scripts/run.py --vulkan_device 1List available devices by running the game without the flag.
The game writes logs into the logs directory by default, but you can configure it.
python scripts/run.py --log_file nocturne.log --log_level debug-
Find the guest address in
default.xex. -
Add to
nocturnerecomp_config.toml:[functions] 0x8XXXXXXX = {name = "MyFunction"}
-
Implement in
src/nocturnerecomp_hooks.cpp(create if it doesn't exist, and add it toCMakeLists.txt):void MyFunction(PPCContext& ctx, uint8_t* base) { // your logic }
-
Re-run codegen and rebuild.
[[midasm_hook]]
address = 0x8XXXXXXX
name = "MyHook"
registers = ["r3"]
return = trueImplement in src/nocturnerecomp_hooks.cpp:
void MyHook(PPCRegister& r3) {
r3.u32 = 1;
}The host-side source in src/, build scripts, and CI config are available
under the MIT License.
The recompiled game code produced at build time contains symbols and logic
from NocturneRecomp and is not redistributable. Do not share
default.xex, the generated/ directory, or any built binary that links
against them.