alright I finally figured out the needed code to get the duds working

It was close to what I posted above
Now there is something else odd for the duds. Once the game decides that the torpedo impact angle falls within a min, max defined set then it goes to calculate the dud % chance. Now how it does it makes no sense:
(these are notes from my debugger)
Gets a random value to compare with torpedo random chance of being a dud
Load the random % chance of being a dud (as defined in sim file) into XMM1
Multiply the % chance of being a dud (XMM1) by 0.4544053 (what is this constant and why is it needed?)
Multiply that result (XMM1) by 0.1507767 (what is this constant and why is it needed?)
Multiply that result (XMM1) by 1.0 (what is this constant and why is it needed?)
converts a signed doubleword from EAX to a single-precision FP value in the low doubleword of the destination operand. The upper 3 doublewords are left unchanged. Stores in XMM0
Multiplies XMM0 by a constant of 0.003051851 (what is this constant and why is it needed?)
compares the low-order single-precision FP values in XMM1 and XMM0. ZF, PF, and CF are set according to the result. OF, AF, and AF are cleared. The unordered result is returned if either source is a NaN (QNaN or SNaN).
Result of this check. If before then torpedo impact, if after then dud (always before thus torpedo impact instead of dud!)
So now I'm trying to figure out what these constants are and why they are needed. A dud should be a dud right? I mean if the game says torpedo impact angle falls within min,max values it should retrieve the % chance of dud and get a random value. Compare the two values. If % chance <= random value then dud, if not then torpedo impact