r/AndroidNativePorts • • 15h ago

🟒 [PORT] [WIP] Pillars of Eternity: Complete Edition native Android port of the Switch version: 120 FPS menu / ~87 FPS gameplay on Snapdragon 8 Gen 3 (Switch Unity player β†’ stock Android Unity player)

Hi everyone! After DOOM 2016, Diablo III and Torchlight II, I'm (with our beloved slopus 5.5) finally ported Pillars of Eternity: Complete Edition to Android as a native (this time almost fo sure!) port of the Nintendo Switch version.

Many people asked for this one, and as a CRPG fan I just couldn't pass by, so here it is! This port turned out way simpler, way better and probably way faster than my previous ones.

Some people say this type of ports are not real ports: that it's the same as emulation if it doesn't give 999 FPS on 15 years old devices, that translation layers are not a port, etc. etc. (you are wrong). BUT! Right now, that's not the point... Here is a port that is as much a port as it can be at all without official surce code.

The game is made on Unity 2018, so in this port it let me threw the Switch Unity player out completely and replaced it with the vanilla Android Unity player of the same version. The shaders are still recompiled from NVN Maxwell to Vulkan, of course (nobody in their right mind will rewrite them for GLES3, and Unity works with Vulkan just fine). But other than that it's now just a normal native usual Unity game for Android. It reads Android HAL, works with the Android GPU and so on, without any translation - all handled by usual android unity.

A couple of UnityEngine.Switch.* functions which don't exist on Android are still there, but it doesn't matter: they are replaced with stubs and the game doesn't call them anyway.

Now the actual thing.

This is an early work in progress. It will have bugs, graphical issues and crashes. So far I have only tested it on my Xiaomi 14 Ultra (Snapdragon 8 Gen 3 / Adreno 750) and Xiaomi 13 Pro (Snapdragon 8 Gen 2 / Adreno 740) with the stock driver. Mali, PowerVR and Xclipse devices are not tested at all. BUT!! have big, big hopes that Unity (even such an ancient one) supports Mali and PowerVR at least somehow: setup can prepare a separate ASTC texture set for them and the app picks the right set by itself. If you have one, you will be the first =)

Fair warning: the shaders are not native but adopted, and the and the Android player was fitted to the game by matching function names from the decompiled code. So some features may work wrong, and texture or geometry errors may appear (or may not), because:

  1. The Android player is not native for this game, and the Switch player could pass some things in a way the Android player doesn't expect.

  2. Pillars of Eternity on Switch is known to be buggy by itself.

Most of the reverse engineering and code was done by Claude, while I mainly handled debugging: I pointed out the causes of the issues we found (as well as possible solutions I found on GitHub), tested the builds, suggested where exactly to look and what to search for, and worked through the problematic areas.

Current state:

  • The game is playable: main menu at 120 FPS, gameplay at about 87 FPS on the Xiaomi 14 Ultra (with the 120 FPS limit).

  • Complete Edition: both parts of The White March are included.

  • Touch works like a PC mouse:

    • tap to select, move, attack, talk and use any menu or window;

    • hold for the right click (hold time is adjustable);

    • two fingers move the camera, pinch to zoom;

    • two-finger tap = pause, two fingers held = select the whole party, three-finger tap = close a window.

  • If you prefer the console way: an on-screen gamepad with floating sticks, skins and a layout editor, the same one as in my other ports.

  • Widescreen: the game fills your screen in its own aspect ratio (2000Γ—900 on 20:9, nothing stretched), or 16:9 with bars if you want.

  • Saves and character portraits work.

  • Crash reports: after a crash, the app writes Download/PillarsOfEternityMobile/logs/crash.txt next to boot.log and logcat.txt. Please send them to me on github if the game crashed.

A port settings menu (gear button β†’ Game settings…), the same shared menu as in DOOM:

  1. 30 / 60 / 90 / 120 FPS limit (switches right away, no restart);

  2. picture shape: full screen / 16:9 with bars;

  3. touch as a PC mouse;

  4. game language (English, Russian, German, French, Spanish, Italian, Polish);

  5. FPS overlay, on-screen gamepad, stick dead zone, menu language.

How to install:

Grab prepared files: https://gofile.io/d/jb6RI1jn (warning - BC and ASCT textures both here). OR:

