@@ -277,12 +277,13 @@ const yaamFormula = (
277277 return `${ minDamage } -${ maxDamage } ` ;
278278} ;
279279
280- // Glovz Damage Fix v5 formula (from sfall DamageMod.cpp)
281- // calcDT = armorDT / ammoY (ammo divisor)
282- // calcDR = (armorDR + ammoDRM) / ammoX (ammo multiplier)
283- // rawDamage = baseDamage - calcDT
284- // resistedDamage = calcDR * rawDamage / 100
285- // rawDamage = (rawDamage - resistedDamage) * multiplyDamage / 2
280+ // Glovz Damage Fix v5.1 formula (from sfall DamageMod.cpp)
281+ // Uses DivRound (round half to even) for intermediate calculations
282+ // calcDT = DivRound(armorDT, ammoY)
283+ // calcDR = DivRound(armorDR + ammoDRM, ammoX)
284+ // resistedDamage = DivRound(calcDR * rawDamage, 100)
285+ // Bonus damage to unarmored (DT<=0 && DR<=0): FMJ +15%, JHP +20%, AP +10%
286+ // v5.1 tweak: rawDamage += DivRound(rawDamage * multiplyDamage * 25, 100)
286287// Critical: multiplyDamage = 6 instead of 2, armor bypass (DR and DT to 20%)
287288// Penetrate: DT to 20% (not cumulative with critical)
288289// Normal difficulty (100), no perks
@@ -313,10 +314,12 @@ const glovzFormula = (
313314 }
314315
315316 // ammoY = divisor (dmg_div)
316- // ammoX = multiplier (dmg_mult / dmg_div )
317+ // ammoX = multiplier (dmg_mult)
317318 // ammoDRM = dr_mod (if positive, flip to negative)
318- const ammoY = ammo . dmg_div ;
319- const ammoX = ammo . dmg_mult / ammo . dmg_div ;
319+ let ammoY = ammo . dmg_div ;
320+ if ( ammoY <= 0 ) ammoY = 1 ;
321+ let ammoX = ammo . dmg_mult ;
322+ if ( ammoX <= 0 ) ammoX = 1 ;
320323 let ammoDRM = ammo . dr_mod ;
321324 if ( ammoDRM > 0 ) ammoDRM = - ammoDRM ;
322325
@@ -346,9 +349,24 @@ const glovzFormula = (
346349 if ( rawDamage <= 0 ) return 0 ;
347350 }
348351
352+ // Bonus damage to unarmored target
353+ if ( armorDT <= 0 && armorDR <= 0 ) {
354+ if ( ammoX > 1 && ammoY > 1 ) {
355+ // FMJ/high-end: +15%
356+ rawDamage += divRound ( rawDamage * 15 , 100 ) ;
357+ } else if ( ammoX > 1 ) {
358+ // JHP: +20%
359+ rawDamage += divRound ( rawDamage * 20 , 100 ) ;
360+ } else if ( ammoY > 1 ) {
361+ // AP: +10%
362+ rawDamage += divRound ( rawDamage * 10 , 100 ) ;
363+ }
364+ }
365+
349366 // multiplyDamage: 6 for single crit, 4 for burst crit, 2 for non-critical
367+ // v5.1 tweak: rawDamage += DivRound(rawDamage * multiplyDamage * 25, 100)
350368 const multiplyDamage = effectiveCritical ? ( burst ? 4 : 6 ) : 2 ;
351- rawDamage = Math . floor ( ( rawDamage * multiplyDamage ) / 2 ) ;
369+ rawDamage += divRound ( rawDamage * multiplyDamage * 25 , 100 ) ;
352370
353371 return Math . max ( 0 , rawDamage ) ;
354372 } ;
0 commit comments