Doom Roguelike Analysis: Difficulty Levels

Doom Roguelike has 5 regular difficulty levels -by 'regular' I mean 'not counting Angel Challenges', which will be later posts- and unsurprisingly they have the same names as the classic Doom difficulty levels, which is to say...

I'm Too Young To Die
Hey, Not Too Rough
Hurt Me Plenty
Ultraviolence
Nightmare!

... though of course they work very, very differently from how difficulty levels worked in classic Doom since classic Doom focused a lot of the difficulty effects on custom level design stuff. Though even then, Doom Roguelike has plenty of fixed levels that actually do employ classic Doom design logic, where for example Hell's Arena has its final wave be Cacodemons on Hey, Not Too Rough, vs Hurt Me Plenty swaps those out for two Hell Knights, and Ultraviolence swaps those out for two Barons of Hell.

I've already covered various of the effects in prior posts (eg ammo drops) and later posts will be covering some other bits directly, but it's still nice to have a single place to consolidate all this, and some difficulty effects don't really have a natural place to cover elsewhere, and this is also an opportunity to cover other things.

So first of all, I should explain Danger. Danger is the 'price' of a monster in standard floor generation, where higher is more expensive and generally correlates to more dangerous enemies. The actual process is randomized 'purchasing'; the game rolls a metaphorical die, adds whichever enemy the metaphorical die result matches to, lowers its supply of available Danger appropriately, and if the supply of Danger is still greater than 0 repeats until it hits 0 or less.

Two major qualifiers: first of all, Special Levels and certain regular floors in a standard run ignore all this. (eg floor one, the Phobos Anomaly, the Tower of Babel, etc) Their layouts and enemy composition and initial positions are mostly rigid, aside having a version per difficulty. (There's various exceptions to this rigidness, like how Hell's Armory has the Lost Soul/Cacodemon starting positions obviously partially randomized, or how Hell's Arena has its layout partially randomized, but these exceptions never use the Danger system) Second of all, Vaults (Special rooms that intermittently get placed on a floor) have a bunch of enemies inside them that do not spend Danger: Vault enemies are on top of a floor's Danger 'purchases'.

One implication of this system is that how much Danger of enemies is on a given floor is actually variable, even though a given floor's Danger value is 100% predictable if you know the difficulty-specific formulas. Not because of Vaults, though obviously they contribute, but because the game doesn't negate an 'overdraw' purchase and then try to fill in exactly: if the game reaches the point where it has 1 Danger left to spend, it can purchase a Former Human and thus end up at exactly its Danger allotment, but it can also end up above its Danger value if it instead purchases something more expensive.

The overall impact of this is fairly minor simply because the game consistently arranges for the enemies available to a given floor to never have any given valid possibility be a significant fraction of the maximum Danger value. For example, on I'm Too Young To Die, on the second floor (ie the first floor to use proper level generation routines in a normal run -and you can't play Challenges on I'm Too Young To Die, making it impossible to see a standard-generation version of floor 1 on this difficulty), there will be 10.4 Danger, while the only valid enemies to buy cost 1 or 2 Danger: at most you could end up 1 Danger above the nominal max. And of course the deeper you go, the higher floor Danger rises and so the lower a proportion of floor Danger any given enemy can be.

As for how difficulty affects Danger, in 0.9.9.7 it used the following formulas:

I'm Too Young To Die: 6 + (2.2*Floor number)
Hey, Not Too Rough: 0.6 × sqrt(500 × dlevel) = 13.4 × sqrt(dlevel)
Hurt Me Plenty: 20*The square root of the floor's number
Ultraviolence: 32*The square root of the floor's number
Nightmare!: 40*The square root of the floor's number

So on I'm Too Young To Die, you have 2.2 Danger added per floor you descend. (Floor 2 is thus 10.4 Danger, while floor 23 is 56.6 Danger) Given the game is allowed to 'overdraw' on Danger purchases, I suspect the fractional Danger is used (As in, on floor 2, the game purchasing exactly 10 Danger of stuff would have it go 'hey, we still need to buy another enemy' because there's 0.4 Danger remaining), but have yet to get around to the testing necessary to confirm this.

Hey, Not Too Rough has an annoyingly complicated formula, enough so I've just copy-pasted the wiki's description because I'm not confident I understand it. I think it's saying that right of the equals sign is the effective result of the formula to the left of the equals sign, which would mean you get 13.4 Danger times the square root of the floor. A square root is the number that, if multiplied by itself, would result in the number you're determining the square root of. (Most calculators include a 'give me the square root' input, thankfully) So floor 2's square root is 1.4~, resulting in 13.4 times 1.4~, or just under 19 Danger. Then floor 3 is 1.73~, so multiply that by 13.4 and you get slightly over 23 Danger. For reference, floor 23 is the last floor in a standard run to do normal generation, and its square root is just under 4.8, and so should works out to about 64.2 Danger. So the late game ends up with a bit over three times the Danger on the floor, if this is all correct.

