Categories
Eldritch Eldritch 2 NEON STRUCT Slayer Shock

Rosa

I’ve been developing games professionally for 17 years, and I’ve been developing my personal engine Rosa for about as long. This isn’t going to be a post about whether or not you should make your own engine. I generally wouldn’t advise it, but you should make your own decision. I made my decision a long time ago. I love making games, but I love programming too; and engine development provides some of the most satisfying programming challenges. This is a brief history of Rosa and my current ideas for its future.

The origins of Rosa came from my student work at SMU Guildhall (2005-2007). As part of the curriculum, every programming student had to build their own 3D game engine, with OpenGL and Direct3D rendering, audio, input, collision and physics, etc. The more game-specific parts of an engine were left to each individual to focus on, and I chose to pursue AI with studies on behavior systems, awareness models, and pathfinding. This was my first time writing a 3D engine from scratch, and I got it done but it was messy.

When I graduated in 2007 and became a full-time professional game developer, I also began building a new personal engine, taking the good parts of what I had learned and cleaning up the messier, poorly-architected bits. Incidentally, I jettisoned OpenGL at this point, believing Direct3D to be the way (and Windows to be the only OS). I did this work mostly for fun, but I also hoped to eventually make a game of my own. Between 2007 and 2012, I built a lot of engine parts without ever getting close to actually shipping a game.

Brass City Couriers (unfinished, circa 2009-2012).

I leaned on Blender heavily at this time, even using it as my level editor because that seemed easier than building a level editor. The lighting model was baked and static, encoded into level geo as vertex colors and applied to dynamic meshes through a coarse volumetric directional ambience grid. Game objects were inheritance-based. Development was slow.

Codename “Agency” (extremely unfinished, circa 2012).

In the summer of 2011, I was frustrated with the inheritance model of game objects and decided to experiment with this fancy new “Entity Component System” concept I’d been hearing about. I was also eager to explore procedural generation, for reasons I don’t quite recall but probably had something to do with Minecraft. I built a simple textmode graphics framework and began building an infinite procedurally-generated world populated with composition-based objects. It was fast, it was fun, and in retrospect, it may have been the most important step I could have taken in my career.

Second Order (unfinished, circa 2012).

In early 2013, I left the relative security of my Big Commercial Games job and went into business for myself. (A few months later, my brother did the same and we formed Minor Key Games.) I had a very limited budget and needed to ship a game in around 8 months. The obvious choice might have been to lean on all the tech I had built over the prior 6 years, but instead, I ripped it all up and streamlined everything. I used the simplest possible art and rendering: all albedo, no normal maps, no specular lighting. I rewrote my collision code for AABBs exclusively, because it’s fast and simple and I was using voxels so everything was axis-aligned anyway. And I incorporated some ECS concepts to make game object composition and reusability a breeze.

Eldritch (2013), Minor Key Games.

My engine didn’t have a name at this time, but I’ll call this Rosa v1. Eldritch was a modest success and I followed it with my Thief-meets-Deus Ex cyberpunk stealth love letter NEON STRUCT. I didn’t make many engine changes for Neon; I improved my tools and optimized the voxel lighting grid to support turning lights on and off at runtime, but it is fundamentally still Rosa v1: all albedo, with voxel worlds.

NEON STRUCT (2015), Minor Key Games.

By the time I finished Neon, I was growing tired of Minecraft comparisons. I liked the ease of working with voxel worlds, but I couldn’t escape the shadow of the king of voxels. I was also starting to feel constrained by how much I had cut my engine to the bone; in particular, I was constantly working around the lack of dynamic lights and eager to rebuild my rendering skills. I undertook a substantial overhaul of my engine during development of the next game, removing voxels in favor of mesh-based geo and replacing the simple forward renderer with a deferred renderer using a principled physically-based lighting model.

Slayer Shock (2016), Minor Key Games.