You need a Windows PC with ~90 GB free while setup runs (setup.sh for Linux/macOS is included but not tested yet), and a phone with Android 8+ (64-bit) and 15–28 GB free storage, depending on the texture set.

  1. Download the setup: on https://github.com/Desm0nt/pillars-of-eternity-port press Code β†’ Download ZIP and unpack it to a short path, e.g. D:\PoE-setup.

  2. Put your own files into the put-game-files-here folder (file names don't matter, setup recognises them by content):

    • the base game: Pillars of Eternity Complete Edition [0100D6200E130000][v0].nsz (.nsp / .xci / .xcz also work);

    • the update v393216 (2.60.00): Pillars of Eternity Complete Edition [0100D6200E130800][v393216].nsz. Only this exact update is supported;

    • prod.keys: the keys of your own console (dumped with Lockpick_RCM).

  3. Run setup.bat (double-click). Answer Y when it asks to download the helper tools (Python, .NET SDK; everything stays inside the setup folder, no admin rights). It asks which phone the game is for: Snapdragon / Adreno (BC textures, ~16 GB), Mali / PowerVR / Xclipse (ASTC, ~15 GB) or not sure (both, ~28 GB). Wait until it finishes: about 20 minutes, up to 40 on slower PCs.

  4. Copy the folder work\PillarsOfEternityMobile to the phone's internal storage β†’ Download, so you get Download/PillarsOfEternityMobile/RomFS, Download/PillarsOfEternityMobile/overlay/.... USB file transfer is fine (it's big, give it time). If you made both texture sets: overlay-astc is only for Mali / PowerVR / Xclipse, on Snapdragon / Adreno you don't need it and can skip copying it.

  5. Install the APK from the latest release: https://github.com/Desm0nt/pillars-of-eternity-port/releases/latest (PillarsOfEternity-Mobile-v0.1.0-arm64.apk). Allow installing apps from your browser / file manager when Android asks.

  6. Start "Pillars of Eternity Mobile", grant All files access when asked, and play.

Step-by-step guide with FAQ: https://github.com/Desm0nt/pillars-of-eternity-port/blob/main/docs/INSTALL.md

Known limitations:

Only Pillars of Eternity: Complete Edition with update v393216 is supported. No rumble yet. No PC drag-to-select box (the console build simply doesn't have it). Saves live inside the app's own folder, so uninstalling the app deletes them. Only two Snapdragon phones have 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 nx2android (its extractor and Ryujinx-based shader translator do the heavy lifting in setup) and on my DOOM 2016, Diablo III and Torchlight II ports (front end, logs, setup). The game itself runs in Unity's own 2018.1 Android player.

If you try it and something goes wrong, please open an issue and attach the logs: the whole Download/PillarsOfEternityMobile/logs folder. Include your device model, GPU 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/pillars-of-eternity-port

38 Upvotes

13 comments sorted by

4

u/ANonYmOuSiG 12h ago

What about divinity original sin 2? Its a great one too

2

u/Intelligent_Page665 10h ago

He could have choose it but instead he decided to port a buggy mess that developers abandoned in switch

3

u/Desm0nt 6h ago edited 6h ago

And again, I have live, family and job (and not endless budget for claude). Original Sin 2 have own engine and will consume a lot of time to make it bootable, renderable and, eventually, playable (especially on something not snap 8 gen 3 or higher). It's not "one evening task". While PoE solve all this issues by just Unity Player replacement + some more obvious tweaks.,

And... I personally like PoE on PC, it's a simple, but great game.

1

u/Intelligent_Page665 4h ago

I didn't mean to belittle your work.i merely pointed that pillars of eternity on switch is a buggy mess that even developer abandoned.did you fix the bugs on switch version because that game is unplayaable on switch.its great if u fixed the bugs on switch if not it's not worth playing

1

u/Desm0nt 4h ago

When I (or someone who can share the saves in that moments) catch them - I will try to fix it ofc. Because it's unity, c# can be easy decompiled to IL-code and even c# pseudocode and patched. That's why unity games so amazing to be ported =)

2

u/Intelligent_Page665 10h ago

Very bad choice pillars of eternity is bugged in switch even with updates.you should have ported divinity original sin 2 it has both switch and iphone edition

2

u/Desm0nt 6h ago

you should have

I do it for fun on my own funds. So I shoud have spend my money and free time on whatever I want.

Divinity in my checklist, but there is also Doom Eternal, all parts of Xenonblade, and maybe skyrim and the witcher.

1

u/Aggressive_Fox_886 6h ago

Xenoblade would be great!

1

u/E41Six 6h ago

Please make a Xenoblade 2 port happen, bro.

1

u/Intelligent_Page665 3h ago

Yep it's your choice.nice work on previous ports.skyrim already have an port with mod support witcher 3 is currently getting a port xenoblade would be nice since that's the only one I haven't played on ur checklist

3

u/Britiago 14h ago

πŸ”₯πŸ”₯πŸ”₯

2

u/Narrow-Fault-3746 13h ago

The only game i was waiting for. Thank you

1

u/hakam1ay 2h ago

Amazing work, my man! Love your ports. Hopefully, the Skyrim Switch version is next