Native C/C++ game code packaged through the Android toolchain rather than desktop emulation.
System Shock - Android
A native Android/ARM64 adaptation of Shockolate, developed around the Retroid Pocket 5 as the primary reference device. I am using the port both to make the game work naturally on a modern handheld and to document reusable engineering knowledge about Android lifecycle, input, audio, presentation, legacy assets and reproducible porting.
01 / OVERVIEW
What this port is
Source-port foundation
I use Shockolate as the code foundation. The Android work starts from upstream commit 4cc3d07d…, a merge of pull request #421 by oreo639.
Hardware-led development
I treat the Retroid Pocket 5 as a real target rather than a generic Android endpoint. Display behavior, controller routing, Android lifecycle, audio timing, text input and 4:3 presentation are validated against the handheld itself.
Commercial data stays external
I do not put proprietary System Shock game data in the public source tree, APKs or redistributable source packages. The signed pre-release asks the user to select their own compatible res folder on first run and copies it into private app storage.
03 / CURRENT STATE
Implemented and validated
1024x768 no-stretch presentation remains the current and only public presentation mode.
Right-stick camera look is the default. View/Select switches the stick into fine cursor mode for the original interface.
A single mixer-owned physical device handles the audio endpoint, while the gameplay music scheduler rebases after abnormal host stalls instead of bursting overdue events.
Committed text uses the SDL/Android text-input path for the player-name workflow instead of synthetic printable controller keys.
v0.1.0-pre.3 is non-debuggable, ARM64-only, signed with the stable release certificate and validated on the Retroid Pocket 5 with first-run user-data import.
04 / CONTROLS
Desktop interaction translated to a handheld
System Shock combines free-look movement with a mouse-driven interface. The port keeps both interaction models available instead of forcing one control scheme to do everything.
| Input | Default behavior |
|---|---|
| Left stick | Player movement / menu navigation. |
| Right stick | Camera rotation / look by default. |
| View / Select | Toggles the right stick between camera-look and fine cursor/mouse mode. |
| L2 | Left-mouse style selection, interaction and drag behavior for the original UI. |
| R2 | Right-mouse / attack path according to the active game state. |
| Touchscreen | Optional pointer-style interaction; it can be used as a mouse but is not mandatory. |
| Android keyboard | Text entry for player names and other keyboard-oriented fields. |
The controller boundary uses SDL GameController semantics rather than hard-coded Android/Linux event codes. Detailed reasoning is documented in KB-SS-005.
05 / PRESENTATION
Preserve the original presentation
4:3 reference
The original logical 1024×768 presentation remains the known-good reference. Android owns the physical surface while the game owns its logical render geometry.
Current presentation decision
The port retains the original-style 1024x768 4:3 no-stretch presentation as its only public presentation mode. The Android IME keyboard shown during text entry is the only platform-specific visual addition.
Graphics extraction
The validated private extraction pipeline identified and extracted 8,870 supported image frames using the engine's proven legacy decoders. Those commercial-derived outputs remain private; only methodology and metadata are shared.
Indexed-renderer boundary
Sprite/UI Scale4x can preserve indexed source colors exactly. Bicubic WORLD/STATIC output creates RGB colors the current 8-bit renderer cannot represent without quantization, so that path remains blocked pending an explicit architecture/quality decision.
Font reconstruction
The validated offline dataset contains 36 fonts and 5,696 glyphs. Composite resource identity is required, and contour/vector candidates remain offline research until they pass layout and readability gates.
Rejected experiments
Several HD/font stages failed their manual or architectural gates. They are preserved as negative knowledge in the knowledge base rather than silently discarded.
06 / TECHNICAL STACK
Build and runtime foundation
| Game/source-port base | Shockolate 0.7.8 lineage, upstream baseline 4cc3d07…. |
|---|---|
| Primary languages | C/C++ game code with Java/JNI Android integration. |
| SDL | SDL 2.32.10, release commit 5d249570…. |
| Audio | SDL_mixer 2.8.1 at validated commit 171eb2d4…, plus Shockolate's ADLMIDI/OPL3 path. |
| Android build | compileSdk 34, target/min SDK 33, Build Tools 34.0.0, NDK 29.0.14206865, CMake 3.22.1, Gradle 8.1.1 and JDK 17. |
| Architecture | arm64-v8a. |
| Reference hardware | Retroid Pocket 5 - Android 13, Adreno 650, 8 GB RAM, 5.5-inch 1080p/60 Hz AMOLED according to Retroid's product specification. |
07 / OPEN KNOWLEDGE
The port as a public technical article
The knowledge base publishes more than the final solution. It records root causes, workarounds, unresolved concerns, rejected experiments and rules that became standards during the port.
Resolved problems
PowerShell case collisions, Android lifecycle/surface diagnostics, audio-device ownership, Android IME integration, right-stick mode routing, gameplay music timing, dependency-bootstrap failures, release signing and first-run data import are preserved as reusable records.
Open concerns
Broader Android compatibility, WORLD/STATIC HD architecture and font remastering remain explicitly open. The public release/importer and fresh-clone release gates have been completed for the Retroid Pocket 5 reference path.
Standards
Platform ownership, reversibility, semantic controller mapping, single audio ownership, artifact-level validation, evidence separation and commercial-data isolation are documented as project standards.
08 / RELEASE & LICENSING
Open code, separate game data
Release status
v0.1.0-pre.3 is published as a GitHub pre-release with the tagged source, a signed non-debuggable ARM64 APK, SHA-256 sidecar, release manifest and public signing certificate. The first-run folder importer was validated on the Retroid Pocket 5 before publication.
Source licensing
Shockolate is distributed under the GNU GPL v3.0 or later. Public distribution of this derivative source keeps the applicable upstream copyright/license notices and documents third-party dependencies.
Game ownership
The project does not provide System Shock commercial resources. A compatible legally obtained copy is required separately. On first run, the release APK lets the user choose the required res folder without ADB.
This is an independent, unofficial development project. System Shock, its assets and associated trademarks belong to their respective rights holders. Miguel's Game Dev Lab is not affiliated with or endorsed by Looking Glass Studios, Nightdive Studios, Atari, GOG, Retroid, Google or the SDL project.
09 / FEEDBACK & CONTACT
Found a problem, have an idea or tested another device?
Public technical feedback goes through structured GitHub forms so reports remain searchable and can become reusable project knowledge. Professional contact is available through LinkedIn.
Report a bug
Use the bug form for reproducible build, installation or runtime problems. Include exact errors and observed evidence.
Suggest an improvement
Ideas about controls, presentation, audio, build tooling, Android integration or documentation are welcome.
Report compatibility
Tested another Android handheld or phone? Successful reports are useful too. Record device, Android version and each runtime area separately.
Documentation
Report unclear or incorrect documentation and include the source or evidence supporting the correction.
General feedback
For questions or comments that do not fit another category, use the general public feedback form.
Contribute or contact
Code contributions can be proposed through pull requests. For professional networking or private professional enquiries, use LinkedIn.
Do not attach proprietary System Shock game data, credentials or private information to public GitHub issues.
10 / REFERENCES
Sources and acknowledgements
References are formatted in APA style as closely as practical for software repositories, pull requests, source-code commits, products and continuously updated technical documentation. Author and source links are included where an authoritative public page is available.
- Interrupt. (n.d.). Shockolate: A minimalist and cross-platform System Shock source port [Computer software]. GitHub.
- oreo639. (2025, October 1). Fix building with gcc14 [Pull request #421]. Interrupt/systemshock. GitHub.
- Cuddigan, C. [Interrupt]. (2025, October 1). Merge pull request #421 from oreo639/fix-gcc14 [Git commit, 4cc3d07dfff2d11b6d3a0a9960a51cf4ca253690]. Interrupt/systemshock. GitHub.
- Looking Glass Studios. (1994). System Shock [Video game]. Origin Systems. Digital product information: GOG.com.
- Nightdive Studios. (n.d.). System Shock: Enhanced Edition.
- SDL contributors. (n.d.). SDL2 README: Android. SDL Wiki.
- Lantinga, S. (2025, September 1). Updated to version 2.32.10 for release [Git commit]. libsdl-org/SDL. GitHub.
- Lantinga, S., & SDL contributors. (2025). SDL_mixer 2.8.1 [Computer software]. GitHub.
- Novichkov, V., Yliluoma, J., & contributors. (n.d.). libADLMIDI: A software MIDI synthesizer library with OPL3 emulation [Computer software]. GitHub.
- Android Developers. (n.d.). Get started with the NDK. Google.
- Retroid. (n.d.). Retroid Pocket 5 [Product specifications].
- Free Software Foundation. (2007, June 29). GNU General Public License, version 3. GNU Project.