demboyz/docs/DemFormat.md

115 lines
3.7 KiB
Markdown

Source Engine DEM format
=======
This document applies to the version of TF2 as of July 1, 2015.
Demo Protocol v3.
Network Protocol v24.
#### DEM Format
The Source Engine DEM format at a high level:
[Demo Header]
[Command Header][Command Packet]
[Command Header][Command Packet]
...
[Command Header = dem_stop]
~fin
#### Demo Header
| Type | Name | Description | Example |
|------|------|-------------|---------|
| char[8] | Demo File Stamp | Demo file identifier. | "HL2DEMO" |
| int32 | Demo Protocol | Demo protocol version. | 3 |
| int32 | Network Protocol | Network protocol version. | 24 |
| char[260] | Server Name | Name of the server that recorded this demo. | "Team Fortress" |
| char[260] | Client Name | Name of the client that recorded this demo. | "SourceTV Demo" |
| char[260] | Map Name | Name of the map where this demo was recorded. | "cp_granary" |
| char[260] | Game Directory | Game directory relative to hl2.exe | "tf" |
| float32 | Playback Time | Length of the demo in seconds. | 9.05999947 |
| int32 | Playback Ticks | Length of the demo in ticks. | 604 |
| int32 | Playback Frames | Length of the demo in frames. | 151 |
| int32 | Signon Length | Length of the signon data in bytes. | 640166 |
Note: Examples are from a short demo recording, hence the 9 second playback time.
#### Command Header
| Type | Name | Description |
|------|------|-------------|
| int8 | Command Type | Type of the next command packet. |
| int32 | Tick | Game tick of the next command packet. |
#### Command Type
| Name | Value | Description |
|------|-------|-------------|
| dem_signon | 1 | Signon packet. Same format as a network packet. |
| dem_packet | 2 | Network packet. |
| dem_synctick | 3 | Signals the client to sync clock to demo tick. |
| dem_consolecmd | 4 | Console command. |
| dem_usercmd | 5 | User input command. |
| dem_datatables | 6 | Network data tables. |
| dem_stop | 7 | Signals the end of demo messages. |
| dem_stringtables | 8 | Stringtables. |
#### Command Packets
##### dem_signon/dem_packet
| Type | Name | Description |
|------|------|-------------|
| democmdinfo_t | Demo Command Info | Describes view angles of the current point of view. |
| int32 | Sequence Number In | Input sequence number of packet. |
| int32 | Sequence Number Out | Output sequence number of packet. |
| RawData | Netpackets | RawData structure containing a series of netpackets. |
##### dem_synctick
Command Packet of size 0 bytes.
##### dem_consolecmd
| Type | Name | Description |
|------|------|-------------|
| char[1023] | Command String | Console command string of max length 1023 (including null char). |
Note: A typo in the code that writes out console commands likely meant for a string of length 1024 (including null char).
##### dem_usercmd
##### dem_datatables
##### dem_stop
Command Packet of size 0 bytes.
##### dem_stringtables
#### Types Appendix
##### Vector
| Type | Name | Description |
|------|------|-------------|
| float32 | x | |
| float32 | y | |
| float32 | z | |
##### QAngle
| Type | Name | Description |
|------|------|-------------|
| float32 | pitch | |
| float32 | yaw | |
| float32 | roll | |
##### Split_t
| Type | Name | Description |
|------|------|-------------|
| int32 | Flags | |
| Vector | View Origin | |
| QAngle | View Angles | |
| QAngle | Local View Angles | |
| Vector | View Origin 2 | |
| QAngle | View Angles 2 | |
| QAngle | Local View Angles 2 | |
##### democmdinfo_t
| Type | Name | Description |
|------|------|-------------|
| Split_t[1] | POV angles | Array of Split_t. Constant length of 1 for demo protocol 3. |
##### RawData
| Type | Name | Description |
|------|------|-------------|
| int32 | Size | Size in bytes of the following data chunk. |
| uchar[Size] | Data | Data chunk of Size bytes. |