# Asura's Wrath Recompiled
PC port of Asura's Wrath (`default.xex`, Title ID `43430817`) via Xbox 360 static PowerPC recompilation to C++23.
> Note: Android port is experimental, use on your own risk.
https://www.youtube.com/playlist?list=PLVyuezqTsTB0
> Original illustration by Satoshi Sakai
---
## 1. Requirements
- A copy of the Xbox 360 game ISO (`Asura's Wrath.iso`).
- [extract-xiso](https://github.com/XboxDev/extract-xiso) tool to extract `.iso` contents.
- CMake 3.25+ and Clang / Ninja compiler toolchain.
---
## 2. Setup
### Clone Repository
```bash
git clone --recursive https://github.com/PauloUbirajara/asuras-wrath-recomp.git
cd asuras-wrath-recomp
```
---
## 3. Build
> Requires the .iso contents in extracted/ to build.
### Option A: Using CMake Presets (Linux / Windows / Android)
#### Linux
```bash
cmake --preset linux-amd64-release
cmake --build out/build/linux-amd64-release --parallel
```
#### Windows
```cmd
cmake --preset win-amd64-release
cmake --build out/build/win-amd64-release --parallel
```
#### Android
```bash
cmake --preset android-aarch64-release
cmake --build out/build/android-aarch64-release --parallel
```
---
### Option B: Using Build Scripts
#### Linux
```bash
# Build binary
./build.sh
# Build binary and create release zip archive in out/ directory
./build.sh --package
# out/
# ├── build
# │ └── linux-amd64-release
# └── dist
# ├── asura_wrath_recomp_linux_x86_64
# └── asura_wrath_recomp_linux_x86_64.zip
```
#### Windows
```ps1
# Build binary
build.bat
# Build binary and create release zip archive in out/ directory
build.bat --package
# out/
# ├── build
# │ └── win-amd64-release
# └── dist
# ├── asura_wrath_recomp_win_amd64.exe
# └── asura_wrath_recomp_win_amd64.zip
```
#### Android
```bash
# Build release APK
./build_android.sh
# Build debug APK
./build_android.sh --debug
# out/dist/asura_wrath_recomp_android.apk
```
---
## 4. Game Setup
In the same directory as the executable, run the following:
```bash
# Extract Game ISO
mkdir -p extracted/
extract-xiso -x asura_wrath.iso -d extracted/
# (Optional) Install DLC Content (Not supported/tested yet)
```
If extracted game is somewhere else, it can be specified via the `--game_data_root` argument:
```bash
asura_wrath_recomp --game_data_root=/path/to/extracted/game
```
Available ReXGlue Path Configuration Flags:
| Flag | Description | Default |
| - | - | - |
| `--cache_root` | Directory for compiled Vulkan pipeline and shader storage. | `cache` |
| `--game_data_root` | Root directory containing extracted game files. | `extracted` (if exists) or current directory |
| `--metadata_root` | Directory for game metadata. | `(empty)` |
| `--update_data_root` | Directory containing game update / DLC patches. | `(empty)` |
| `--user_data_root` | Directory for user save games and profile data. | `%USERPROFILE%\Documents\asura_wrath_recomp` (Windows) |
| `--user_data_root` | Directory for user save games and profile data. | `~/.local/share/asura_wrath_recomp` (Linux) |
---
## 5. Run
### Expected Folder Structure Before Running
#### Linux
```
├── asura_wrath_recomp # Executable
├── extracted/ # .iso contents
├── librexgpu-xenos.so
├── librexruntime.so
└── libTracyClient.so
```
#### Windows
```
├── asura_wrath_recomp.exe # Executable
├── extracted/ # .iso contents
├── rexgpu-xenos.dll
├── rexruntime.dll
└── TracyClient.dll
```
### Save Locations
| OS | Location |
| :--- | :--- |
| Linux | `~/.local/share/asura_wrath_recomp` |
| Windows | `%USERPROFILE%\Documents\asura_wrath_recomp\` |
| Android | `` |
### Linux
```bash
asura_wrath_recomp
# Linux (What currently works best for me)
asura_wrath_recomp \
--async_shader_compilation=true \
--render_target_path_vulkan=fsi \
--vulkan_async_skip_incomplete_frames=true \
--vulkan_device=1 \
--vulkan_pipeline_creation_threads=6 \
--window_height=1080 \
--window_width=1920
```
### Windows
```cmd
asura_wrath_recomp.exe
```
### Android
```bash
# Install the game on your phone/emulator
adb install -r out/dist/asura_wrath_recomp_android.apk
# Run the game
adb shell am start -n asura_wrath.recomp/.MainActivity
```
## 6. Custom Run Flags
#### Custom Backend
```cmd
asura_wrath_recomp.exe --gpu_backend=vulkan
asura_wrath_recomp.exe --gpu_backend=d3d12
```
#### Custom Resolution
```bash
asura_wrath_recomp --window_width=1920 --window_height=1080
```
#### Selecting GPU Device
List available GPUs and their index numbers on your system:
```bash
vulkaninfo --summary | grep -E 'GPU[0-9]+:|deviceName'
```
Output:
```text
GPU0:
deviceName = Intel(R) UHD Graphics (CML GT2)
GPU1:
deviceName = NVIDIA GeForce GTX 1650
GPU2:
deviceName = llvmpipe (LLVM 20.1.8, 256 bits)
```
Pass `--vulkan_device=` to target a specific GPU (e.g., index `1` for discrete NVIDIA GPU):
```bash
asura_wrath_recomp --vulkan_device=1
```
#### Render Target Path (`fsi` vs `fbo`)
- `fbo`: Host framebuffers (default, higher performance, can produce color artifacts on some GPUs).
- `fsi`: Fragment Shader Interlock (software EDRAM pixel packing, fixes red overlay artifacts on NVIDIA GPUs).
Fix red overlay artifact on NVIDIA GPUs:
```bash
asura_wrath_recomp --vulkan_device=1 --render_target_path_vulkan=fsi
```
Switch back to host framebuffers:
```bash
asura_wrath_recomp --render_target_path_vulkan=fbo
```
---
## 7. Credits
- Powered by **ReXGlue** (https://github.com/rexglue/rexglue-sdk), an open-source static recompilation framework for Xbox 360 software.
- UI touch controls made possible by using **kenney.nl** Xbox gamepad assets (https://kenney.nl/assets/input-prompts)
---
## 8. Issues
- Had to use FSI over FBO to avoid red artifacts (performance loss / stutters due to on-demand texture / shader compilation - also seen in https://github.com/rexglue/rexglue-sdk/blob/71782a3bc15cd1994381757fae7d616242f22e6a/src/graphics/vulkan/render_target_cache.cpp#L44-L63)
---
## 9. TODO
- [ ] Add touch controls for Android (?)
- [ ] Improve performance
- [ ] Make DLCs work
- [ ] Test for Android (?)
- [ ] Test for Windows (?)
- [x] Make consistent builds
- [x] Make it easier to build & run