COB-exact: timeline 1:1 from ARMFLAK.COB (rev31.gp3, the 3.1 balance). twin flak barrels ALTERNATE (static0 toggle): snap recoil, 150 ms flash window, slow return; the turret yaws +45° and pitches +20° up before the salvo.
Animation

PNG frames

Frame 0 / 740.00 s
COB timeline (ARMFLAK.COB)
- 0.00–0.40 s — rest pose (Create: both flares hidden)
- 0.40–0.46 s — AimPrimary(+45°, +20°): Xturret y at 700°/s, YTurret x at 550°/s (target = 0−pitch) — both concurrent,
wait-for-turn - 1.20–3.72 s — 4-shot salvo paced by the weapon's 0.7 s reload (
Weapon1=CORFLAK_GUN— both flaks fire the same weapon def): barrels alternate 1-2-1-2 (thestatic0toggle), recoil 4 elmo snap + 267 ms return at 15 elmo/s, flash window 150 ms — the ARM flare1/flare2 are EMPTY anchors (1 vertex, 0 prims), so the muzzle flash is an engine effect that cannot be rendered - 4.20–4.26 s — AimPrimary(0, 0) back to rest. This COB has NO RestoreAfterDelay — the turret stays aimed; the loop's closing aim call is exactly what the engine would send next.
SmokeUnit (damage smoke), Killed (death explosions), RockUnit-style hooks are engine-driven with values from outside — not part of this loop. QueryPrimary returns the ready barrel (static0 = the ready barrel).