Hurt Me Plenty's formula is more straightforward but still square root based, just multiplying by 20. So floor 2 should result in about 28 Danger, and floor 23 in about 96 Danger.

Ultraviolence just raises the multiplier to 32. So floor 2 should result in about 44.8 Danger and floor 23 should result in about 153.6 Danger.

Nightmare! just raises the multiplier to 40. So floor 2 should result in about 56 Danger and floor 23 should result in about 192 Danger.

I should note that patch 0.9.9.8 claimed to have tweaked things so enemies are overall more common in the Hell portion of things, which from experience does seem to be true, which suggests 0.9.9.8 tweaked the formula somehow, but I don't know what the new formula is if so.

In any event, I should point out that the wildly different formula used by I'm Too Young To Die is probably why you can't do Angel Challenges on I'm Too Young To Die: because Angel of 100 gives inappropriate results with these formulas. An I'm Too Young To Die run would have 226 Danger on floor 100, while Hurt Me Plenty would have 200 Danger, meaning the lowest difficulty would have a nastier late game than the difficulty just above it!

Archangel of 666 would be even more egregious. Nightmare! gives about 1032 Danger on floor 666. I'm Too Young To Die gives 1,471.2 Danger on floor 666! Its formula just grows way faster because it's not based on square roots.

Anyway, all this means that except on I'm Too Young To Die, floor 23 has around 3.5~ times the danger of floor 2. On I'm Too Young To Die, floor 23 instead has almost 7 times the Danger of floor 2! More interesting is that I'm Too Young To Die's formula is designed so the gulf is at its largest in the early game: when looking at floor 23, I'm Too Young To Die's 56.6 Danger is only a little less than Hey, Not Too Rough's 64.2 Danger. As such, I'm Too Young To Die's Danger formula is mostly easing you in when it comes to early floors: the late game is actually decently close to what you'll experience when you move up a difficulty. I like that aspect.

That said, there's plenty of other effects tied to difficulty.

Next, ammo multiplier:

I'm Too Young To Die: *2
Hey, Not Too Rough: Base
Hurt Me Plenty: *1.25
Ultraviolence: *1.5
Nightmare!: *2

I've already touched on this with the individual ammo amounts, mind, but this is the post for difficulty effects, so I'm reiterating it regardless! Including that I'm reiterating the part where this only affects ammo that spawns directly on the ground and only on floors using regular floor generation routines. For that matter, I should explicitly point out that this multiplier has no effect on the quick-reload ammo items. (Shell Boxes and so on) All told, it thus has way less of an impact on ammo commonality than you might assume, and indeed it has less of an effect than I suspect the devs actually intended.

Regardless, it's interesting how, aside the jump from the bottom difficulty to one higher, the multiplier just keeps climbing. This overall makes sense given that enemy counts go up and therefore the player tends to need more ammo to cut through a given floor when on higher difficulties, but is still a pleasant surprise: all too often, when a game's difficulty settings are allowed to affect many parameters the impulse from devs is to have every value Be Meaner To The Player for going up with difficulty. This mentality often creates problems, so it's nice Doom Roguelike didn't fall into it.

Then there's a global Accuracy modifier to enemies:

I'm Too Young To Die: -1
Hey, Not Too Rough: +0
Hurt Me Plenty: +0
Ultraviolence: +2
Nightmare!: +2

This is probably the most subtle way I'm Too Young To Die 'babies' you, and one of the more subtle ways Ultraviolence spikes the danger. It's also wildly uneven in its practical effects, given that the Accuracy system swings the odds about dramatically when moving around near the 'center' while barely budging things when at the outer 'edges'. For example, this has a pretty dramatic effect on Arachnotrons, who have a base Accuracy modifier of +3: that means that at line of sight they hit 62.5% of the time by default, dropping to 50% of the time on the bottom difficulty, and rising to hitting 83.79% of the time on the upper two difficulties. Put another way, an Ultraviolence Arachnotron is on average more than 60% more lethal than an I'm Too Young To Die Arachnotron. Meanwhile, a Baron of Hell has +5 Accuracy base, and so by default hits 83.79% of the time at line of sight, 74.07% of the time on I'm Too Young To Die, and 95.37% of the time on Ultraviolence. That's a bit less than a 30% increase in average lethality when comparing bottom difficulty to top difficulty.

