Frank Krueger (@praeclarum) posted a fun fact on X:
“Fun fact: Descent didn’t use 3D file formats per se. Instead, 3D models were compiled as x86 assembler doing draw commands.”
That sent me down a rabbit hole. Not out of skepticism, but out of genuine curiosity and a wave of nostalgia.
Descent Was Something Else
I remember the first time I saw Descent. It was the mid-90s. I don’t recall which version it was, but I’d already seen Wolfenstein by that point. What struck me about Descent was the degrees of freedom. In Wolfenstein or Quake, you’re a person, with gravity holding you down, a fixed vertical orientation, and a predictable perspective. Descent threw all of that out. You’re piloting a ship in zero gravity, inside off-world mining facilities and military facilities where there is no up and down. You could roll, pitch, and yaw in any direction. The full six degrees of freedom.
That required a fundamentally different way of thinking about the 3D environment. And I’d imagine it changed the performance optimization challenge too. Games like Wolfenstein could exploit the fixed vertical perspective with clever rendering tricks. Descent couldn’t afford those assumptions. Every surface, every angle was fair game.
I enjoyed it. But my son Alek really got into it. I think his intuitive understanding of 3D environments may have been germinated by gaming in that particular world at a young age. There’s something about navigating a space where the usual spatial anchors don’t apply that rewires how you think about three dimensions.
Deeper Nostalgia
Seeing that tweet didn’t just remind me of Descent. It pulled at a much older thread. In high school, my friends and I developed games on a Z80 machine with an 80 by 25 character-based terminal. That was my first real exposure to computing and software development. We were writing programs, building simple games, and it felt like the frontier. When we finished Year 12, we lost access to that machine.
First year of uni, I went to UWA to study engineering. I was optimistic about what computing resources we’d have. The reality was brutal. We weren’t Comp Sci students, so we were down the pecking order. What the engineering first years got access to was punch cards. I’d gone from writing BASIC programs on what was effectively a personal computer in high school to being shunted back several decades technologically in university first year. It was severely disappointing.
So my best mate and I somehow contacted a local business in West Perth. I can’t remember the name. It was some sort of young startup, though they seemed old to us at the time. They let us experiment with a CP/M-80 based computer. It had something like 320 by 200 resolution actual graphics rather than a character display. We had this goal of producing a first-person 3D maze game. This was before Wolfenstein existed. The idea was a maze where you had a first-person perspective. We were programming in BASIC, and we got some progress simulating 3D in a very rudimentary sense. But it became clear that BASIC wasn’t going to cut it for what we wanted to do.
The business owners talked about C as a programming language, so I bought a copy of Kernighan and Ritchie’s The C Programming Language. I was studying it, excited about what it might unlock.
Unfortunately, I was driving my dad’s ute, living on a strawberry farm, and commuting down to West Perth from Burns Beach Road in Wanneroo. It was a long drive, done during the holidays. I got into a car accident, scraped the car, got yelled at by my dad, and gave up on making the trip. Uni started, and I just focused on my engineering degree. It was a few years before I got back into programming in any serious way.
That was my first foray into 3D. So when Descent came along years later, the technical achievement meant something to me. I knew just enough about what was involved to appreciate how impressive it was.
Coding Agents and the Source Code
Which brings me back to the tweet. How did they use assembler to do draw commands? With coding agents like Claude Code and AI-powered development environments like Cursor, you can ramp up on an existing source code repository remarkably quickly. The agent can do the research for you.
I started with the Descent 3 source code, which is now open source under GPLv3. I had Claude analyze the codebase and comment on the fun fact about 3D models being compiled as x86 assembler. It produced an architecture document and came back with a nuanced take: it’s not quite that simple, at least not in Descent 3. The rendering architecture had evolved significantly by the third installment. I thought Claude’s initial analysis was a bit harsh in how it framed the relationship to the original tweet, so I asked it to tone down the rhetoric. The tweet was a fun fact, not a PhD thesis, and I didn’t want the post to read like I was nitpicking someone else’s observation.
Descent 3 Engine Architecture: Runtime Subsystems
Then I realized: the tweet was probably referring to the original Descent, not Descent 3. The Descent 1 source code is also publicly available. So I cloned that and ran a similar analysis. The architecture of the original 1995 engine is a different beast entirely. Much closer to the metal, much more of its era, and the relationship between model data and rendering code is more tightly coupled in ways that make the x86 assembler observation more directly relevant.
Descent 1 3D Model Architecture: A Source Code Analysis
The Point of the Exercise
This was a rabbit hole. A couple of hours, driven by curiosity and nostalgia. But what struck me is how deep you can go in that time. The coding agent did most of the heavy lifting: reading source files, tracing rendering pipelines, producing architecture documentation, and synthesizing it into something coherent.
I haven’t verified every conclusion in the analysis. If this were something of real professional import rather than satisfying a curiosity itch, I’d owe it to myself to check the references and validate the conclusions. But the agent paved so much of the way that the remaining verification work would be a fraction of what it would have taken to do the whole thing manually.
It’s the same pattern I’ve written about before. Coding agents don’t replace judgment, but they shorten the distance between a question and a useful answer. A nostalgia-driven dive into a 30-year-old game engine is a low-stakes example, but the mechanics are the same ones that matter in professional work.