My engine still didn’t have a name, but I’ll call this Rosa v2. Slayer Shock missed the mark, but that’s a story for another time. I ran out of money around the end of 2016, got a job, and largely put my engine and my games aside for a while. From 2017 to 2020, I dabbled in a couple of projects but ultimately got nowhere. But while copying code back and forth between a couple of projects and renaming classes to match the project, I realized that it would be easier if I had a unifying name for game-level classes in my codebase. So instead of renaming top-level classes like EldritchFramework to NeonFramework to VampFramework, all my games could use one common codename. I picked “Rosa” because it was like tattooing “MOM” on my arm, and that became the de facto name of my engine.

In 2020, stuck inside while a pandemic raged on, I started doing game jams to scratch the indie dev itch. I finished four game jams that year, and have done at least one every year since. These game jams culminated in what I consider a trilogy of minimalist first-person games: NEON STRUCT: Desperation Column, Li’l Taffer, and Schloss der Wölfe. Each of these improved upon my engine’s pipeline and workflow, largely by leaning on procedural generation. I developed tools to quickly generate procedural meshes and materials for world geo, and I reinvented my procedural level generation algorithm to create indoor spaces nested inside larger outdoor spaces. These three games also share a common visual style which I’ve been calling my signature “toy aesthetic”.

Schloss der Wölfe (2023).

I consider this current generation of the engine to be Rosa v3, and it is the engine I am now using to develop Eldritch 2. It combines the fast iteration and relatively simple art pipeline of Rosa v1 with the physically-based dynamic lighting and materials of Rosa v2. It’s a joy to work in, and work on. My current work is revising my procedural level generation (again) to bridge the gap between the more spatially plausible worlds of my recent game jams and the intentionally bizarro crashed-together spaces of Eldritch.

Looking to the future, there’s at least one unavoidable tech task that I need to deal with. Rosa is still using Direct3D 9 and OpenGL 2, absolutely ancient graphics APIs that have increasingly fragile vendor support. I don’t feel the need to upgrade for any particular modern features—I’m actually rather happy working with 20-year old tech—but OpenGL is no longer supported on Mac and getting a modern Windows PC set up to build a Direct3D 9 app requires jumping through a lot of hoops that they would clearly developers not do anymore. I’ll have to port to Vulkan eventually, and probably Metal if I ever want to target Mac again.

That’s a lot of words, and I’ve barely scratched the surface of my engine. I’ve got some tech that has been largely stable since as far back as Eldritch: AI behavior trees, event + reaction gameplay scripting, collision detection and sweeps/traces. I’ve got a custom cook process that is fast as heck. I’ve shipped 13 games or game jams on this engine, and it has grown a lot along the way. And I’m excited to keep using it!

Categories
Uncategorized

On Credits, and Other Things

Hi, I’m David Lindsey Pittman, and I make games.

Growing up, I was embarrassed by my middle name: Lindsey. That was a girl’s name, and I was a boy. I didn’t want anyone to know that was my name.

In my early years working in games, a lot people called me Dave. For a while, I hated it, because that wasn’t my name! Then I accepted it; and I didn’t just accept it, I adopted it. For a hot minute, I was Dave, and Dave was me. Then I rejected it again.

Names are fuckin’ weird yo, and I’m cis so I’m sure I don’t know the half of it.

Sometime during the pandemic year (I mean 2020, but they’re all pandemic years since then, right?), I decided to start using my full name in the credits. “David Lindsey Pittman”. No one calls me that, but that’s who I am. There are a lot of David Pittmans in the world, but I’m pretty sure I’m the only David Lindsey Pittman.

That was the same year I got into a brief spat on Twitter with a stranger over some hot take I tweeted about guns in video games. I don’t remember exactly what I said, and I don’t remember exactly what he said, but I definitely remember that I replied that I could end his career with a tweet. Because it was bullshit machismo posturing on my part, and it would have blown over and been forgotten the next day, except that a shitty alt-right comicsgate site decided to make a story out of it; and 4 years later, that’s still in the top results if you Google my name. The internet doesn’t forget anything.

On Halloween 2022, driving home from a screening of The Rocky Horror Picture Show, I was stopped by Plano PD for speeding, and arrested on suspicion of DWI. Within a week, if you Googled my full name, you could find my mug shot and my home address. I don’t mind owning up to my fuck-ups (fucks-up? how do you pluralize fuck-up?), but it is extremely fucked up that personal information in police and court records can get exposed online by sharks who will ask you to pay them to take it down.

