Why We Built Uncatalogued with Rust and Raycast 3D for the Game Boy Advance
In our previous post, we introduced Uncatalogued — a first-person roguelite of reading, deduction, and burning lamp oil inside a shifting underground library — and mentioned that the game is genuinely built within the hardware limits of the 2001 Game Boy Advance (GBA). When you download the PC version on Steam, the installation folder also includes the .gba ROM file ready to run on real GBA hardware (via a flashcart) or your favorite emulator.
In this short post, we’d like to share the story behind two of our biggest technical choices: Why did we build it in Rust? And why did we choose Raycasting instead of true polygonal 3D?

1. Why Rust? From Porting a Classic DOS Game to GBA Development
Traditionally, Game Boy Advance games are written in C or assembly. For our team, however, choosing Rust came very naturally.
Several years ago, our team used Rust to port a classic DOS game. That project made us fall in love with the language: it gave us the low-level performance and control we needed, while providing a modern type system, great tooling, and safety guarantees that made day-to-day development a joy.
When we later discovered that the Rust ecosystem had matured enough to target the Game Boy Advance directly, everything clicked. It meant we could build a GBA game in our favorite language while sharing the same core codebase between the GBA release and the Steam PC version.
2. Why Raycasting Instead of True Polygonal 3D?
The GBA is a handheld from 2001 powered by a 16.78 MHz processor, with no 3D GPU and no floating-point unit (FPU).
Early in development, we evaluated whether to build a full polygonal “true 3D” engine or a grid-based Raycast 3D engine (in the style of Wolfenstein 3D and classic 90s dungeon crawlers). Choosing Raycasting came down to three practical reasons:
- Hitting a Stable 30 FPS on GBA: Rendering perspective-correct textured 3D polygons entirely in software on a 16.78 MHz CPU eats up almost all available processing power. Once multiple Keepers and fire effects appear on screen at the same time, maintaining a smooth 30 FPS in true polygonal 3D would be extremely difficult.
- Spending Time on Gameplay Rather Than Endless Optimization: Squeezing a polygonal 3D engine onto the GBA would have required months of grueling low-level optimization. Raycasting allowed us to lock in a smooth 30 FPS early on and spend our development time where it mattered most: designing cross-floor puzzles, books, and the library’s hidden rules.
- A Natural Fit for a Retro Dungeon Crawler: Tall vertical bookshelves, sliding secret doors, and a narrow circle of oil-lamp light fading into pitch darkness — the classic Raycast look fits the claustrophobic atmosphere of an old underground library like a glove.

3. A Few Hardware Tricks to Keep the GBA at 30 FPS
To keep the Raycast renderer running smoothly at 30 FPS on the GBA, we tailored the engine around a couple of the handheld’s hardware traits:
- 120 Rays Aligned with 16-Bit VRAM Writes: The GBA’s 256-color bitmap mode (Mode 4) has a quirk where video memory (VRAM) can only be written in 16-bit halfwords — two horizontal pixels at a time. Rather than fighting the hardware with extra intermediate buffers, we cast 120 rays across the 240-pixel-wide screen and draw each vertical wall strip as a 2-pixel pair in a single 16-bit write, cutting ray traversal work in half.
- Fixed-Point Math and a Fast Light Lookup Table: With no floating-point hardware on the GBA, all movement, angles, and ray intersections use integer fixed-point math and precalculated lookup tables. For the oil lamp’s light falloff, we store a 4 KB shading table (16 brightness levels × 256 palette colors) in the GBA’s fastest on-chip memory, turning per-pixel lighting into a single table lookup.

As for the other challenges we ran into along the way — such as fitting proportional Traditional Chinese, Japanese, and English pixel fonts into the GBA’s tight memory, or synthesizing our 4-channel retro soundtrack — we’ll save those stories for a future post!
Wishlist Uncatalogued on Steam!
Our Steam store page for Uncatalogued is now live (supporting Windows, macOS, Linux, and Steam Deck, with the .gba ROM included).
As an indie team, early Steam Wishlists make a huge difference in helping more players discover the game. If you enjoy retro dungeon crawlers, GBA homebrew, or deduction games where knowledge is your only progression, please consider adding Uncatalogued to your Wishlist:
👉 Wishlist Uncatalogued on Steam
The SimplexCode Team