It's also a bit wonky since so many enemies partially or completely ignore Accuracy. For example, Former Sergeants use Shotguns and so their ranged attack is steady across difficulties, and so how nasty Former Sergeants are by comparison to Former Humans drops substantially as you go up in difficulty because the Former Humans get noticeably more accurate while the Former Sergeants stay the same. Notably, a lot of late-game enemies have minimal interaction with the Accuracy system, making them way more of an increase in danger relative to many early enemies when on I'm Too Young To Die than when on Ultraviolence or Nightmare!

Then there's the multiplier to how much experience enemies provide:

I'm Too Young To Die: *1.4
Hey, Not Too Rough: *1.2
Hurt Me Plenty: No modifier
Ultraviolence: No modifier
Nightmare!: *2

I'm... not sure exactly how this works as far as rounding and whatnot.

Regardless, the experience multiplier is... misleading? In practice, if you're not playing very sloppily, experience per floor tends to just go up, because the Danger value goes up, so you kill more enemies, so you get more experience. For example, my floor 2 numbers from earlier give 19 Danger from Hey, Not Too Rough and 28 Danger from Hurt Me Plenty, which is to say Hurt Me Plenty attempts to generate almost 50% more enemies, and so on paper will result in about 23% more experience from floor 2 than Hey, Not Too Rough.

In practical terms that number I just gave you will rarely be properly accurate because Danger per-floor is effectively somewhat random due to Danger being able to over-draw, and because Vaults generating can inject a bunch of experience at random without regard for the Danger formula, but it's still a useful illustration of how More Enemies=More Experience.

Also worth mentioning is that there's two breakpoints that have a particularly pronounced impact on the experience curve of the earlier portion of the run, in that enemies have minimum floors defined, but their minimum floors get changed as you go up in difficulty. Specifically...

I'm Too Young To Die: No modifier.
Hey, Not Too Rough: -3 to minimum floor
Hurt Me Plenty: -3 to minimum floor
Ultraviolence: -6 to minimum floor
Nightmare!: -6 to minimum floor

This is important, because enemies who spawn later generally have a better ratio of Danger to experience payout. For example, a Former Human costs 1 Danger and gives 23 experience when killed: 23 experience per Danger. Barons of Hell have a base floor of 12 and so can't show up until halfway through Deimos on I'm Too Young To Die, and cost 10 Danger and give 320 experience when killed, meaning they give 32 experience per Danger: thus, on Ultraviolence you can get a Baron as early as floor 6, and if this happens they're giving about 40% more experience than their metaphorical weight in Former Humans!

Special Level layouts aren't affected by this per se, but in practice tend to reflect these notions anyway, though with a bit more gradation. ie earlier I mentioned that Hell's Arena has the final wave as two Hell Knights on Hurt Me Plenty and two Barons of Hell on Ultraviolence: as Hell Knights give 128 experience per head vs Barons of Hell giving 320 experience per head, this is more than doubling the experience acquired from that final wave! (It is in fact exactly 2.5 times as much experience)

Oh, and Nightmare doubling all experience is important but a bit misleading because it's a mode that makes it really hard to full-clear floors, and in fact pressures the player to hurry through floors and flee with them only partially cleared. Doubled experience is enough you absolutely do gain experience even faster than on Ultraviolence even if you're regularly bailing with a good fraction of enemies never killed, but unless you're the kind of player who can full-clear Nightmare! on a reliable basis, the effect isn't quite as dramatic as the raw numbers suggest.

But before I start getting into such special difficulty effects, have one final table:

I'm Too Young To Die: *0.5
Hey, Not Too Rough: *1
Hurt Me Plenty: *1.5
Ultraviolence: *2
Nightmare!: *4

That's the modifier to your final score, determining where your Doomguy ends up in comparison to other Doomguys when the run is over. I don't care about score enough to dig into it and explain it to readers, but I will point out that the most dramatic modifiers jumps are at the bottom and top: it is in fact pretty normal to have Hey, Not Too Rough runs that fail score better than completed I'm Too Young To Die runs, and same for failed Nightmare! runs pretty readily out-scoring successful runs of lower difficulties.

As for special stuff... well, I'm not going to get into Special Levels broadly, so outside that all that's left is covering special behavior on the bottom and top difficulties, because they both have a fair amount of additional changes.

