This version (2017/11/17 12:21) was approved by stohrendorf.The Previously approved version (2017/06/11 22:35) is available.Diff

CUTSEQ file format (TR4-TR5)

Original reverse-engineering work by sapper


The CUTSEQ.BIN file is a file containing information about all the engine-rendered cutscenes (as opposite to FMVs, which are pre-rendered videos). In TR4, this file is compressed and contained in a PAK file, and the resulting file is called CUTSEQ.PAK. In TR5, like many other things (e.g. level files), the file is not compressed, and is called CUTSEQ.BIN.


struct Cutseq
    uint8_t header[8]; // "(C) DEL!", for Derek Leigh-Gilchrist
    CutsceneHeader cutscenes[N]; // N = 30 for TR4, 44 for TR5, 4 for Times Demo
    uint8_t padding[]; // Empty space between header and data
    uint8_t cutsceneData[];
struct CutsceneHeader // 8 bytes
    uint32_t offset; // Offset relative to start of file
    uint32_t size; // Size in bytes
struct CutsceneData
    uint16_t numActors; // Actor 1 is always Lara (slot ID 0)
    uint16_t numFrames;
    int32_t originX; // Origin coordinates are in TR world coordinates
    int32_t originY; // Negative Y is up
    int32_t originZ;
    int32_t audioTrackIndex; // -1 means no audio track
    uint32_t cameraDataOffset;
    ActorSlotHeader actors[numActors];
    CameraData cameraData;
    uint8_t padding[];
    uint8_t actorData[];
    uint8_t padding[];
struct ActorSlotHeader // 8 bytes
    uint32_t dataOffset;
    uint16_t slotNumber; // TR model slot ID number
    uint16_t numNodes; // Same as number of meshes in model
struct CameraData
    PositionHeader targetHeader;
    PositionHeader cameraHeader;
    PackedCoord targetPosition;
    PackedCoord cameraPosition;
struct ActorData
    MeshHeader meshes[NumNodes];
    MeshData meshData[NumNodes];
struct MeshData
    PackedCoord positionData;
    PackedCoord rotationData;
struct PositionHeader // 14 bytes
     int16_t startX;
     int16_t startY;
     int16_t startZ;
    uint16_t axisBitsizes; // X = bits 14-11, Y = 9-6, Z = 4-1
    uint16_t numValuesX;
    uint16_t numValuesY;
    uint16_t numValuesZ;
struct RotationHeader // 14 bytes
    // 1024 = 360 degrees
    int16_t startX;
    int16_t startY;
    int16_t startZ;
    uint16_t axisBitsizes; // X = bits 14-11, Y = 9-6, Z = 4-1
    uint16_t numValuesX;
    uint16_t numValuesY;
    uint16_t numValuesZ;
struct PackedCoord // (variable length)
    dynamic xAxis; // todo: explain better
    dynamic yAxis; // core design, why did you make this
    dynamic zAxis;


In TR4 CUTSEQ.PAK, DEL (Derek Leigh-Gilchrist) left a hidden message in the first Padding section:

Cutseq.JIZ , Compiled by Del using the one and only 'ASMLE.EXE'
Ok, I`ve got about 1.5k of padding here, so enjoy my ramblings...
Keep your greasy mits off my packed data...
Greets to...
Alex,Damon,Rich,Charlie,Jon,Dan,Dude,Martin,Jens,DaveS,DaveM,ZeoGrad and all the usual...
Tombraider IV Delta-Packed Animation Data (C) 1999 Core Design.
Sector padded for hotness...
dc.w num_actors
dc.w num_frames
dc.l orgx,orgy,orgz
dc.l audio_track
dc.l packed_camera_data_offset
dc.l packed_actor_data_offset
dc.w object_slot
dc.w num_nodes
nice eh?
hack away my friends...
Developer Credits:
Coding: Del,Gibby,Chris,Rich & Tom
Delta Compressor: MJ
Animation: Jerr
Art: Jibber,Pete,Phil,Andy,Rich,Jamie
Sound: Pete
FMV: Pete,Dave and some others...
Thanks to...
PsyQ,SCEE,MartinJ and the GNU people...
Don`t forget, ** PC-Engine RULES **
BTW people, 30% of the entire game is MIPS.
The rest is 'C' , but luckily GNU isn`t as dry as it used to be...
Some decent(ish) links:
Special greet to my baby girl Abigail, and my Wife(?) Caroline...
See you in TR5.... bwhahahah

TR5 CUTSEQ.BIN also contains a message:

'cutseq.asm' Compiled by Del - 18:08:53 Thursday 26th of October 2000
trs/cutseq.txt · Last modified: 2017/11/17 12:21 by stohrendorf
Back to top
CC Attribution-Share Alike 4.0 International
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0