I’ve lived my life online for as long as there has been online. I was DavidLP013 on AOL. I was David “Kyp Durron” Pittman in Unreal mods. I was MillennialDavid on AIM, before “millennial” was a thing anyone said. Then I was dphrygian, and that one stuck.

Sometimes, it would be nice to be invisible. I probably wouldn’t have so much anxiety if I just shitposted from an anonymous account, instead of being “David from Twitter” as my coworkers affectionately(?) call me. But for better or worse, my life is an open book. I’m 40 years old today, I’ve made more games than mistakes, and I hope the next chapter is a happier one.

I’m David Lindsey Pittman. And I make games.

Categories
Uncategorized

Schloss der Wölfe

I made a game about hunting Werewolf Hitler and punching Nazi zombies in the face. It’s called Schloss der Wölfe (“Castle of the Wolves”) and it’s out now for Windows and Linux: https://dphrygian.itch.io/schloss-der-woelfe

Schloss der Wölfe (or “Wolf” for short, because I’m not going to keep typing ö) was conceived as a short personal game jam, in the vein of the 7DFPS jam but on my own schedule. I started work on it on September 15, and intended it to be done by September 25. It’s now almost Halloween and I’ve just launched it, so… what happened?

For starters, it was probably a poor idea to do a game jam during a real crunchy month at my job. I made very slow progress the first weekend and had no time or energy to work on it midweek, so by the second weekend, it was clear that I wouldn’t hit my deadline. But I still wanted to finish it, so I let it slide into October. It’s a good game for Halloween-month, after all. Then it slipped the mid-October timeframe, as I got sidetracked with various tech detours and let the scope of the project grow beyond the original plan. But I was determined to finish it by Halloween, and here it is!

Wolf is the third in a series of minimalist first-person games I’ve made over the past two years, after NEON STRUCT: Desperation Column and Li’l Taffer. These three games are similar in design to my commercial games of the 2010s (Eldritch, NEON STRUCT, and Slayer Shock)—it’s what I love to make and what my engine was largely built to do—and one of my goals for each was to test new features and improvements to my engine by forcing myself to ship something small instead of noodling on tech with no real target.

I had begun some initial work on Eldritch 2 earlier this year—and I hope to get back to it now that Wolf is done—but that project got held up for months as my life got busy with buying a home, summer parenting duty, and the aforementioned crunch, among many other things. So Wolf was also a good opportunity to clear my mind and shake off the rust after a few months away from regular work in my codebase. As such, I let myself explore avenues that I’d normally avoid during a game jam, such as:

  • Reorganizing my deferred renderer G-buffer to replace the reflectance channel with an implicit reflectance (determined by metallicity) and freeing up a channel for ambient occlusion maps.
  • Adding new features to the texture generator that I developed earlier this year for Eldritch 2, including support for creating AO maps.
  • Completely rewriting my procedural geometry generator functions, to simplify the process of adding new shapes.
  • Replacing the simple echo filter I’d been using since 2018 with an actual reverb filter (which involved a crash course in digital reverb design—fascinating topic that I never knew much about before).
  • Implementing console commands, finally.

So, yes, a lot of tech detours; but it accomplished that goal of shipping something new and not just leaning on what my engine could already do to make a game as fast as possible. I consider that a success!

Enough about tech, let’s talk about the game. This is the original pitch, as I wrote in my email thread of potential game jam ideas:

Something I’ve never done before is a zombie game, and I have a feeling zombies in my signature toy aesthetic could be funny AND tense. Some light survival mechanics in a mid-sized generated city (or castle?) and a simple L4D style goal… that’s compelling. Maybe make it a Wolfenstein-core Nazi zombie thing for added punch. Could also use the comics style of Fray [an abandoned game project of mine, not the Joss Whedon comic], and really lean into a classic Captain America vibe. Call it “Schloss der Wölfe” (Castle of the Wolves) or something. Codename could be “Wolf”.

