Skip to content

Commit 34b814a

Browse files
committed
Read BE floats; add min/max damage fields
Add a ReadBEFloat helper for big-endian (PS3) float reads with bounds checking, using BitConverter.Int32BitsToSingle. Introduce new WeaponDef offsets for damage falloff (MinDamage, MinPlayerDamage, MaxDamageRange, MinDamageRange), read them in ToWeaponAsset, and populate WeaponAsset.MinDamage and related local variables. Update the debug/metadata dictionary keys to expose max/min damage, player damage, and damage range values.
1 parent e22239a commit 34b814a

1 file changed

Lines changed: 27 additions & 3 deletions

File tree

Call of Duty FastFile Editor/Services/Iw4AssetBridge.cs

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)