File Formats/RFL

Overall structure
An RFL file begins with a short header, and the rest of the file is divided into sections. Each section has its own header to specify the type and size of the section. Because of this, complete knowledge of all section formats is not required to parse an RFL -- unknown sections can be skipped over easily.

All numeric values are little-endian

For numeric values, -1 often represents an "undefined" value

Some "unsigned" values are actually treated as signed by RED - unsigned is specified here as RED will encounter other problems before the value gets large enough for signed/unsigned to matter

All floats are 32-bit

Data types
A breakdown of the non-obvious data types in use in an RFL:
 * bool - one byte, 1 = true, 0 = false
 * RFLstring - uint16 to specify length, followed by the string
 * RFLposition - three floats in a row, X Y Z
 * RFLvertex - uint32 index, float U, float V
 * RFLscroll - used in scrolling textures - uint32 index, float U, float V
 * RFLrotmatrix - Rotation matrix. 9 floats

Section IDs

 * 0x00000000 - End (found at end of file)
 * 0x00000100 - Static geometry
 * 0x00000200 - Geo regions
 * 0x00000300 - Lights
 * 0x00000400 - Cutscene cameras
 * 0x00000500 - Ambient sounds
 * 0x00000600 - Events
 * 0x00000700 - Multiplayer spawn points


 * 0x00000900 - Level properties
 * 0x00000a00 - Particle emitters
 * 0x00000b00 - Gas regions (not working in-game)
 * 0x00000c00 - Room effects


 * 0x00000e00 - Bolt emitters
 * 0x00000f00 - Targets
 * 0x00001000 - Decals
 * 0x00001100 - Push regions
 * 0x00001200 - Lightmaps


 * 0x00002000 - Movers
 * 0x00003000 - Moving groups


 * 0x00005000 - Cutscene path nodes


 * 0x00020000 - Navpoints
 * 0x00030000 - Entities
 * 0x00040000 - Items
 * 0x00050000 - Clutter objects
 * 0x00060000 - Triggers
 * 0x00070000 - Player start


 * 0x01000000 - Level info
 * 0x02000000 - Brushes
 * 0x03000000 - Groups

RFL header

 * uint32 - Magic number
 * uint32 - Format version number
 * uint32 - Unix timestamp of level save
 * uint32 - player start offset (need confirmation)
 * uint32 - level info offset (need conf)
 * uint32 - Count of sections in the RFL
 * uint32 - Combined size of all sections minus 8 bytes
 * RFLstring - Early level name
 * RFLstring - Mod that RED was running when level was saved
 * Sections follow.

Section header

 * uint32 - Section type
 * uint32 - Section size
 * Section data follows.

Triggers

 * uint32 - Count of triggers

For each trigger
If shape = sphere End
 * uint32 - Trigger UID
 * RFLstring - Script Name
 * uint8 - unknown
 * uint8 - Trigger shape (0=sphere 1=box)
 * uint8 - unknown
 * uint8 - unknown
 * uint8 - unknown
 * float - Resets after seconds
 * uint16 - Reset count
 * uint16 - unknown
 * bool - Use key required
 * RFLstring - Key name
 * bool - Weapon-activated
 * uint8 - unknown
 * bool - Triggered by NPCs
 * bool - Auto trigger
 * bool - Triggered by vehicles
 * RFLposition - trigger center position
 * float - Radius

If shape = box End
 * RFLrotmatrix - Rotation matrix
 * float - Height
 * float - Width
 * float - Depth
 * bool - One-way
 * uint32 - Airlock ID
 * uint32 - Attached to ID
 * uint32 - Use clutter ID
 * bool - Disabled
 * float - Button active time
 * float - Inside time
 * uint32 - unknown
 * Links

Links

 * uint32 - Link count
 * uint32*Link count - UID of linked object

Acknowledgements
Compiled by digi and nokobon.

Includes analysis from Open Faction project by rafalh et al.