Weapon table (weapon_table_init)¶
Status: In progress
Weapon stats are initialized in weapon_table_init (FUN_004519b0) and stored
in a fixed‑stride table. The accessor weapon_table_entry (FUN_0041fc60)
returns a pointer to the name buffer at the start of each entry:
0x1f is a count of u32 slots, so the stride is 0x7c bytes per entry.
Entry 0 is a dummy (none); weapon id 1 (Pistol) starts at entry 1.
Note: the returned pointer is not the first field of the entry.
There is a 4‑byte field at offset -0x04 (weapon_ammo_class / DAT_004d7a28)
that is indexed with the same stride.
Offsets (relative to entry base)¶
All offsets below are in bytes, relative to the pointer returned by
FUN_0041fc60.
| Offset | Type | Meaning | Evidence |
|---|---|---|---|
-0x04 |
int | Ammo class / HUD indicator | Used to choose ui_ui_ind* icons in the HUD: 0=bullet, 1=fire, 2=rocket, else electric. |
0x00 |
char[0x40] | Weapon name | String is copied inline during weapon_table_init and rendered in the HUD weapon list via FUN_0041c4b0. |
0x40 |
byte | Unlocked/available flag | FUN_00452e40 clears the table then marks unlocked weapons; FUN_00452cd0 skips entries with 0. |
0x44 |
int | Clip size | Copied into player_clip_size (DAT_00490b74) on weapon swap and used to reset player_ammo (DAT_00490b7c). |
0x48 |
float | Shot cooldown | Copied into player_shot_cooldown (DAT_00490b84) after firing in player_fire_weapon. |
0x4c |
float | Reload time | Loaded into player_reload_timer (DAT_00490b80) in player_start_reload (scaled by perks). |
0x50 |
float | Spread / heat increment | Added to player_spread_heat (DAT_00490b68) after each shot (scaled by perks). |
0x58 |
int | Shot SFX base id | Used with 0x5c to pick a random fire SFX. |
0x5c |
int | Shot SFX variant count | rand % count + base in player_fire_weapon. |
0x60 |
int | Reload / equip SFX id | Played when a reload starts and when swapping to the weapon. |
0x64 |
int | HUD icon id | Passed into the HUD sprite selection (shifted by << 1). |
0x68 |
byte | Flags | Bit 0x1 triggers a muzzle flash / effect burst; bits 0x4/0x8 affect crosshair rendering. |
0x6c |
float | Projectile meta value | Copied into projectile entries on spawn (weapon_projectile_meta). |
0x70 |
float | Damage scale | Used in projectile hit damage computation (weapon_projectile_damage_scale). |
0x74 |
int | Pellet count | Number of pellets spawned in the spread fire path (weapon_projectile_pellet_count). |
Notes¶
- Runtime probe (2026-01-18) sample entry confirms indexing scheme:
weapon_id=2(Assault Rifle) resolved to entry index 2.-
Observed fields:
clip_size=25,shot_cooldown=0.117,reload_time=1.2,spread_heat=0.09,shot_sfx_base=34,shot_sfx_count=1,reload_sfx=35,hud_icon_id=1,flags=1,projectile_meta=50,damage_scale=1,pellet_count=1,ammo_class=0(from-0x04). -
UI text for weapons is pulled directly from the
weapon_tablename field (offset 0x00). Examples: - HUD (
ui_render_hud): passes&weapon_table + player_weapon_id * 0x1fintogrim_text_width/grim_text_draw(grim_interface_ptr + 0x14c/0x144), then draws the name. - End‑of‑game stats: uses
param_2 + 0x2b(most‑used weapon id) to index&weapon_table + id * 0x1ffor the “Most used weapon” label. - Quest completion: uses
quest_unlock_weapon_idviaweapon_table_entry()to render the unlocked weapon name. This meansui_itemTexts.jazis not the weapon list source; it’s used for menu labels. - Ammo class values (offset
-0x04):0bullet (ui_ui_indBullet.jaz),1fire (ui_ui_indFire.jaz),2rocket (ui_ui_indRocket.jaz),>= 3electric (ui_ui_indElectric.jaz). - Flag bits (offset
0x68):0x1spawn muzzle flash / shot burst effect (FUN_0042e120(0x12, ...)),0x4use the smaller crosshair size,0x8hide the crosshair entirely. - Pellet count (offset
0x74,weapon_projectile_pellet_count) is used by the Fire Bullets bonus to spawn multiple0x2dpellets per shot. - Several weapons bypass the main projectile pool and use particle or secondary
projectile pools instead (Plasma Rifle
0x9, HR Flamer0x10, Mini-Rocket Swarmers0x11, Seeker Rockets0x0d, Plasma Shotgun0x0e, Rocket Minigun0x12, Pulse Gun0x13, Rainbow Gun0x2b). - Secondary projectile type behavior and particle style ids are tracked in Effects pools.
- The alt-weapon swap stores per-player runtime state in parallel arrays:
player_alt_weapon_id(DAT_00490b8c),player_alt_clip_size(DAT_00490b90),player_alt_reload_active(DAT_00490b94),player_alt_ammo(DAT_00490b98),player_alt_reload_timer(DAT_00490b9c),player_alt_shot_cooldown(DAT_00490ba0), andplayer_alt_reload_timer_max(DAT_00490ba4). - The same stride is used by projectile metadata lookups (
weapon_projectile_meta,weapon_projectile_damage_scale) keyed by projectile type ids inprojectile_spawnandprojectile_update. - Many fields are only written in
FUN_004519b0; only a subset are referenced by symbol elsewhere (reload/spread/sfx/flags/damage).