Releases: NextOs-Ports/kotor-nextos
Release list
1.0.3 — controller rework + Quick Save freeze fix
Field-report fixes, all verified on real hardware (R36S/ArkOS) before release.
Controllers (muOS RG40XX-H "only d-pad works", ROCKNIX RG DS "d-pad dead", can't exit)
The pad normalizer no longer guesses the physical layout from the controller's USB id. retrogame_joypad is configured per firmware, so the same id ships different button orders — and sometimes a HAT d-pad — on different CFWs. The translation table is now built at runtime from the controller mapping your firmware itself provides (PortMaster get_controls → SDL_GAMECONTROLLERCONFIG): face buttons, shoulders, triggers (button- or axis-based), analog axes, HAT d-pad, and the real SELECT/START pair for the save-safe exit combo. The proven Twin PS2/USB and GO-Super profiles remain as fallback, and KOTOR_INPUT_DYNAMIC=0 restores the old behavior. debug.log now records the exact mapping used (cfw pad mapping: / kotor_input: lines), so reports can show precisely how the pad was translated.
Quick Save hard-lock (reported on R36S/DarkOsRE)
Reproduced live and fixed: the engine ends save-directory enumeration on the Win32 pair FindNextFileA()==0 + GetLastError()==ERROR_NO_MORE_FILES, but the loader never set the compat layer's last-error — so overwriting an existing quick save spun the main thread forever (the first quick save always worked, which is why it only hit the second save onwards). The loader now reports enumeration state through the layer's own SetLastError. Verified on device: quick save overwrites complete and the game keeps running.
Install
Same as before: drop the ports/ folder onto your device, launch Star Wars KOTOR, and the installer will build the game data from your own APK+OBB copy (BYO data — nothing copyrighted ships here). See INSTALLATION.md.
sha256: see attached .sha256.
Star Wars: KOTOR universal 1.0.2 — muOS/ROCKNIX controls + exec-bit fix
Star Wars: KOTOR universal 1.0.2 — controls on muOS/ROCKNIX pads + exec-bit self-heal
Second tester round. On 1.0.1 the RG40XX-H (muOS) already ran with clear audio and video —
this release fixes what was left.
Fixed
- Only d-pad and sticks worked / game would not exit (muOS): the pad normalizer now
recognises theretrogame_joypadcontroller used by muOS H700 devices (RG40XX/RG35XX
family) and the ROCKNIX RG DS — same kernel driver and button order as the R36S
GO-Super pad, only the USB product id differs. Face buttons, shoulders, triggers and
SELECT/START now reach the engine in the Android order it expects, and the
SELECT+START save-safe exit works — no more hard reset. Permission deniedon launch (ROCKNIX): ZIPs extracted on Windows or FAT media
lose the executable bits, and ext4 ROM partitions then refuse to run the loader.
run.shnow restores the executable bits of everything it ships before launching,
so any extraction method works.
Updating
Drop this zip over the previous install. Game data already installed is reused as-is.
Star Wars: KOTOR universal 1.0.1 — muOS/ROCKNIX launcher fix
Star Wars: KOTOR universal 1.0.1 — muOS / ROCKNIX launcher fix
Fixes the two first-round tester failures (RG40XX-H muOS, RG DS ROCKNIX). The game data
install was already completing on both devices — the launcher environment was the problem.
What was broken
- muOS (
libGLESv2.so.2: wrong ELF class: ELFCLASS64): the launcher did not carry the
literalPORT_32BIT="Y"marker muOS inspects to expose its 32-bit runtime, and the
library path fell through to the 64-bit/usr/lib, so the ARMHF game binary could not
find a 32-bit GLES driver. - ROCKNIX (
SDL_Init Error: Could not connect to PulseAudio): the pipewire-pulse
socket lives under$XDG_RUNTIME_DIR, and the 32-bit process had no path to the
32-bit ALSA/PipeWire/SPA modules, so every SDL audio backend failed and the game aborted. - Both: the input-normalizer
LD_PRELOADleaked into 64-bit helper processes,
spammingwrong ELF class: ELFCLASS32warnings.
What changed
Launcher scripts only — the game binaries are byte-identical to 1.0.0, and the recipes
follow our published, device-validated TASM2 ARMHF launcher:
PORT_32BIT="Y"exported by the visible launcher and byrun.shbefore the
PortMaster hooks load./usr/lib32,/usr/local/lib32and the PortMasterlibs/libs.armhffolders are
probed ahead of/usr/lib.- 32-bit ALSA/PipeWire/SPA module directories exported when present; PulseAudio socket
probe extended to$XDG_RUNTIME_DIR/pulse/native. LD_PRELOADscoped to the game process only.
Updating
Drop this zip over the previous install. Game data already installed by 1.0.0 is
reused as-is (the installer fast-validates and skips extraction).
Star Wars: KOTOR universal 1.0.0
Native ARMv7 so-loader for the Aspyr Android release of Star Wars: Knights of the Old Republic (1.0.10, build 53), running the original Odyssey/SDL2/GLES2 flow on Linux handhelds. BYO data: you provide your own APK + OBB cache — this package ships no game data.
Validated on real hardware: NextOS Amlogic (Mali-450, fbdev, 1280x720) and R36S/ArkOS (Mali-G31, KMSDRM, 640x480). Full cycle on both: BYO install from this very zip -> gameplay -> audio -> native controller -> Select+Start clean exit.
Install: unzip into your ports folder, drop your APK + OBB cache into ports/kotor/gamedata/ (any file names — content is what gets validated), open the port. Full steps in INSTALLATION.md.
Highlights of 1.0.0 (see CHANGELOG.md):
- public runtime with a GLIBC 2.27 ceiling, linked against the firmware's 32-bit SDL2/EGL/GLESv2
- real-display resolution probe (DRM connector -> fbdev), no hard-coded geometry
- per-pad input profiles (Twin PS2/USB and R36S GO-Super), Select+Start save-safe exit
- NXExtract 1.2.3 installer: content-addressed recipe, transactional install, resume, honest wrong-build diagnostics (a KOTOR II APK is rejected by name), fast marker on later launches
- FMOD audio through the native OpenSL bridge; dead inherited Pulse falls back to ALSA, logged
Community & support: https://discord.gg/DHfY62eDNN