I'm Too Young To Die has five special distinctions: firstly, stairs for Hell's Armory/Deimos Lab, The Vaults/House of Pain, Unholy Cathedral, and The Mortuary/Limbo will simply not spawn. Second, Acid and Lava on the floor have their base damage halved. (So 3 for Acid and 6 for Lava instead of 6 for Acid and 12 for Lava) Third, Powerup effects last twice as long. Fourth, several healing effects are twice as powerful. (In practice this only affects Small Medpacks, Small Health Globes, Large Health Globes if high on HP already, and Large Medpacks if running the Marine's Survivalist Mastery: everything else either sets to 100% or sets to 200% HP, which this does not affect) Fifth, Angel Challenges are forbidden from selecting it.

Nightmare also has five special distinctions: first, Powerup effects once again last twice as long. Second, several healing effects are once again twice as powerful!

The third and fourth distinctions require a bit more explanation.

Third is that enemy attack chance is increased by 50%. (Capping at a maximum of 90%) That is, in Doom Roguelike, one aspect to how enemies behave is that each turn that they (think they) have a clear line of fire on Doomguy and are at least one tile away from him (And no other behavior that gets priority is relevant), they roll a metaphorical die to determine whether they will actually make that attack, or if they will spend their turn moving instead. This value varies based on enemy type (Though at least historically every enemy had at least 40% for the base and at most 75%), and then Nightmare! difficulty takes a given enemy's percent chance to attack and increases it by 50%. (ie an enemy with a 40% chance to attack would rise to a 60% chance to attack) This does a lot to increase the pressure on the player if you're not really diligent about fighting in ways that minimize opportunities for enemies to perform ranged attacks. Though while I'm on this topic I should emphasize that melee attacks do not involve this random factor: if an enemy is in melee range of Doomguy, it will throw a punch unless it has one of certain special AIs I'll talk about as we get to them.

Fourth is Nightmare! difficulty's most obvious feature: enemies spontaneously self-reviving!

Broadly speaking, this works like an Archvile's revive: there must be a corpse, which means enemies who don't leave corpses can't revive, enemies who don't leave legible corpses can't revive (ie Archviles and Nightmare Archviles stay dead even though they technically leave behind corpses), and corpses being destroyed or prevented from spawning in the first place all ensure a given enemy won't revive. This also includes that revived enemies can drop loot anew, but won't give up additional experience when killed.

That said, the details are different, not just in terms of 'no Archvile is needed', but also in terms of non-obvious mechanical details.

First of all, the check for corpses to revive occurs globally every 10 game seconds. Thus, if a corpse revives, there is always 10 seconds before any other corpses revive, and having multiple corpses revive simultaneously is possible and in fact normal.

Second, the check has two layers: a global layer, and a local layer. The global layer starts from a 20% chance to pass, and rises by 1% each time the check if performed on a given floor. (ie after 800 game seconds have passed on a floor, the global check always succeeds) If the global layer fails, nothing revives anywhere on the floor, full stop. As such, while enemies can technically revive all the way to your earliest time on the floor, in actuality if you kill an enemy right after descending it's very surprising if they then revive at the first 10-second check. To the point that you should probably just assume an Archvile is nearby if it happens, honestly.

The local layer to the check is individual to each corpse, and starts from a 10% chance of success. Every 100 seconds that passes on a floor raises this check's chance of success by 1%, applied globally. (That is, it's not 'for every 100 seconds a corpse exists, its odds go up', it's 'for every 100 seconds Doomguy is on the floor, all revive chances go up') So if you spend 900 game seconds on a floor, every corpse will always revive on the 10-second mark.

Altogether, this pressures one toward one of two basic ways to play: either you move quickly through floors, scooping up what you can opportunistically and leaving without fully exploring most floors so you can get out before the dead become so restless you can't get a moment's peace...

... or you carefully make sure every single corpse is destroyed, preferably immediately if you don't intend to harvest that enemy for ammo. This means luring enemies on top of existing corpses (Corpses replace each other, effectively destroying whatever corpse was previously in a tile), on top of stairs, into doors, onto water/Acid/Lava, and making liberal use of explosives, Skull items, and Plasma-damage Shotguns to annihilate corpses.

This latter scenario is doable, but not an experience I recommend. When I was first drawing up these drafts a decade ago, there was a video out there of a guy 100%ing a Nightmare! run, which stuck with me because it's six hours long. I'm a bit slow with my Ultraviolence runs and usually complete them in about 2 hours. This took three times my Ultraviolence speed. Yikes!

Like, if you think that sounds fun, go right ahead, but I suspect most people would find it tedious and stressful, not enjoyable.

Oh, and the self-revival causes Nightmare!'s fifth point of distinction: Doomguy never 'feels relatively safe now', not even if every enemy is dead with no corpses about. As of 0.9.9.8, an unfortunate side effect of this is that the game never reveals all items on the floor, even if everything is dead.

And... thar's it for difficulty effects!

Aside that I feel I should note that the wiki spent years claiming Nightmare! also increased all enemy speed by 10%, which did not seem to be true in 0.9.9.7 and isn't true in 0.9.9.8. Thankfully it no longer claims this, but I'd rather not have people who read that page months or years ago going 'you forgot the speed thing!'

--------------------------------------------------

Next time, we get started on enemies, starting with the enemy you normally see first in a run: Former Humans.

See you then.

Comments

Popular Posts