@@ -323,6 +323,15 @@ private static int ReadBE(byte[] data, int offset)
323323 ? ( data [ offset ] << 24 ) | ( data [ offset + 1 ] << 16 ) | ( data [ offset + 2 ] << 8 ) | data [ offset + 3 ]
324324 : - 1 ;
325325
326+ /// <summary>Big-endian (PS3) float read; returns 0 if out of range.</summary>
327+ private static float ReadBEFloat ( byte [ ] data , int offset )
328+ {
329+ int bits = ReadBE ( data , offset ) ;
330+ return bits == - 1 && ! ( data != null && offset >= 0 && offset + 4 <= data . Length )
331+ ? 0f
332+ : BitConverter . Int32BitsToSingle ( bits ) ;
333+ }
334+
326335 // Authoritative IW4 enum value lists (weapType_t / weapClass_t from OpenAssetTools; the
327336 // rest are the standard IW4 lineage enums). The WeaponDef's enum cluster is the 8-int block
328337 // the reader stores as PlayerAnimTypeThroughStance: [0]=playerAnimType, [1]=weapType,
@@ -352,6 +361,11 @@ private static int ReadBE(byte[] data, int offset)
352361 private const int WeaponDefDamage = 0x230 ;
353362 private const int WeaponDefPlayerDamage = 0x234 ;
354363 private const int WeaponDefMeleeDamage = 0x238 ;
364+ // Damage falloff (offsets need typed struct sizing — shorts/bools shift the later region).
365+ private const int WeaponDefMinDamage = 0x598 ;
366+ private const int WeaponDefMinPlayerDamage = 0x59C ;
367+ private const int WeaponDefMaxDamageRange = 0x5A0 ;
368+ private const int WeaponDefMinDamageRange = 0x5A4 ;
355369
356370 private static WeaponAsset ToWeaponAsset ( FastFileLib . Iw4 . WeaponVariantDef wp , byte [ ] zoneData )
357371 {
@@ -363,6 +377,8 @@ private static WeaponAsset ToWeaponAsset(FastFileLib.Iw4.WeaponVariantDef wp, by
363377 var def = wp . WeaponDefPtr is { IsResolved : true } ? wp . WeaponDefPtr . Result : null ;
364378
365379 int damage = - 1 , maxAmmo = - 1 , startAmmo = - 1 , shotCount = - 1 , playerDamage = - 1 , meleeDamage = - 1 ;
380+ int minDamage = - 1 , minPlayerDamage = - 1 ;
381+ float maxDamageRange = 0 , minDamageRange = 0 ;
366382 if ( def != null )
367383 {
368384 int b = def . Offset ;
@@ -372,6 +388,10 @@ private static WeaponAsset ToWeaponAsset(FastFileLib.Iw4.WeaponVariantDef wp, by
372388 maxAmmo = ReadBE ( zoneData , b + WeaponDefIMaxAmmo ) ;
373389 startAmmo = ReadBE ( zoneData , b + WeaponDefIStartAmmo ) ;
374390 shotCount = ReadBE ( zoneData , b + WeaponDefShotCount ) ;
391+ minDamage = ReadBE ( zoneData , b + WeaponDefMinDamage ) ;
392+ minPlayerDamage = ReadBE ( zoneData , b + WeaponDefMinPlayerDamage ) ;
393+ maxDamageRange = ReadBEFloat ( zoneData , b + WeaponDefMaxDamageRange ) ;
394+ minDamageRange = ReadBEFloat ( zoneData , b + WeaponDefMinDamageRange ) ;
375395 }
376396
377397 var weapon = new WeaponAsset
@@ -383,7 +403,7 @@ private static WeaponAsset ToWeaponAsset(FastFileLib.Iw4.WeaponVariantDef wp, by
383403 AdsTransInTime = wp . iAdsTransInTime ,
384404 AdsZoomFov = wp . fAdsZoomFov ,
385405 Damage = damage ,
386- MinDamage = - 1 ,
406+ MinDamage = minDamage ,
387407 MaxAmmo = maxAmmo ,
388408 StartOffset = wp . Offset ,
389409 EndOffset = 0 ,
@@ -420,8 +440,12 @@ private static WeaponAsset ToWeaponAsset(FastFileLib.Iw4.WeaponVariantDef wp, by
420440 d . Add ( ( "inventoryType" , weapon . InventoryName ) ) ;
421441 if ( def != null )
422442 {
423- d . Add ( ( "damage" , damage . ToString ( ) ) ) ;
424- d . Add ( ( "playerDamage" , playerDamage . ToString ( ) ) ) ;
443+ d . Add ( ( "damage (max)" , damage . ToString ( ) ) ) ;
444+ d . Add ( ( "minDamage" , minDamage . ToString ( ) ) ) ;
445+ d . Add ( ( "playerDamage (max)" , playerDamage . ToString ( ) ) ) ;
446+ d . Add ( ( "minPlayerDamage" , minPlayerDamage . ToString ( ) ) ) ;
447+ d . Add ( ( "maxDamageRange" , maxDamageRange . ToString ( "0.#" ) ) ) ;
448+ d . Add ( ( "minDamageRange" , minDamageRange . ToString ( "0.#" ) ) ) ;
425449 d . Add ( ( "meleeDamage" , meleeDamage . ToString ( ) ) ) ;
426450 d . Add ( ( "shotCount" , shotCount . ToString ( ) ) ) ;
427451 d . Add ( ( "startAmmo" , startAmmo . ToString ( ) ) ) ;
0 commit comments