Resistance Racing 2k97 is a post-apocalyptic underground racing game by Ancient Pixel, coming to Steam. A rich elite has driven humanity underground after the climate collapse. Huge underground structures house what's left of civilisation. A generation has never seen sunlight. To escape, you race. Formula Zero is the league that promises freedom, but the game is rigged, and there's more going on beneath the surface.

The game blends first-person exploration and storytelling with fast antigravity racing through tunnel networks. Between races, you talk to other inhabitants, fulfil quests, and uncover the hidden truth behind the league. During races, you manage heat, slipstream opponents, hug tunnel walls, and dodge obstacles to reach top speed. Winning isn't everything.

Ancient Pixel has been sharing development updates in the Phaser Discord. The custom 3D framework will be released on GitHub after the game ships.

How Phaser Powers a Pseudo-3D Racing Game

The technical foundation is a custom pseudo-3D framework built on top of Phaser 3. Each 3D model is made up of vertex points, where four points make up a face, and each face becomes a Phaser quad. Ancient Pixel calculates the 3D vertices to 2D screen coordinates and adjusts the quad points accordingly. The result is an affine-textured look that closely matches how early 3D games like the original Tomb Raider rendered their worlds.

This approach means everything sits in the same Phaser scene. A 2D sidescroller with physics could share a level with a 3D boss. Any game object that works in Phaser 2D works alongside the 3D geometry. Ancient Pixel also built an in-game editor mode that lets geometry and textures be changed and tested immediately, without round-tripping through external tools.

"Discovering Phaser and later the [...] basic quad game objects sent me on a wild journey throughout my career!"

Ancient Pixel, Phaser Discord

"With Phaser and all the cool stuff for 2D still available in the engine, it is easy to create a door in 3D that only opens if you complete a 2D physics-based moonlander game or any other hacking minigame."

Ancient Pixel, Phaser Discord

Resistance Racing 2k97: Development Progress

The idea started in GameMaker around 2016, became a browser prototype in 2020, and has been in active development as a Phaser game since then. Ancient Pixel replaced all Euler rotation code with proper 3D vector math over Christmas 2025, resolving a long-running set of issues with the camera and 6DOF track movement. The game has since been shown at indie expos, where players engaged with both the racing and the narrative. Nobody bounced off, though a few opted out of racing, and kids mostly just wanted to go fast.

The Interview

Nine Years, Several Prototypes, One Idea That Wouldn't Let Go

Q: Resistance Racing 2k97 started as a GameMaker project in 2016. Nearly a decade later, it's coming to Steam. What has kept you going all this time?

As a kid, I wanted to know how games work and asked my father, who studied mechanical engineering, about how to create games. I was too young to really understand how graphics get drawn on a screen, and just started to draw a racing game of rabbits running through the woods full screen, but quickly gave up when I realised how many frames I would have had to draw by hand. I did not know that there existed individual sprites that could move independently of each other and make up a screen yet.
Later in high school, when I picked up programming and started learning how to make games, it was one of my goals to eventually build this bunny racing game, but I also did so many prototypes in other genres; I just wanted to know how things work.
One of my fascinations was always early 3D stuff. So when I learned GameMaker, which is a 2D engine, I tried to do 3D with it, played around with super scaler techniques, and eventually also did my bunny racing game in pseudo 3D and 128x64 pixels. That marked the start of my proper pseudo-3D journey.
Two years later, in 2016, I did the first prototype for a Wipeout-style anti-gravity racing game on different planets, very crude 3D, power-ups, and an emphasis on different characters and their crafts. But no actual story or lore to be explored; this was all in my head.

So, like an open tab, this idea, the teams, the lore that slowly developed, kept being an idea not fully explored. In 2019, I took another swing at it, this time with stacked sprites forming a deep tunnel to look into and race through, but once again, it was not a very good platform to tell a story, because it was very limiting in how you could interact with the game world outside the races.

In parallel, I started my Phaser 3D framework, which enabled me to have doom-like geometry, and I knew I wanted to be able to get off a track, out of the craft, and then walk around in the world and talk to the other pilots. So, to the bin with this prototype, and later in 2025, I had my framework ready to do the walking and racing with the same graphical fidelity and style. So even though I thought a lot of other games, even for my day job, I knew I had to do this again. So, tldr, a lot of stubbornness and an idea I was never really happy with how I tackled it before.