Of course, I’m not the first person to discover that the only thing better than killing Nazis or killing zombies is killing Nazi zombies; but as I said, I’d never made a zombie game before, so it stuck. The original idea was more stealth- and survival-oriented, but as I began to explore the concept and came up with Werewolf Hitler (initially as a joke that mi-i-ight be a stretch goal at best, but eventually became the central premise of the game), the tone got sillier and the genre shifted toward action.

I nailed down the high-level shape of the map and the pacing beats pretty early, but the bulk of the level design didn’t happen until this past weekend. In between, I focused on the mechanics: splitting my hands state and weapons system apart to support dual-wielding (the left hand can only punch, but it is technically a weapon in the code), optimizing AIs for zombie hordes, adding a simple zombie toxin status effect, and a whole lot of bespoke scripting for the (ahem) big boss fight. Also, it’s truly surprising to me that I’d never previously shipped a game with explosive barrels. I’m happy to finally check that one off my gamedev bucket list.

I’ll probably share more as I unwind over the next few days and reflect on this project. It’s my favorite thing I’ve made in a while, but it’s been six weeks of intense work, and I’m tired.

Categories
Uncategorized

NEON STRUCT: Desperation Column gamedev postmortem

NEON STRUCT: Desperation Column is the third game in the NEON STRUCT series, and the second that I’ve released as a free game jam.

The reason I’ve been doing game jams again recently is that sometimes I need the extrinsic motivation of a theme, a competition, or a deadline. I like making games, but it’s easy to get lazy, and an extra push doesn’t hurt.

This is the first game jam I’ve done in a very long time that put gameplay first. I’ve been doing narrative-focused stuff for a while, and that’s been great too; but this is pure action gameplay, and I’m at home here.

I started from a codebase that already had a lot of the things I needed for this game. I think that’s fine for a game jam, it’s the same as starting with Unreal or Unity + your fav plugins, but I definitely didn’t make this from scratch in a week.

The 7dfps jam has generous rules (read: no rules), but I wanted to finish on time AND make something good. So I knew I’d have to be careful about scope, and baby I LIVE for being careful about scope.

My initial parameters were: 1 weapon, 1 enemy type, 1 environment. That grew to 2 enemy types, plus an NPC type, and 3 environments (sorta); but the ultra lo-fi style meant those additions didn’t explode scope.

You can search bodies and containers, but there is only 1 resource to find: ammo. You have limited ammo mostly because it gives you a reason to search containers. And it maybe creates tense moments when you run out.

There are no health pickups, no upgrades or unlocks, no skills or perks. No conversation trees, no shops, no character customization. I’ve done all those things before, I still have the code, and I chose to not do them here.

The result is a minimalist game that is now one of my favorite personal projects: a pure distillation of the action/FPS mechanics at the heart of all my work. I think it’s the closest thing to Eldritch I’ve made in a long time.

And it broke me out of a mental rut where I’d felt like doing this sort of thing was too hard, or would take too long. It wasn’t, and it didn’t. It was a sheer joy to make this game, and I hope that shows.

Categories
Slayer Shock

Everything I Need to Know About Writing Video Games I Learned From Pro Wrestling

I’m currently working on Slayer Shock, a role-playing shooter about hunting vampires in Nebraska. This game is thematically structured like a television series: each mission is called an “episode”, a group of episodes is a “season”, and each season ends when the player and their team stands victorious over the latest villain. (To be clear, that’s just flavor; this is not an episodic game in the usual sense.) The core elements of the narrative—heroes, villains, and plot points—are randomly chosen or procedurally generated to create unexpected stories.

While interactive game systems can generate thrilling player stories, they’re historically less successful at creating characters and plots with the charm and feel of authored stories. I knew from inception that if the narrative aspect of Slayer Shock were to be a unique selling point, interesting game mechanics were not enough. I would need to develop a separate system for generating memorable characters and coherent, engaging storylines. This isn’t without precedent—Dwarf Fortress builds massive mythologies, and Middle-earth: Shadow of Mordor creates memorable rivals—but it is not clearly solved for all purposes in all kinds of games.

