v0.13: unchanged firing/visual behavior; the v0.12 audit below is retained as baseline evidence.

SHOGO v0.12 FIRING TIMING AUDIT

Reference: original installed Models/PV_Weapons/*.ABC animation lengths and
FIRE_KEY timestamps; original WeaponModel.cpp firing/reload state machine;
Shared/WeaponDefs.h GetShotsPerClip. Times below are seconds.

Fire/Fire2 are the complete animation cycle, not just the delay to the shot.
Reload is added after the complete final firing animation of a magazine.
Laser has an unused reload animation but no finite magazine in the source.

SColt45: Fire=0.140, Fire2=0.160, Reload=1.966
  fire shot/contact keys: 0.028
  fire2 shot/contact keys: 0.053
SShotgun: Fire=1.133, Fire2=1.133, Reload=0.000
  fire shot/contact keys: 0.000
SMachineGun: Fire=0.090, Fire2=0.090, Reload=0.800
  fire shot/contact keys: 0.090
SAssaultRifle: Fire=0.100, Fire2=0.100, Reload=0.800
  fire shot/contact keys: 0.100
  fire_zoom shot/contact keys: 0.000, 0.125, 0.250
  Scoped cycle=0.800
SEnergyGrenade: Fire=1.100, Fire2=1.100, Reload=0.000
  fire shot/contact keys: 0.000
SKatoGrenade: Fire=1.100, Fire2=1.100, Reload=0.000
  fire shot/contact keys: 0.000
STOW: Fire=0.400, Fire2=0.400, Reload=2.025
  fire shot/contact keys: 0.225
STanto: Fire=0.600, Fire2=0.600, Reload=0.000
  fire shot/contact keys: 0.400
SSqueakyToy: Fire=0.966, Fire2=0.966, Reload=0.000
  fire shot/contact keys: 0.000
MPulseRifle: Fire=0.285, Fire2=0.285, Reload=0.800
  fire shot/contact keys: 0.045
MLaserCannon: Fire=0.300, Fire2=0.300, Reload=1.500
  fire shot/contact keys: 0.078
MSpider: Fire=0.933, Fire2=0.933, Reload=0.000
  fire shot/contact keys: 0.133
MBullgut: Fire=1.333, Fire2=1.333, Reload=0.000
  fire shot/contact keys: 0.100, 0.200, 0.299, 0.399
MSniperRifle: Fire=0.150, Fire2=0.150, Reload=0.000
  fire shot/contact keys: 0.000
  fire2 shot/contact keys: 0.000
  fire_zoom shot/contact keys: 0.000
  Scoped cycle=1.000
MJuggernaut: Fire=1.000, Fire2=1.000, Reload=0.000
  fire shot/contact keys: 0.000
MShredder: Fire=0.400, Fire2=0.400, Reload=0.000
  fire shot/contact keys: 0.067
MRedRiot: Fire=1.800, Fire2=1.800, Reload=0.000
  fire shot/contact keys: 1.070
MBeamSword: Fire=0.900, Fire2=0.900, Reload=0.000
  fire shot/contact keys: 0.427
  fire2 shot/contact keys: 0.426
  fire3 shot/contact keys: 0.372, 0.745
  Third attack cycle=1.200

FIX: UT99 could leave a weapon on its static pickup mesh, which has no
Fire/Reload sequence. FinishAnim then failed to enforce the cycle. A baseline
held-fire test reproduced TOW intervals near 0.22 s instead of 2.425 s.
Weapons now select their animated hand mesh before firing, including Hidden.
Explicit clocks enforce the source fire and reload lengths independently
of mesh rendering. Client prediction also rejects premature AnimEnd events
and can complete its clock when an animation callback is unavailable.
Reload uses no added UT99 tween delay, matching the source animation change.
No blanket rate multiplier or damage change was applied.

FRESH VALIDATION: 40 engine scenarios, 149 shot/contact events, 458 checks.
Each interval compared with independently read original ABC keyframes.
Includes held fire, magazine boundaries, short bursts and mesh removal.
Server tick quantization and baked animation endpoints cause small timing
differences. Acceptance: up to 0.035 s early / 0.075 s late per event interval.
Unzoomed sniper remains 0.150 s; zoomed sniper is 1.000 s. Human scoped AR
retains 0.125 s burst spacing within an 0.800 s cycle. TOW is 0.400 s Fire
plus 2.025 s Reload. Sword retains the requested three-attack combo.

USER ARCHIVE CROSS-CHECK:
ShogoSource.zip, AEGISCODE.zip and lithtech-master.zip each agree with the
reference PlayFireAnimation, PlayReloadAnimation and UpdateFiring logic
after normalizing renamed engine types/constants: nine comparisons.
shogo_sourcecode22.zip and shogsrc22.zip are identical InstallShield bundles.
Their installers were not executed or their packaged data.z code inspected.
The installed weapon models provide the actual numeric timing values.
Tools/demo/renderer/later Jupiter archives were not needed for this fix.
