How Does RNG Influence Play in DOOM?
DOOM is a truly excellent video game. Hopefully you didn’t need to click on this article to reach that conclusion, but I think it still warrants being said despite the decades of flowery accolades flung its way. Few games have matched the frenetic pace of its gunplay and slippery locomotion, the modability of the DOOM engine has pushed its systems well beyond their implementation in the base game, and combined with DOOM II, it might just have the most iconic bestiary of FPS enemies ever assembled. You don’t need me to tell you this, but for a shooter released during the Clinton administration, I think “visionary” is selling the package a little short.
It’s hard to argue that DOOM’s collection of systems is anything short of masterful, but the prevalence of RNG in moment to moment play was something I had a hard time wrapping my head around when I first picked up the game. It’s been an open secret ever since launch that certain behaviors in the game aren’t consistent, most obviously damage taken from and applied to enemies, but it goes so much deeper than that. Luckily, since the mid 90’s we’ve actually had a very strong understanding of how the game calculates values under the hood.
At its core, DOOM’s RNG is held up by two central pillars. The first pillar, and the one that’s probably the most well known among the playerbase, is how the game calculates the damage of its various attacks. Every time you throw a punch or pull the trigger on a gun, a DnD style calculation is performed, and a random variable is called to act in place of a dice roll. Here’s an example: every time you fire the pistol, you can imagine the game rolls a d3, multiplies the value of the dice by 5, and the number you’re left with is the total damage of the shot. For the sake of differentiating each of the tools in your arsenal as well as widening the variability of moment to moment combat, each of the game’s weapons also pulls from their own distinct equation when calculating damage output. Oftentimes this is as simple as changing how high of a number you can get on your dice and adjusting the multiplier, but for some of the DOOM’s more distinct weapons, extra variables are added to really set them over the edge. For the rocket launcher, DOOM takes what would be a pretty wide net of damage rolling from a d8x20 and adds a flat value on 128 damage from splash damage on a direct hit, always ensuring the base damage from rockets never dips too low how valuable each shot can be. (To make the weapon even messier, splash damage’s effect on surrounding enemies fluctuates in a range of 128 on the high end as we’ve established, and even as low as 1 single point of damage based on how close they were to the initial hit). By far the most chaotic example of this gesture towards balance lies within the game’s shotguns, rolling damage for all pellets individually when shot, leading to internal calculations of 7d3x5 for the regular shotgun, and a comical 20d3x5 for the super shotgun.
Beyond just having deeply obfuscated damage values, DOOM is naturally able to balance its weapons further by rate of fire and ammo scarcity in each level, making decision making go deeper than just rolling the odds on what could give you the highest damage output. Players who get the urge to put a fist shaped hole in their wall any time an Imp isn’t instantly killed by the shotgun have voiced their disdain of these variables for years, but in a game like DOOM where every option can be placed from a safe position with proper planning and reaction time, I never feel like a bad dice roll is the difference between success and failure when shots fired come down to the wire.
While player output randomness can easily be identified and worked around, these calculations are done for enemies as well, unquestionably contributing to the game’s frenzy more than anything else. Unpredictable hoards may not be anything new for shooters, but leaning on its numbers within occasionally vast margins give the experience so much irreplaceable texture. For how quickly scrambles can tear you apart in DOOM, you might not be able to tell the difference in how powerful a baker’s dozen fireballs from a swarm of Hell Knights truly is, but randomly taking an extra 50 damage from a stray Cacodemon bite might trick you into believing that DOOM is actually a bad video game for even just a fleeting moment.
It must be noted however that damage is not the only enemy behavior that’s determined by chance, and this is where DOOM’s second pillar finally shows its hand. While it’s true that calculations are still performed in the background as needed, every time the game needs to pull a number for a dice roll or another bit of randomized behavior, DOOM pulls a bizarre trick. As computers are deterministic machines that are really bad at pulling numbers out of thin air, it’s not uncommon to use a set of preconfigured values, or a “seed” to determine the list of needed random numbers well in advance. This “pseudo-randomization” has the benefit of being far more computationally affordable on the CPU, as well as the ability to recreate “random” strings of behavior with 100% parity if the same seed is used repeatedly.
Where DOOM differs is that, rather than pulling values from many different seeds of data, the same predetermined set of 256 values is hard coded into the game, remaining completely identical on startup every single time. Every time a function is performed that requires a “random” outcome, a number is called from this central list of bytes that each translate to different outcomes for every possible call with a modulo calculation. After a byte is used, the game moves onto the next byte in the list to prepare for subsequent calls, going down the list until no new values remain and wrapping back to the start of the list to continue making calls.
Had DOOM’s RNG systems solely cribbed Dungeons & Dragons’ dice rolls and pulled numbers out of thin air we might have a more “balanced” system, but I’m endlessly enamored by the approach here on a programmatic level. The internal list of 256 bytes feels about as random as the game itself at times, and this variance allows for a natural bias towards some common values more than others. Deliberate or not, this design decision ultimately branched into another thread of balance and resulted in a system where many outcomes have certain skewed probability. In a game with a slower pace or less calls this could potentially be easily exploitable, but since so many of DOOM’s pseudo-random functions are required to pull from this one central list, from dice rolls to enemy movement, in practice there can be dozens of calls every second. Unless you’re TAS’ing the game, anything that isn’t a pistol shot fired one second into a map will be all but impossible to predict, ultimately looping back to the start and producing a system that feels truly random. In summary, I just think it’s neat!
Reading DOOM’s code, we can easily determine the probability of damage output values.
Now that we’ve laid the groundwork of how everything works under the hood, we can more easily contextualize how things actually play out in execution. For as much as these numbers may give the impression that this is an insanely complex game to play at high levels, if you’re experienced with DOOM at all, you’d know that couldn’t be further from the truth. Regardless of the skill level it’s played at, DOOM is defined first and foremost by its simplicity. By FPS standards there’s arguably more you can’t compared to what you can, but it’s this unwavering dedication to being simple, loud, and fast that still sets DOOM over the edge even today.
Beyond being open enough to give players the space to stretch their legs and push against the walls of what the engine allows, this gives its systems the opportunity to take whatever shape it deems necessary to keep you on your toes. Considering mechanics like enemy movement, infighting, and bodyblocking just to name a few, there’s always dynamics at play that one could argue are powerful vessels to promote meaningful decision making during play. Threading all these together is DOOM’s commitment to variability, felt in large ways through aforementioned methods of crowd control and AI manipulation, as well as in more granular moments of blatant randomization and inconsistent gameplay output.
For as much as DOOM prioritizes showing its hand in nearly every facet of its design, it shouldn’t come as a surprise that its RNG implementation leaves a lot to be desired for many. Unpredictable demons are one thing, but what does a dice roll add to combat that perhaps more complex enemy behaviors couldn’t accomplish instead? While it’s true that many of the greatest games ever are exceptionally dynamic, requiring constant call and response interactions from the player with clear outcome trees, it’s crucial to understand that just about every game that even gestures toward interactivity promotes decision making in some capacity. It’s such a widespread description that you can really twist most game interactions into that label and still technically be correct. While it may be a nice label to have, it’s hard to use it to elevate one element of game design and put down another.
But what makes for something we’d traditionally call “good” decision-making anyway? In the context of an action game, we can describe this as the act of being presented with multiple possible choices and having to deduce which decision could lead to the best outcome. For any game with a wide decision tree, we instinctually split choices into micro and macro categories relative to what parts of combat they affect and make decisions based on that. For example, in Bayonetta we could consider our weapon choice a micro decision due to how they interact with enemies in different ways, and we could consider our herding and crowd control a macro decision for how it shifts the moment-to-moment positioning and dynamics of the encounter. This innate hierarchy we use to categorize choices can be extremely useful when we aim for efficiency in combat, but this binary distinction doesn’t tell us the full story.
For a moment I’d really want to emphasize this admittedly vague idea of decision trees here, because considering the ways in which one decision can potentially ripple out through the rest of combat really gets to the heart of what makes action games fun on a moment to moment basis for me. Knowing in the back of your mind that one mistake could screw you over or push you over the edge of success is an electrifying one, and this type of pressure can make these experiences leaps and bounds more meaningful than they could be otherwise. However, while poor decisions may eventually be felt on some wider scale, oftentimes the potential devastation of these choices can be sidestepped with proper skill and knowledge of the game. Think about it like this: While branches on the tree may get shorter and shorter with each subsequent choice, rarely does it stop at a dead end - instead they will often continue to branch out into smaller paths the player can go down in the moment. If the player has been going down a path of poor choice and consideration, further gameplay choices simply present the player with gradually more impactful decisions to make rather than hitting them with sharp, absolute failure.
While it can feel nice to pull games back in this way to assess them in such a controlled way, rarely does it actually equate to full unfettered command over the experience. The buttons you choose to press are still well within your control and you can consider how that may affect your experience later on, but when basically every interactable variable in a game can be broken down like this in an infinite number of complex and unpredictable number of scenarios, all the player can really do is make an informed decision in the moment and play from there. Even if you can’t see the future and know exactly what’s coming your way, if you can react to it and make a choice from there, then you’re bound to have a damn good time.
To come back to my original point, while pseudo-randomized elements may feel outside the player’s control, their presence still infects every other mechanic and shifts how you respond to stimuli. This doesn’t always strike a chord with me though, and I would like to discuss briefly what this looks like on the opposite end of the spectrum. An example of how this systematic reliance on numbers doesn’t always appeal to me lies within JRPG’s - this is a genre that commonly presents varying degrees of variability in gameplay through dice rolls similar to DOOM, with the catch that they can largely be sidestepped outside the walls of combat. Before a player even puts themself at risk of playing with unfavorable odds, they can spend time grinding for EXP, finding better equipment to soften future punishment, cycling their abilities around to better prepare for challenges up ahead, etc. While these are all still active decisions made by the player, the split between sanctioned off preparation and running the numbers in dedicated combat encounters is a big wall for me personally. I recognize that this split is pretty much the main appeal to the genre and I’m ignoring their tendency to focus on storytelling and presentation, but it’s still just not really to my taste these days.
The difference in a game like DOOM is the nature of its gameplay exclusively existing in a linear and constant timeline, with decisions made in and out of combat always influencing how you approach future difficult scenarios. While moments of downtime before slaughters may conjure up feelings of prepwork in those aforementioned RPG’s, the commitment to everything existing within the same space leads to moments of delightful fluidity, with the player being able to easily slip between scenarios and arenas with different assortments of weapons based on what’s been left behind from previous scraps. Preparation in this framework is something that always feels like a focus, and because of that, it equally shares brainspace with actual combat encounters. At this point the variability in combat outcome is fully allowed to take shape, affecting encounters of every shape and size.
Very little downtime exists within DOOM - when fights aren’t literally strung together from room to room, often your choices in one have direct consequences in another.
Stacking everything together, there’s a delightful flow to the scramble that takes place during every second of combat. Disparate systems and RNG checks compounding together and splashing over you like waves on a shore while you’re desperately trying to stay on your feet. Reacting to the number of shots it takes to kill an Imp may feel like a very menial choice on its own, but fill the room with 10 and try to efficiently kill them all without taking too much damage all while tracing their movement and keeping control of your own, and suddenly the way you respond to RNG will likely shake up the gameplay quite a bit. The strength of DOOM’s mechanics and the way they allow you to mitigate failure with proper piloting ensures that even if button presses give you a less favorable outcome to no real fault of your own, the punishment is simply dealing with another fresh problem to solve in this fabulous mess of gunplay.
So player RNG clearly doesn’t bother me all too much, but just as important to the push in DOOM is the pull, and this is once again where the enemies come into play. You can always react and respond to how your offense clears out crowds, but since perfection is unreasonable in regular gameplay, at some point you’re bound to brush up against the thorns of defensive dice rolls. This isn’t always felt in the chaos of DOOM’s hoards, but famously this does pop up really aggressively in a few common cases, with certain enemy attacks being powerful enough to one shot you in some rare instances, and this is before you worry about multiple strong attacks overlapping at once. These randomly severe punishments are arguably the closest DOOM comes to being “bullshit”, but to me their hate is blown a little out of proportion.
Despite the game generally favoring more desirable outcomes in its damage checks, I think I’ve instinctually flipped that element of play in my head. Since DOOM moves with such ferocity, the biggest priority on the offensive is to quickly identify whether something kills in one shot or not, but when receiving damage you may not recognize the severity of the punishment until it’s too late. Because of this, DOOM forces you to play with the expectation and fear that everything will be as punishing as possible, leading not only to more calculated decisions on a macro level, but more intense feelings of relief when you pull off ridiculous maneuvers and clear out crowds relatively unscathed. Statistically, yes, being one shotted is an outlier and sucks whenever it happens, but since so many of these variables are completely obfuscated and impossible to manipulate, I tend to just let them wash over me. This is DOOM after all, and if I’m getting ripped to shreds by demons I’m not wondering what could have happened if I had a better roll, I’m just kicking myself for getting hit in scenarios where I could have pulled back or played with more precision. Is that ignoring the raw mechanics of it to focus on the “vibe” the game gives off? Maybe. But in the heat of the moment when I have my hands on my keyboard & mouse and I’m deep in a hoard of demons, I don’t care about the numbers - all I can do is aim, click, and feel.
At the risk of tearing up my initial thesis, I don’t think DOOM’s RNG is all too impactful on how you approach the game in the long-run. You will feel its impact eventually, but due to the speed and lack of visibility in its code paired with everything else you need to worry about in the moment, rarely does it feel like the reason for potential success or failure. I don’t view this as a condemnation of its implementation though. Ideally when designing a game with action at the forefront, you probably want the player to be able to confidently take responsibility for the outcome of play, and building your systems on the pillars of random chance can make the experience feel unstable and shaky. Player agency and control should probably be your focus, but peppering in uncertainty doesn’t have to be a net negative on the game. If you build randomization in the background of your game properly, it doesn’t have to feel like a burden infecting everything you do, but rather a vessel to conjure unique problems to solve and exciting scenarios to overcome.