In particular, the procedural and strategic structure of Slayer Shock means there is effectively no end to the narrative. Victory over one villain progresses to a confrontation with the next, allies join or depart according to their personal desires, and the game has to manage those events and try make it all coherent. To invent a narrative generator that could accommodate these demands, I would first have to understand how to write an infinite number of perpetual stories.


For research, I first looked to scripted television series (like Buffy the Vampire Slayer, which informs much of the tone and theme of Slayer Shock), but I found it difficult to extrapolate any general lessons from that format. Most television keeps its stories contained to the episodic unit, with big picture season or series plots developed in the margins, in ad hoc ways. While the reliable structure of “monster of the week” shows or procedural dramas could be instructive for other kinds of story generators, I found that they weren’t helpful for my purpose. I realized I wasn’t actually interested in the content of an episode, I was interested in what changed between episodes.

My next brief research stop was at soap operas. With their relentless development schedule (typically producing 5 hour-length episodes each week), melodramatic characterization, and penchant for twists and cliffhangers, I was sure there would be a wealth of available research on the structures and patterns and tropes of daytime serials. And perhaps such research is out there, but a cursory TV Tropes search didn’t return what I wanted. And, no offense intended to fans, but I wasn’t excited about the prospect of watching hours of soaps to internalize their design.

Around this time, I watched Max Landis’s “Wrestling Isn’t Wrestling” film*, and so my research path finally led to professional wrestling. Sometimes dismissed as “male soap opera” (a statement with so many layers of problems that I’m not even going to attempt to unpack it now), professional wrestling does in fact exhibit many of the same properties as daytime serials: a staggering amount of content produced every week; frequent, seemingly arbitrary twists; and exaggerated, simply-drawn characters. And as with soap operas, I could find a lot of information about specific plots, but relatively little about the general patterns of story development. If I wanted to understand the narrative design of pro wrestling, I was going to have to study it myself.

Note: For the purpose of this article, when I say “professional wrestling”, I’m talking about WWE’s mainstream version of “sports entertainment”. There are lots of forms of professional wrestling, but the exaggerated characters and angles of WWE are what I found useful to deconstruct for this purpose.

As a child of the ‘80s, I grew up with a vague awareness of pro wrestling, mostly by way of occasional appearances in video game magazines. Wrestling became unavoidable during WWE’s “Attitude Era” in the late ‘90s, and I could identify all the big stars despite never watching a single minute of it. I didn’t understand the appeal at the time—it’s fake, why watch a match where the outcome is predetermined?—and it wasn’t until I finally dug into it last year that I realized what everyone else already knew: it isn’t about the matches per se, it’s about the performances and the storylines. It’s theater.


The first narrative challenge I faced in Slayer Shock was how to make generated characters unique and memorable. My fear was that each villain would be interchangeable with any other villain; perhaps visually unique thanks to a randomized appearance, but functionally and emotionally identical to the rest. Here, I found wrestling especially instructive. Wrestling promotions face a similar challenge to develop a constantly shifting roster of dozens of wrestlers into distinct characters that can get “over” with the crowd. How does wrestling distinguish one bulked-up shirtless man from the next? They give them gimmicks.

The term “gimmick” encompasses everything that transforms a wrestler (i.e., the real person) into their character: behaviors, catchphrases, costumes, and more. It’s the supernatural horror of the Undertaker, it’s Stone Cold Steve Austin’s middle finger salute, it’s The New Day spilling out of an oversized cereal box in anime armor and unicorn horns.

The takeaway isn’t to craft a unique gimmick for every generated character, because that would be impossible. Instead, what I learned was to develop a library of common gimmick elements that mainly serve to distinguish one villain from the next. From that seed, I can let the characters grow in the player’s mind based on the actual events of gameplay. Even in wrestling, the best gimmicks take time to develop and get “over” with the audience; many wrestlers begin with either minimal characterization or with common, tropey gimmicks.


