.SYN in IGI 2 -- Audio & Physics Timelines

1. Architectural Role & Engine Purpose

The SYN (Synchronized Cutscene Timeline) format orchestrates in-engine cinematic sequences, choreographed helicopter insertions, character dialogue lip-sync, and camera fly-through splines in I.G.I. 2: Covert Strike.

SYN files act as a multi-track director's timeline, synchronizing multiple actors, camera paths, facial speech audio files, and script event triggers against a master millisecond clock.

2. Binary File Layout & Memory Map Diagram

A SYN file organizes timeline keyframes, camera Bezier splines, and audio cue triggers:

IGI 2 SYN — CINEMATIC CUTSCENE TIMELINE LAYOUT 0x00: Timeline Master Header (24 Bytes) 24 BYTES Magic "SYN2" | Version | Duration ms (float) | Track Count | Camera Node Count | Event Count magic[4], version, duration_ms, track_count, camera_nodes, event_count Camera Bezier Spline Track (36 Bytes per Keyframe) 36B CAMERA Time Offset (ms) | Camera Eye Position XYZ (float[3]) | LookAt Target XYZ (float[3]) | Field of View FOV (float) | Roll Angle Continuous smooth cinematic camera motions for helicopter insertions Choreography & Dialogue Synchronizer Tracks EVENTS Synchronized character animation triggers (.IFF), spoken dialogue audio cues (.WAV), and subtitle events Synchronized to millisecond master clock

3. Cutscene Director Execution Pipeline Diagram

During cinematic playback, the cutscene director interpolates cameras and synchronizes speech:

IGI 2 SYN — CUTSCENE DIRECTOR & CAMERA SPLINE PIPELINE 1. MASTER CLOCK • Cutscene Clock Advance • TimeMS += DeltaTime • Check Active Sequence 2. CAMERA SPLINE • Interpolate Eye Vector • Interpolate Target Vector • Update FOV & View Matrix 3. EVENT SCAN • Scan Timeline Triggers • Trigger.Time <= Current • Fire Animation / Speech 4. DIRECTING PASS • Play Voice Audio • Display Subtitle OSD • Helicopter Insertion

4. C++ Struct Definitions

#pragma pack(push, 1)
struct SynHeader {
    char     magic[4];       // "SYN2"
    uint32_t version;        // 2
    float    duration_ms;    // Sequence length in milliseconds
    uint32_t track_count;    // Number of parallel tracks
    uint32_t camera_nodes;   // Camera spline keyframe count
    uint32_t event_count;    // Audio and script event triggers
};

struct SynCameraNode {
    float    time_ms;        // Time offset in milliseconds
    float    eye[3];         // Camera position XYZ
    float    target[3];      // Camera look-at target XYZ
    float    fov;            // Field of view angle (degrees)
    float    roll;           // Camera roll angle
};
static_assert(sizeof(SynCameraNode) == 36, "SynCameraNode must be 36 bytes");
#pragma pack(pop)