Live preview (JavaScript)
The loop is played live in your browser from the validated loop table (the same data the reference render below was made from); the badge on the player is its self-test (seam + motion probes). The pre-rendered reference follows.
COB-exact: timeline 1:1 from armcbomb.cob (gait + aim/fire (COB VM), disassembled with _cob_dis.py). StateChg staged-deploy family: 2 open stages, then the compiled close order — not a reversed activate. Fire/hit/death/smoke scripts are engine-driven or firing-only and not part of this loop.
Animation

PNG frames

Frame 0 / 1970.00 s
COB timeline (ARMCBOMB.COB)
- 0.00–0.00 s — Rest pose (the seam pose — both window ends settle here)
- 0.00–4.60 s — StartMoving() — the compiled staged open (from the rest pose into the working stance)
- 4.60–5.12 s — AimPrimary + 4 x FirePrimary (ARM_CARPET_BOMB, 90 ms) — at the COB aim speeds, shots on that weapon's reload grid — the fire script is a plain wait, the weapon effect is engine-side
- 5.12–8.77 s — AimSecondary + 2 x FireSecondary (HUNTER_MISSILE, 3400 ms) — at the COB aim speeds, shots on that weapon's reload grid — the fire script is a plain wait, the weapon effect is engine-side
- 8.77–12.42 s — AimTertiary + 2 x FireTertiary (HUNTER_MISSILE, 3400 ms) — at the COB aim speeds, shots on that weapon's reload grid — the fire script is a plain wait, the weapon effect is engine-side
- 12.42–12.42 s — Close: Aim(0, 0) calls the engine would send next — back to the rest aim (engine pacing sleeps stay out)
- 12.42–15.82 s — StopMoving() — the compiled staged close back to the rest stance
Every stage duration equals its COB sleep exactly; values are raw COB units (turns: BAM 65536 = 360°, moves: elmo × 163840). Renderer conversions follow the proven family conventions (_cob_anim.py).