Quake Brutalist Jam 3 Retrospective


From qbj3_chaosed0: A screenshot from the air of a large courtyard with a few red-leaved trees.

This past month, I participated in Quake Brutalist Jam 3, a map-making event for the Quake community. It was my first time completing a first-person level for any game.

The timing of the jam was auspicious, as it aligned with some educational goals I had recently set for myself. I learned so much from the jam, not only about how to construct engaging first-person shooter levels, but also about my own process and the kinds of motivations that lead me to finish a project.

My Goals

As a kid, when I thought “game developer,” I thought “programmer”. Over the last twenty years, I dedicated myself to becoming the best game engineer I could. I’ve built a successful career out of it - but I’ve always felt that something was not quite right about the path I’d chosen.

I have a whole graveyard of solo projects where I would repeat the same pattern. I would make some core mechanics - shooting, platforming, tactics - and then when the mechanics were done, I’d lose all motivation. The project would gradually peter out.

A screenshot from Pocket Tactics, a procedurally-generated tactics game I made in one month.

I’ve come to the conclusion that I’d approached game development backwards. It’s true that, without programming, a video game cannot exist. However, it’s equally true that without the other stuff - design, art, sound - the game will suck. No one wants to play a well engineered-game that isn’t fun. I don’t want to work a game like that either!

A screenshot from JAGS, a multiplayer top-down shooter I made during college.

To be clear, I love programming! I love solving logic problems and dropping pieces in until a whole great system hums along. And I love collaborating with artists and designers that put those systems to great use. Still, it really bothers me that I can’t seem to get my own ideas out there, to make my own great experiences.

My goal for a long while has been this: get better at making content, and figure out what would motivate me to create content.

Quake Brutalist Jam

Around October, I heard about Quake Brutalist Jam 1 through a post by Dominic Tarason. I’d been throwing around an idea for an FPS in my head already, so I decided to download Quake and play some QBJ levels for inspiration. That’s how I discovered Makkon Textures. I made a few small props, put them in Godot and started imagining a larger game; something like a cross between Receiver and Lunacid.

Image of a cave. In the middle is a stone altar surrounded by mossy pillars. Built using Makkon Textures.

Image of a train station built with Makkon Textures.

As I was working on these 3D sketches, I found out QBJ3 was in progress. It fit my goals perfectly! I would have to make a map in an existing engine, so there would be no opportunity whatsoever for me to modify systems. I would have to embrace constraints, forcing myself to make content for a game that already existed.

I put down my project, and booted up Ironwail.

My Background

I’d made maps for Half-Life 2 and Team Fortress 2 before. I’d never finished anything, nor felt particularly competent at it. However, it did give me an edge going into the jam: I knew what BSP and vis were, why map leaks were bad, and when to use func_detail. This knowledge was valuable for getting started.

I posted about a HL2 mod, sadly lost to time, 12 years ago. (Don’t judge me for the writing in that article, I was much younger.)

And the below is an image of KA_Elements_Alpha, a map I have very little recollection of, but apparently uploaded to GameBanana (back when it was FPSBanana) 18 years ago.

Image of the Hammer Editor. This is an image I uploaded 18 years ago to FPSBanana, when I was attempting TF2 maps.

While I knew my way around a brush-based editor, I did not know the game I was mapping for. I played Quake for the first time at the beginning of the jam, so I didn’t fully understand the traditions and limitations of the engine. In Quake, it’s okay if architecture looks fantastical or if enemies appear from thin air. Half-Life 2, my closest comparison, is far more realistic. Its architecture, lighting, and mechanics are grounded in reality.

I tried to approach my mapping with these sensibilities, and quickly ran into issues.

Shaping (Warping) of the Story

The map was originally called “Dread Police”. It would follow this this loose outline: you’re a wanted fugitive, and the police have found you. You fight your way to a train station, and defend it until the train arrives. Below, the red arrows indicate where the enemies would come from.