The second lesson I learned was repetition. When wrestling finds an angle or a gimmick or a feud that works, they milk it dry. Sometimes this is tedious or boring: characters reiterate their ongoing angles in promo after promo, the participants of upcoming or recent title matches are repeatedly thrown into the ring again with no meaningful outcome, and the commentators do little more than remind the audience of the wrestlers’ gimmicks. But the reasons for this repetition are manifold and valid. It makes it easy for new or returning viewers to catch up on the storylines. It ingrains the gimmicks in the audience’s minds. But most importantly, wrestling is theater. Everyone involved is performing live for a crowd who showed up that night to see their favorite wrestlers. And from this perspective, it makes no more sense to criticize wrestling for its repetition than it would to criticize a band for playing their most popular song at every concert.

My takeaway from wrestling’s repetition is about how to maximize the limited narrative bandwidth in this particular game. With its procedurally generated levels, there is little room for narrative delivery during core gameplay in Slayer Shock. Plot development happens at the margins of gameplay, in between missions, just as it mostly happens in between matches in wrestling. With such limited opportunity for narrative content, it is critical to reinforce characters through repetition, and there is little time left over to substantially develop them beyond that.

Furthermore, the performative aspect is increasingly significant in games, except in this case, it’s not the developer performing to the player. Instead, it’s the developer and the player collaboratively performing to viewers on YouTube or Twitch. Here again, repetition can help ease viewers into the experience and provide unique memetic hooks for each audience.


My previous project was NEON STRUCT, a game loosely inspired by the excessive reach of the modern surveillance state. Worried that I wouldn’t do the subject justice, I labored over every line of dialogue, struggling to make the script cohesive and coherent, trying to force the game to fit the message.

With that in mind, the third guidance I find in wrestling is adaptability. Wrestlers get taken out of action unexpectedly due to injuries or personal reasons, but the show must go on. On any given night, they may feature anyone from supernatural beings to ex-MMA fighters to literally Donald Trump; but they always have to bring it back to two people grappling in a ring. To be fair, wrestling avoids tackling highly-charged political subjects like the surveillance state, but I actually believe the audience would buy it if they tried.

What I take away from wrestling’s occasionally astounding incohesion is that it doesn’t really matter. As a creative artist, I can take a hard turn and my audience will follow along if they’re on board with what I’m doing. The player and the viewer come to be entertained, and it’s always better to surprise them than to bore them. If they poke holes in the construction or logic of a scene later, at least I’ll know it comes from a place of passion instead of disdain.


And speaking of taking a hard turn, the final point I’d like to share about wrestling is the many ways I’ve seen that the wrestling industry mirrors the video games industry, and what we might take away from that.

  • Like video games, wrestling is mass market entertainment that has grown by expanding into films and other media.
  • Like video games, wrestling is largely delineated between a few major promotions (like WWE) and a vast host of independent promotions that you’ve probably never heard of.
  • Like video games, wrestling has a majority of casual fans who are generally unaware or uninterested in what is happening in the independent scene.
  • Like game developers, wrestlers often bounce between the majors and the indies, for a variety of reasons.
  • Like game developers, wrestlers are intensely passionate about what they do.
  • Like game developers, wrestlers often accept low salaries and strenuous schedules for that passion.
  • Like game developers, wrestlers on the independent circuit are usually not making a living wage from their work.
  • Like game developers, wrestlers can burn out young, and struggle to find similar meaning outside their industry.
  • Like game developers, wrestlers are real people who make long-lasting friendships in their work.

Of course, the same could be said of novels, music, film, comic books, or virtually any other creative pursuit. I don’t mean to imply that all these fields are the same, and I certainly don’t believe that all these properties are good things. What I do find reassuring about it—in a year when the sustainability of independent game development looks uncertain for so many of us—is that our medium isn’t unique, and it isn’t going away. Opportunities may come in different forms than we’re used to, and we may have to look for the open windows when the doors close. But if an industry built around sweaty men in briefs slamming each other into the ground can remain a staple of entertainment across the US, I think we’re going to be just fine.

Slayer Shock will be released in Q4 2016 for Windows, Mac, and Linux, and is currently on Steam Greenlight.


23 July 2019: When I wrote this blog three years ago, I was unaware of accusations against Max Landis. Since then, he has been credibly accused as an abuser, and I do not wish to endorse him or his work. I have left the original text intact but removed the link to his video. These days, I recommend Super Eyepatch Wolf’s wrestling videos instead: