[Release] Forsaken 3DS — the 1998 6-DOF shooter, native citro3d renderer with hardware 3D
Been working on a Nintendo 3DS port of Forsaken — the 1998 Probe/Acclaim 6-DOF space shooter that was Descent's prettier, fiercer cousin. The port builds on ForsakenX (the community source port) and targets the 3DS directly with a native citro3d renderer.
Current state: fully playable. Entire 15-level single-player campaign, runs at 60 fps in hardware stereoscopic 3D at 512×512 HD textures on both Old and New 3DS.
Repo (source + build instructions): https://github.com/colbyshores/forsaken-3ds
What's in it
- Hardware stereoscopic 3D (actual GFX_LEFT/GFX_RIGHT, not anaglyph). Uses single-pass display-list replay so the second eye doesn't redo BSP traversal or vertex transform — that's what leaves headroom for HD textures + stereo simultaneously.
- HD textures (optional) — ETC1 / ETC1A4, sourced from the Forsaken Remastered 4K upscale pack and downsampled to 512² to fit PICA200's budget. Skip the regen step and it falls back to the original PNGs cleanly.
- CD soundtrack — DSP-ADPCM streamed from romfs on a background thread, decoded by the 3DS DSP hardware at zero CPU cost. All 9 original 1998 Swarm tracks mapped to their authentic level assignments (extracted directly from the Windows
.exe). - Full 6-DOF controls — circle pad for pitch/yaw, X/Y for forward/back thrust, L/R strafe, D-pad to cycle cannons, ZR for mines, A/B fire primary/secondary.
- Bottom screen HUD — gameplay text (score, ammo, weapons) routed to the mono bottom screen so the stereo top stays clean.
- Runs well on Old 3DS — not just New. The original game targeted a Pentium 166 with D3D3; the budget is small.
Installing
Two options:
.3dsxvia Homebrew Launcher — drag into your3ds/folder. Bundles DSP firmware in its romfs so audio just works, including in emulators..ciavia FBI — permanent install on the HOME menu, banner audio plays on icon tap. CIA does not bundle Nintendo's DSP firmware; you needsdmc:/3ds/dspfirm.cdc(you already have this from the standard DSP1 dump during CFW setup).
Getting assets
Game data is not shipped (levels, models, sounds). Provide your own legitimate disc image — ISO or BIN/CUE — and the included extract_assets.py does the rest (needs p7zip-full, bchunk, ffmpeg). BIN/CUE gets you the CD soundtrack; ISO gets game data only.
Technical highlights (for the devs)
- Native citro3d renderer, not picaGL — bypasses the GL1 emulation tax. picaGL still ships as a fallback (
make RENDERER=picagl) but stereo is citro3d-only. - ARM11 strict-alignment sweep — ~50 sites patched. Modern GCC fuses constant-size
memcpy(..., 12)intoldmwhich needs 4-byte alignment, and Forsaken's file parsers cast misaligned floats all over the place. Documented the patterns in the repo for anyone else porting 1990s Windows games to 3DS. - HOME menu banner audio rebuilt from the 1998 TV commercial via yt-dlp + demucs vocal isolation + ffmpeg in a deterministic build script. "The future is Forsaken" plays when you tap the icon.
- picaGL patches (separate nested repo) —
glClearrespectingglColorMask, realGL_VIEWPORTquery, GLU stubs, extension defines.
Known limitations
- Missile chase camera has reduced draw distance in some scenes (BSP portal visibility quirk).
- No multiplayer — Forsaken's netcode didn't map cleanly to the 3DS network stack. Single-player only.
License & credits
GPL v2 — same as upstream ForsakenX. Full source public.
- Original game: Probe Entertainment / Acclaim (1998)
- Source port: ForsakenX
- picaGL: masterfeizz
- HD texture source: Forsaken Remastered 4K pack
- 3DS port: me (Colby Shores)
Happy to answer questions about build issues, the renderer architecture, alignment fixes, whatever. If you hit something that's broken on your 3DS, open an issue on the repo or reply here.