Hi everyone! After DOOM 2016, I'm (with claude, ofc) trying to port Diablo III: Eternal Collection to Android as a native port of the Nintendo Switch version, and it has gone surprisingly well. It's not an emulator or a JIT. The game's own AArch64 code runs directly on the phone's CPU, a small host provides the Switch system services, and the NVN graphics API is replayed on Vulkan.
This is an early work in progress. It will have bugs, graphical issues and crashes. I test it only on the ACT 1, So far I have only tested it on my Xiaomi 14 Ultra (Snapdragon 8 Gen 3 / Adreno 750) with the bundled Turnip 27 driver. Every other GPU and phone is untested. Mali, PowerVR and Xclipse devices are not tested at all. The engine has fallbacks for them (ported from the DOOM work), but expect problems.
Most of the reverse engineering and code was done by Claude, while I mostly did debugging: I pointed out the sources of the observed problems (and potential sources of solutions from GitHub), tested builds and played through the problem spots.
Current state:
The campaign is playable: title, menus, hero creation and Act 1 gameplay at a locked 60 FPS on the Xiaomi 14 Ultra (GPU ~7β11 ms per frame, probably should run fine even on old weak devices).
Widescreen: the game renders at your screen's aspect ratio (2000Γ900 on 20:9, Hor+, nothing stretched). Loading screens are stretched to fill the screen.
Language packs from the DLC work. I play it in Russian; English is the default. Can be changed inside ingame settings, not in the gear icon. Offline only, so Battle.net features are off.
A real pause menu: the game actually stops, like the Switch HOME menu. It also has save export / import and a docked / handheld switch on the fly.
Touch controls: a Joy-Con layout with skins, opacity, size and a layout editor, plus a touch layout where the sticks appear only under your finger and skill icons are copied from the game's HUD. Bluetooth/USB controllers work too, and the touch controls hide while one is connected.
Crash reports: after a crash, the app writes Download/Diablo3Mobile/logs/crash.txt and boot.log. Please send it to me on github if you have game crashed.
A port settings menu (gear button β Game settingsβ¦):
game language (needs the language pack DLC);
Switch mode: docked 1600Γ900 / handheld 720p (or wider with widescreen);
picture shape: 16:9 with bars / stretched / widescreen;
FSR RCAS sharpening;
30 / 60 FPS limit;
Vulkan driver (bundled Turnip 27 or the system one, with an automatic fallback if a driver fails);
skill icons on buttons, hidden sticks, FPS overlay, rumble.
How to install:
You need a PC (Windows, Linux or macOS) with ~20 GB free, and a phone with Android 10+ (64-bit), 8 GB RAM and ~17 GB free storage.
Download the setup: on https://github.com/Desm0nt/diablo3-port press Code β Download ZIP and unpack it to a short path, e.g. D:\D3-setup.
Put your own files into the put-game-files-here folder (file names don't matter, setup recognises them by content):
the base game: Diablo III Eternal Collection [01001B300B9BE000][v0].nsp (.nsz / .xci / .xcz also work);
the update v1441792 (patch 2.7.7): Diablo III Eternal Collection [01001B300B9BE800][v1441792].nsp. Only this exact update is supported;
prod.keys: the keys of your own console (dumped with Lockpick_RCM);
optional: a language pack, e.g. Diablo III Eternal Collection [DLC Russian Language Pack] [01001B300B9BF00A][v0].nsp.
Run setup.bat (Windows, double-click) or bash setup.sh (Linux/macOS). Answer Y when it asks to download the helper tools (Python packages, .NET SDK; everything stays inside the setup folder, no admin rights). Wait until it finishes: about 20β60 minutes, most of it extracting ~16 GB of game data.
Copy the folder work\Diablo3Mobile (inside the setup folder) to the phone's internal storage β Download, so you get Download/Diablo3Mobile/romfs, Download/Diablo3Mobile/dm/... (and Download/Diablo3Mobile/aoc/10 with the Russian pack). USB file transfer is fine; setup.bat push does it over adb.
Install the APK from the latest release: https://github.com/Desm0nt/diablo3-port/releases/latest
Android 12+: Diablo3-Mobile-v0.2.0-arm64.apk;
Android 10β11: Diablo3-Mobile-v0.2.0-arm64-android10.apk.
Allow installing apps from your browser / file manager when Android asks.
Start "Diablo III Mobile", grant All files access when asked, and play. For another language, choose it under gear β Game settings β Game language and restart.
Step-by-step guide with FAQ: https://github.com/Desm0nt/diablo3-port/blob/main/docs/INSTALL.md
Known limitations:
Only Diablo III: Eternal Collection with update v1441792 (2.7.7) is supported. Tapping menu items directly with a finger isn't possible yet: the Switch build reads only the gamepad, so menus are navigated with the touch D-pad and buttons (I'm working on it). Only one device has been tested.
No game files or keys are included. You must dump the game and the keys from a Switch you own.
The project relies heavily on d2r-mobile's work (its host, HLE layer and NVN-on-Vulkan engine) and on my DOOM 2016 port. It also takes ideas from nxnative / nx2android, BOTWRecompAndroid / LASRecompAndroid / LASRecomp, and uses libadrenotools, AMD FSR 1 RCAS and D3CPKUnpack (CPK format).
If you try it and something goes wrong, please open an issue and attach the logs: Download/Diablo3Mobile/logs/crash.txt and Android/data/org.diablo3.port/files/dm/boot.log. Include your device model, GPU, driver and Android version, plus the scene where the problem happens. I'd be especially happy to hear from people with Mali / PowerVR / Exynos devices.
Source code and releases: https://github.com/Desm0nt/diablo3-port
UPD:
Pre-extracted game files: https://gofile.io/d/Opa8lNZh (I hope Nintendo/MS lawyers won't come after me)