Screenshot of the main courtyard from Blood Train from the air. Arrows point inward from the first floor.

This resulted in a map where instead of the police hunting you down, they ran around in circles far below you. It was easy for you to pick them off one-by-one. What was going on?

In Quake, enemies are incapable of complex path-finding behavior. Instead, they execute a simple routine that looks sort of like this:

  • If I can’t see the player, turn right and move a little bit. Repeat until I can see the player.
  • If I can see the player, shoot at them.

This works well enough in open battle arenas, like you generally find in the original Quake. Not so well in my complicated courtyard, where the police couldn’t figure out how to get to you. This was clearly not a good experience, and I struggled with how to proceed.

From qbj3_chaosed0: A screenshot from the air of a large courtyard with a few red-leaved trees.

I didn’t want to pivot! I wanted to make my original story! But in the end, I knew what was better for the map. In the final confrontation, instead of the police coming for you, I made it so that you had to go to them.

This made no sense. Why would you have to hunt the police to escape on a train? Well… I thought. I guess… It’s a blood-powered train? And you’re powering it with the blood of the police? Kind of perfect for the world of Quake, but entirely against my sensibilities. Eh, whatever. I went for it even though it felt arbitrary.

Slowly, I re-shaped the map to fit this new narrative. The concept of the Dread Police stayed, but I made sure to put in a message very early on about “getting to the blood train”. This set up the entire silly concept, so that players wouldn’t get to that segment and feel that it was out of place. I put giant signs up labeled “BLOOD TRAIN” so that there was no mistaking the location of the final objective. And for even more of a hint, I changed the train’s color to red.

Screenshot of a red train parked at a platform. A sign above it reads "Blood Train."

In the end, I changed the map name entirely to “Blood Train”. The train, and the final encounter centered around it, ended up being the central character of the map.

It felt bad to pivot. I am glad that I was able to preserve the narrative of resisting arrest, but I feel that I undermined its impact by making it ungrounded in reality. Truthfully, though, I learned something valuable. After all, I started this jam precisely to work within constraints. It was, in a contradictory way, empowering to be met with this challenge that I couldn’t program my way out of. I proved to myself that I could work around it with design.

Where Inspiration Lies

Brutalism isn’t a movement I follow. I had only a general idea of what the term meant - lots of bare concrete, not much decor. When it actually came to envisioning brutalist architecture, I came up dry.

So I did what any artist does: I turned to references. I hopped on my bicycle and took a ride to North Seattle College, where I’d taken a class recently. There was no goal other than to wander around, inspecting the campus - which is drop-dead gorgeous in the fall.

A picture from North Seattle College of a concrete structure with an interesting silhouette.

For the first time, I found myself looking at a structure with a critical eye. Why is that wall, that stairway, interesting to look at? What sorts of patterns and textures are employed to break up the silhouette?

This is not work I am generally used to doing. I can study code all day, figure out how it works and what makes it tick, but it’s a dry, logical process. This was something else. It felt like opening a third eye.

I looked about in awe at the severe structures, overgrown with ivy. I took a lot of pictures, and returned home with a renewed sense of purpose, one that carried me through the entire jam. It’s no exaggeration to say that my map would not exist without that visit.

A picture from North Seattle College of a stairway overgrown with red ivy.

This taught me a valuable lesson about inspiration. As soon as I had a a clear vision to target, I felt motivated to execute on it. Iteration felt organic, effortless. This is the high I’ll be pursuing in future projects, and I’ll continue studying how to achieve this clarity of vision.

Borrowing and Stealing

Where is the line between inspiration and plagiarism? As you can see, the design of the courtyard space in Blood Train very closely resembles North Seattle College.

From North Seattle College: An image of concrete pillars holding up a structure. A screenshot of concrete pillars holding up a structure.

Of course I had to do some transformation so that the space was fit for demon-shooting gameplay. But when I received some feedback that was exceptionally positive about Blood Train’s architecture, I felt like a fraud. The architectural design didn’t belong to me! I copied most of it!

From North Seattle College: An image of the interior of a concrete bridge. A screenshot of the interior of a concrete bridge.

I’m still questioning how I should feel about this. Perhaps it’s true that good artists borrow and the best artists steal. My own feelings on this matter are as yet unresolved, and I think it will take some more attempts before I feel confident in my ability to tell the difference.

Makkon Textures

Ben Hale, AKA Makkon, provides a free set of environment textures for non-commercial use, and we were encouraged to use it.

It’s not exactly right to say that I disregarded texture work before this. I knew it was important to the art pipeline. However, it was not immediately obvious to me just how important it was that I had a high-quality set of textures to work with.

Makkon’s textures were as instrumental to my success as North Seattle College was. I think the map I made looks great! It was incredibly motivating to see it come together. Every trim I put on every wall contributed to the greater whole, making the map seem like a space.

Thing is, I may have put the trims in the right places, but it’s all thanks to Makkon that those trims exist in the first place.

From qbj3_chaosed0: A screenshot from the air of a large courtyard with a few red-leaved trees.

It’s kindled an interest in how those textures might be created. Never before did I think about taking pictures of random walls. I do it a lot now.

Doors and Encounters

Years ago, I’d come across this article: The Door Problem of Level Design. It wasn’t of interest to me at the time, but for some reason, my brain reserved a space for it. When I started having issues with the combat encounters in my map, I found that the article contained exactly the wisdom I needed.

In essence, Andrew Yoder attempts to answer the following question: How do you invite players to put themselves in dangerous situations? In most cases, a player will choose to stand at a doorway where it is safe and boring, rather than enter the room and dance with the enemies.

From qbj3_chaosed0: A tiled teal-colored hallway.

While making the map, I thought constantly about the specific solutions presented in the article. I leashed enemies. I made ledges that were hard to find your way back from. I added areas of ambiguous danger. Slowly, the encounters became interesting.

I was intentional about the combat design in Blood Train in a way I’ve never been. For the most part, I didn’t put a few enemies in and go “here’s a few enemies for you to fight.” I built each encounter with a purpose: “You’re going to get flushed out of the hallway by these swarmers, and then you will run into a few shotgunners and an Ogre.” Or: “Enemies will spawn while you’re in this truck, and you’ll be surrounded. You have a choice of two paths to take, each offering different levels of danger.” And so on.

While some encounters could still use work, I’m satisfied with them. It’s thanks in no small part to that article.

Pistol Sniping

Another breakthrough came when I playtested with a friend of mine, Robert Ackley. He repeatedly used the pistol, which has infinite ammo, to kill faraway enemies that couldn’t reach him. He’d stand still, put his crosshair over an enemy, and click until it fell over.

I asked him: “Do you find this engaging? Is this passable gameplay?” He said no, and suggested something I hadn’t considered: simply removing the pistol pickup altogether.

From qbj3_chaosed0: Image of a police truck in a courtyard. There is scaffolding nearby.

After removing the pistol, ammo scarcity shaped the combat of the entire map. This is especially present in the final encounter, when the player is swarmed by countless enemies. They must be calculated about when to use powerful nails and rockets, and make these snap decisions in the heat of combat.

Pacing and challenge would have suffered without that simple suggestion, and I have playtesting to thank for that.

The Lessons I Didn’t Need

I entered this jam with a specific goal: make an engaging level for an FPS. This was not equivalent to creating an engaging Quake map.

Quake is 30 years old. Some parts of the engine are timeless. Other pieces have been fixed by the long history of source ports. And then, there’s the rest.

Let us inspect the humble rotating door.

In any sane engine, you’d just have one entity - the door. In Quake, though? A rotating door comprises at least three entities. There is the door geometry itself, the door controller, and the pivot point.

Even less sane, this produces a door with no collision. Colliders in Quake cannot actually rotate. To generate a door with collision, you must line the door with tiny rectangles that are not drawn. These collision rectangles are translated around the pivot point to give the illusion of rotating.

