With the SSG at least, random damage isn't as much as a factor as you make it out to be.
Code: Select all
>>> shots = std.seqMany(std.shoot, 1000000, 5, 20)
>>> std.mean(shots)
200.004425
>>> std.std(shots)
18.25494331460996
>>> std.deviations(shots)[1]
{1: 0.660833, 2: 0.961353, 3: 0.996687, 4: 0.999959, 5: 1.0}
As you can see from this, your average SSG blast will only go 18 damage off from the average. 96% of SSG blasts will do 163 and 237 damage (which with a freshly spawned dude is ALWAYS enough), and only 0.002% SSG blasts will do 109-127 damage. That is still enough to kill a fresh marine. If all pellets connect, a freshly-spawned player will ALWAYS die.
Code: Select all
>>> pellets10 = std.seqMany(std.shoot, 1000000, 5, 10)
>>> p10mean = std.mean(pellets10); print(p10mean)
100.015675
>>> p10std = std.std(pellets10); print(p10std)
12.913234656529246
>>> p10dev = std.deviations(pellets10)[1]; print(p10dev)
{1: 0.663214, 2: 0.969866, 3: 0.997725, 4: 1.0}
The standard deviation drops, as is expected - not by 50%, though, which shows that the spread is definitely widening. Not very much, though - 66% of your shots will do 87-113 damage. 97% will do 74-126 damage, and all of 0.23% of your shots will do 48-61 (actually 50-60) damage. Still, about half the time, 10 pellets won't do in a freshly-spawned marine - 14 pellets seems to be reliable enough to be legitimately surprised when it doesn't (99.7% chance of killing a fresh marine).
Basically, it's a very reliable and very potent killer at close range, and an unreliable piece of garbage at long range. We all knew that, though.
Spread is the main problem, not damage rolls. Whether a pellet hits or not is much more important than whether it rolls 5 or 15 damage. If anything should be made certain, it's how the pellets spread.
Edit: oh yeah I'll roll up some numbers using the Doom 'random' number generator in a bit
Edit2: Well, I rolled up some vanilla-style SSG blasts, and here's my results:
Code: Select all
>>> shots = std.seqMany(std.oldShoot, 1000000, 5, 20)
>>> sMean, sStd, sDev = std.mean(shots), std.std(shots), std.deviations(shots)[1]
>>> sMean, sStd, sDev
(207.03125, 18.889455350472655, {1: 0.59375, 2: 0.984375, 3: 1.0})
>>> for i, key in enumerate(sorted(counts[0]) ):
... print("{}: {: <6} {: >5}%".format(key, counts[0][key],
... round(counts[1][key]*100, 2)), end=" ")
... if (i+1)%4 == 0:
... print()
... else:
... if (i+1)%4:
... print()
...
170: 15625 1.56% 180: 62500 6.25% 185: 109375 10.94% 190: 109375 10.94%
195: 62500 6.25% 200: 78125 7.81% 205: 125000 12.5% 210: 46875 4.69%
215: 78125 7.81% 220: 46875 4.69% 225: 46875 4.69% 230: 109375 10.94%
235: 62500 6.25% 240: 31250 3.12% 245: 15625 1.56%
>>> std.percWithin(shots, hi=199)
0.359375
>>> std.percWithin(shots, lo=200)
0.640625
The standard deviation isn't too terribly different, and the mean went up a bit... but notice how the range got tightened so that it all fits within a 75 damage range (and skewed towards the high end)? Switching to the old RNG actually makes the randomness a less important factor for hitscans!
Okay final edit I promise: Then again, the Skulltag SSG does feel like a frickin' pop gun, so who knows.