Jump to content
Search In
  • More options...
Find results that contain...
Find results in...
Silikone

Shotgun minimum damage and RNG

Recommended Posts

So the shotgun's damage can vary a lot due to the randomness of each individual pellet, but as the RNG in Doom is very limited with its single byte array, the actual total damage is probably far higher than what would be the minimum had the RNG been perfect. If I am not mistaken, the engine would shift the array by one for each pellet in the shotgun and assign them damage calculated by the entry in the array, unless there are some things in between like trajectories.
With this in mind, it should be possible to determine what the lowest possible damage by one blast is. Any clues?

Share this post


Link to post

This histogram from doomwiki implies that the lowest damage is 45 (unless it was assuming even probability and just rendered somewhat imprecisely).

Anyway, the lowest damage could be calculated as the sum (modulo 3) of those 7 consequent numbers from vanilla Doom's PRNG table that together give the least sum (modulo 3).

Here is vanilla Doom's PRNG table, in case somebody felt like writing a program to calculate the least sum (modulo 3) of 7 consequent numbers from this sequence.

unsigned char rndtable[256] = {
    0,   8, 109, 220, 222, 241, 149, 107,  75, 248, 254, 140,  16,  66 ,
    74,  21, 211,  47,  80, 242, 154,  27, 205, 128, 161,  89,  77,  36 ,
    95, 110,  85,  48, 212, 140, 211, 249,  22,  79, 200,  50,  28, 188 ,
    52, 140, 202, 120,  68, 145,  62,  70, 184, 190,  91, 197, 152, 224 ,
    149, 104,  25, 178, 252, 182, 202, 182, 141, 197,   4,  81, 181, 242 ,
    145,  42,  39, 227, 156, 198, 225, 193, 219,  93, 122, 175, 249,   0 ,
    175, 143,  70, 239,  46, 246, 163,  53, 163, 109, 168, 135,   2, 235 ,
    25,  92,  20, 145, 138,  77,  69, 166,  78, 176, 173, 212, 166, 113 ,
    94, 161,  41,  50, 239,  49, 111, 164,  70,  60,   2,  37, 171,  75 ,
    136, 156,  11,  56,  42, 146, 138, 229,  73, 146,  77,  61,  98, 196 ,
    135, 106,  63, 197, 195,  86,  96, 203, 113, 101, 170, 247, 181, 113 ,
    80, 250, 108,   7, 255, 237, 129, 226,  79, 107, 112, 166, 103, 241 ,
    24, 223, 239, 120, 198,  58,  60,  82, 128,   3, 184,  66, 143, 224 ,
    145, 224,  81, 206, 163,  45,  63,  90, 168, 114,  59,  33, 159,  95 ,
    28, 139, 123,  98, 125, 196,  15,  70, 194, 253,  54,  14, 109, 226 ,
    71,  17, 161,  93, 186,  87, 244, 138,  20,  52, 123, 251,  26,  36 ,
    17,  46,  52, 231, 232,  76,  31, 221,  84,  37, 216, 165, 212, 106 ,
    197, 242,  98,  43,  39, 175, 254, 145, 190,  84, 118, 222, 187, 136 ,
    120, 163, 236, 249
};
EDIT: Apparently, it won't be as easy, because the engine takes a random number at least 2 more times between particular shotgun pellet shots (so, numbers in the hypothetical lowest-sum sequence wouldn't be consequent, but there would be gaps of 2 numbers between them), and may take it more times depending on what does the shotgun hit (which makes an unpredictable variation of gaps between the numbers that should count). So, if you were looking for the absolutely guaranteed minimum damage, it probably really is the theoretical minimum damage.

Share this post


Link to post
Maes said:

Here's an old post I made on the subject.

BTW, the minimum damage is indeed 45 HP or 50 HP depending on WHAT you hit, and not a simplistic 35 HP (7 x 5), so even the wiki is somewhat more refined than people usually think.

Very interesting.
But the 45 being for non-foes (or is it?) only makes it pointless, so why is it in the Doom wiki graph? when exactly are the different amount of calls made when you hit an ordinary enemy?

Share this post


Link to post
Silikone said:

Very interesting.
But the 45 being for non-foes (or is it?) only makes it pointless, so why is it in the Doom wiki graph? when exactly are the different amount of calls made when you hit an ordinary enemy?


Probably whoever did the wiki figures performed some of my and GhostlyDeath's analysis steps (probably just the base 3-call one) but not all of them. For actual enemies that you can actually hit, damage and kill, I think only the last 2 or 3 cases on the list are meaningful, so in practice the minimum damage to consider is 50 HP.

The exact rules are simplified in the wall of text I linked to. Apparently even factors like being higher than your target matter.

Share this post


Link to post
Maes said:

The exact rules are simplified in the wall of text I linked to. Apparently even factors like being higher than your target matter.

If that's the case, I wonder if a schutzstaffel can survive a point blank shot.

Share this post


Link to post

I made a small program and can confirm that I get the same results with the set amount of calls.
It should be easy to check how many calls are actually made in-game. Compare the RNG index inside the A_FireShotgun function before and after each P_GunShot call, and then dump those numbers somewhere. I'd try it, but I don't know how to set up Linux Doom, and I don't know if a nice sourceport like Zdoom follows the same RNG rules.

Share this post


Link to post

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×