A screenshot from Trenchbroom of the map: The setup of the rotating door. Many brushes are pictured.

Now we reach the point of actual insanity. Due to some quirk in the engine, these collision objects miss one frame of rotation at the very end. That means, for fast-opening doors, the collision objects will not match up well with the rotator.

A screenshot from the map, with a debug option on displaying colliders. The colliders do not match up with the rendering of the door.

Listen - I get it, it’s an old engine. I understand why these limitations exist. Doesn’t mean I enjoyed working around it! There are a lot of fast-opening rotating doors in Blood Train, and none have colliders that match with the visuals.

There’s more quirks. Decals are just extremely thin brushes with transparent materials. Moving entities will sometimes turn completely black because they take light from unlit surfaces. I still don’t know what the pivot point of a func_train is relative to its target_path points.

There were other non-quirky parts of polishing I also didn’t enjoy. Lighting was difficult to iterate on because compile times took a long time, and there was no preview within the editor. I wasn’t particularly interested in making the map playable in the multiple difficulties that Quake supports.

Despite it all, I was able to get through with the jamming mentality: just make it work and keep going. Even though more iteration on these aspects may have resulted in a better map, I didn’t mind phoning it in. I tried to be very targeted about the sorts of lessons I was learning.

The Cutting Room

As with any project, there were a few things that didn’t make it.

There are two main areas in Blood Train: an apartment courtyard, and the train station. Originally, there was going to be another area in between them based on the garden rooftop of the Vancouver Central Library.

A picture of repeating arches from the Vancouver library.

This area would have evened out the progression slightly, allowing me to give the player more time to experiment with the new weapons QBJ3 introduced. Plus it would have rounded out the map via the rule of threes.

I was at a work conference for a week in the middle of the jam, and the deadline was approaching, so I cut the entire area. The result is an uneven experience at the end of the map, where the rocket launcher is introduced in a strangely-paced encounter right at the train platform with just a few enemies.

Hitting a Wall

Like any other creative project, the process felt endless. It felt like I should keep tweaking, changing enemy locations, adding or removing pickups, texturing more detail… After a month, I felt exhausted. Not tired; exhausted, in the literal sense. I had no more effort left to give.

When the jam submission deadline was extended, I groaned internally. Another week of jamming could only make the map better, so I ought to keep going… right? As I thought about it, I realized - my sense of pride was satisfied. I didn’t need to keep going. I’d learned the lessons I wanted, and more.

So I submitted the map a week early.

A screenshot from the Slipseer forum, posted by Chaosed0, submitting the Blood Train map.

I did a good enough job. I’m proud of what I made, and what I’d learned. It was time to move on.

The Community

I have nothing but praise for the Quake mapping community. Despite my short time there, I can already see that it is something special. To the staff I interacted with - Makkon, Fairweather, Bal, h4724, bmFBR, and the rest: maintaining a community is no easy matter, and you all are killing it.

People in the Discord were consistently helpful, with very little of the in-jokes or gatekeeping I would have expected from such a small community. Questions were answered quickly, and the creators of every tool used to put together a map are all there.

There is a playtest channel where anyone can post a map or a mod. I was a little anxious to post Blood Train as a new community member, but I did anyway since it was important to get feedback from people who actually play Quake. I quickly received constructive and actionable feedback. In no other community have I seen such an active playtest channel.

And finally: the clear “no AI” rule is incredibly uplifting to see. I am so glad that there are creative communities out there that are still prioritizing humanity. In a time when it feels like walls are closing in everywhere, suffocating, it made me remember that there are still spaces for me out there.

Conclusion

Here’s a small timelapse of my level creation process, generated from the Github repository for my map.

Look out for Blood Train in Quake Brutalist Jam 3 when it releases soon, and consider creating a Quake map yourself. You might learn some lessons you didn’t expect!