This version is outdated by a newer approved version.This version (2017/06/11 20:35) was approved by zdimension.The Previously approved version (2017/03/25 19:31) is available.
This is an old revision of the document!
Table of Contents
CUTSEQ file format (TR4-TR5)
Original reverse-engineering work by sapper
Overview
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
.
Layout
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; }
Notes
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... Format: 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... NUDE CHEAT ALERT... NUDE CHEAT ALERT... maybe... EMAIL: del@nlights.demon.co.uk OR del@core-design.com 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: http://www.nlights.demon.co.uk http://www.core-design.com http://www.hu6280.com http://www.geeknews.com http://www.hotmail.com http://www.hitbox.com http://www.tombraider.com http://www.ign64.com http://www.rareware.com http://www.eidos.com 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