Q: The world you've built is rich: climate collapse, underground civilisations, a rigged racing league. How important is the narrative to the overall experience, and how do you balance it with the racing?

Probably more important than the racing. Yes, if you win all the races and the championship, you get a different ending than if you don't, but for being so set on creating this racing game, I still decided that winning is not really important. Also, players who are not good at it won't be at a disadvantage. Talking to the NPCs, solving their quests, solving the puzzles, and learning about what is going on in that world is what it is about. You just happen to also be a racing driver in the world, so you should be able to do your job, and if you bully an NPC on track, they won't be very open to you in the conversations off the track. The racing parts are heavily interwoven with the story, though, like at one point, there is a blockage in the tunnels, the race stops, and you need to get out of your craft, discussing with the other pilots what to do and so on.
That said, if you just want to race because you like futuristic racing games, there is a "custom race" button in the menu, and you unlock new crafts and tracks through the story progression.

Quad Objects, Quaternions, and Building a 3D Framework on Phaser

Q: You built a custom pseudo-3D framework on top of Phaser 3. Can you explain how it works and what role the quad objects play?

Checking out early versions of Phaser 3 way back when, I stumbled over this new Quad Game Object. I was intrigued because it was clear immediately that this would enable me to do way more than just scaling and rotating sprites to build 3D spaces from 2D Objects. At that time, I played around with wireframe line drawings in "3D", or rather calculating 2D screen coordinates from 3D points, and of course I mapped the quads' corners onto those points and quickly had a level in the style of Doom or the first Tomb Raider games done.

I felt like I was on the correct path to what I always wanted to do. I learned Unity, Unreal, and Godot, but it was always hard to make something low-level without a lot of effort and either using more to achieve less, like pixelating shaders, or cutting away features without even knowing where to place the knife in those engines. With my own solution, I could truly build the fidelity up from the bottom, only adding what I need. Also, having hard constraints helps me immensely; that's also why I love and participate in game jams.
Now my models are more like quad clouds, and therefore I have good control over the geometry. For example, I can go into every air vent textured quad and make them wiggle without having a skeletal animation or shaders on the model.
The downside, though, is that every coordinate/vertex of the model is actually saved multiple times. If 4 quads meet, they don't share one vertex; they just overlap their points at this coordinate in space.

"With my own solution, I could truly build the fidelity up from the bottom, only adding what I need. Also, having hard constraints helps me immensely."

Q: What was the hardest technical problem to solve when building that system?

Just the hardest is hard to answer, because the latest is almost always the hardest. At first, I could draw stuff on the screen, but how would I actually get collisions in? So it meant having 3D geometry but 2D collisions like in Doom, no stacked rooms, etc. But at this point in time, I would say, refactoring everything to use quaternions and proper vector math was the hardest technical problem to solve. It was scary to rip deep into things that might break in various ways when touching them again, but I needed it to get 6 degrees of freedom for the antigravity racing part without constantly having issues with Euler angles and gimbal lock or deforming models over time with each rotation. I would say I still don't understand it, but I can use it.

Why Phaser Beat Three.js and Babylon.js

Q: Most devs building 3D games in the browser reach for Three.js or Babylon.js. Why didn't you?

To go with the trends and to keep and get jobs, I learned a lot of different engines. Especially for Resistance Racing, I did the same prototype in Unreal, Unity, and Godot. But it was always hard to cut out the high-fidelity stuff. Everything looked too good.
Similarly, in browser-based 3D engines like Babylon or three.js, it's nice to have an open road with many possibilities ahead of you, but I foolishly thought it would just be easier to build it myself with only the stuff I need. Adding whatever I need on the way. But I am glad I dared to just try, even though I thought it would be easy. It was not, but I could just keep using the engine I know best and work the most with, even for my day job: Phaser. I can't put my finger on the why exactly, but setting up a scene in Phaser does not require a lot of things; every codeline to add makes sense. So it's very frictionless to jump from one project or task to another, because it uses the same principles.

"I could just keep using the engine I know best and work the most with, even for my day job: Phaser. Setting up a scene in Phaser does not require a lot of things; every codeline to add makes sense."

Q: You built an in-game editor that lets you change geometry and textures in real time. How did that come together?

Because I am using JSON files as my model files, it was never a case of building the models in Blender and importing them. So it's one of those games where you actually play in the engine. At any point in time, I can pop into the editor with a hotkey, change the geometry or scroll through different textures, save what I like to file, and it will be right there without changing tools, reimporting an asset, etc.
Most of the stuff in the level is just done in code, though, so a moving train and where to spawn a model are done in the level JS file, but the editing is done on-site within the context of the level and game.

PS1 Aesthetics and What Indie Expos Taught Him

Q: The PS1 aesthetic is a deliberate choice. How do you achieve and control that look technically?

Since it's all quads and the resolution of my textures is quite low, everything is very rectangular. Triangles look a bit weird. I know that's a bit ironic because every square in the game also looks very weird and wobbly. I use 32x32 textures and a strict and limited color palette. The game's resolution is 512xScreen height. Also, I don't use proper lighting. Only some distance-based tinting. That gives the game a very era-authentic, grainy but also flat look. It looks very 2D even though it's clearly 3D. For me, it's great because I have a lot of control over the sightlines, the geometry. Each quad contributes heavily to a model's perception. It's not a texture wrapped around an object. It kind of creates zones per texture on each model, which makes it very crisp.
Also, since I have no depth buffer, I can't occlude or cut any quads in your field of view, so a lot of warping stems from a compromise of filling the screen without the 2D to 3D formulas going haywire at your camera's near clipping plane.

Q: You've shown the game at four indie expos. What did you learn from watching real players interact with it?

The split between racing and narrative surprisingly works. Of course, younger kids, especially when not speaking English, did not care at all for reading and just wanted to race, but I am very happy that people saw the action, sat down, and got drawn in by the narrative. The initial learning curve for the racing parts is too steep, though. The game has its own rules on how to be fast in the tunnels, so just like airbrakes in Wipeout, it's hard to master the controls of the craft. I always like to hang back a bit and just let the players do their thing without me disturbing them, except if they search for me and ask for stuff directly. That shows me the most true reactions of where and when they enjoy or dislike something. The art style, by far, was the most outstanding bit of the game, it seems. And as this is not your typical arcade street racing type of game, onboarding the players needs to be very gentle, but without a tutorial that takes too long. Because they want to win, even if it's their first race. Some people didn't realise that they could also just take the loss, and the game continues anyway.

Tools, Advice, and What's Next

Q: What tools and libraries have been essential alongside Phaser during development?

Texture Packer is a blessing. I can cut a larger tileset or image into smaller chunks and, most importantly, take all my 32x32 textures and have only a small number of texture pages for the whole game. This cuts load times immensely.
Angelcode's BMFont is a very handy tool for creating bitmap fonts, which again just gives you a texture atlas that you can further manipulate on your own.
And as a third tool, I use howler.js as my main audio driver. Again, going with the atlas idea, I can load and look up sounds in one audio sprite file, layer, and set up the sounds in 3D for spatial audio.

Q: You're pushing Phaser into territory most devs wouldn't attempt. What would you tell a developer thinking about doing something technically ambitious?

Thank you. I did not know it would mean a lot to me that the behind-the-scenes work I do and did would get seen. It started out very innocent with playing around and being very curious about limitations. That would also be my advice; if everything you've got is a hammer, everything looks like a nail. This is not good per se, but sometimes it's very creative and eye-opening to see in how many different ways you can use a hammer if you have no nails. Overestimate your abilities and be humble in the learnings and failings you will have along the way, but never let that discourage you.

"Overestimate your abilities and be humble in the learnings and failings you will have along the way, but never let that discourage you."

Wishlist Resistance Racing 2k97 on Steam

Resistance Racing 2k97 is in active development with its Steam page live now. If a postapocalyptic racing game built on a framework this unusual sounds like your kind of thing, add it to your wishlist, and you'll get notified the moment it ships 🚀

Wishlist on Steam