File name: Project.dat
| Offset | Type | Size (octets) | Description |
|---|---|---|---|
| 0 | UInt8 | 1 | Format version (currently 9) |
| 1 | UInt8 | 1 | Project type (0 is game, 1 is movie) |
| 2 | C# String | (variable) | Project name |
| 2 + ? | UInt16 | 2 | Startup scene ID |
| 2 + ? + 2 | UInt16 | 2 | Script API Version |
| 2 + ? + 4 | UInt8 | 1 | Membership policy (see below) |
| 2 + ? + 5 | UInt8 | 1 | Default member role (see below) |
| 2 + ? + 6 | C# String | (variable) | Project description |
| 2 + ? + 6 + ? | UInt16 | 2 | Next unused game control ID |
| 2 + ? + 6 + ? + 2 | UInt16 | 2 | Game control count |
| 2 + ? + 6 + ? + 4 | GameControl[] | (variable) | Array of game controls (see below) |
| 2 + ? + 6 + ? + 4 + ? | UInt16 | 2 | Next project entry ID |
| 2 + ? + 6 + ? + 4 + ? + 2 | UInt16 | 2 | Project entries count |
| 2 + ? + 6 + ? + 4 + ? + 4 | ProjectEntry[] | (variable) | Array of project entries (see below) |
The project’s membership policy can take one of the following values:
| Label | Value |
|---|---|
| MembershipRequest | 0 |
| InviteOnly | 1 |
| Open | 2 |
The project’s default member role can be one of:
| Label | Value |
|---|---|
| Spectator | 1 |
| Member | 2 |
| Moderator | 3 |
| Administrator | 4 |
Note that there is no value of 0 (it’s used for membership requests)
Each game control has the following structure:
| Offset | Type | Size (octets) | Description |
|---|---|---|---|
| 0 | UInt16 | 2 | Game control ID |
| 2 | C# String | (variable) | Game control name |
| 3 | ControlType | 1 | Game control type (see below) |
| 4 | ControlSource | 1 | Game control source (see below) |
| 5 | Key | 1 | Positive key |
| 6 | Key | 1 | Negative key |
| 7 | UInt8 | 1 | Positive button index |
| 8 | UInt8 | 1 | Negative button index |
| 9 | UInt8 | 1 | Joystick index |
| 10 | UInt8 | 1 | Joystick axis index |
| 11 | Float32 | 4 | Joystick axis dead zone |
| 15 | Float32 | 4 | Axis sensivity (towards one, per second) |
| 19 | Float32 | 4 | Axis gravity (towards zero, per second) |
| 24 | Boolean | 1 | Snap to zero when changing direction |
(TODO: Document ControlType, ControlSource and Key)
Each project entry has the following structure:
| Offset | Type | Size (octets) | Description |
|---|---|---|---|
| 0 | Boolean | 1 | True if folder, false if asset |
| 1 | UInt16 | 2 | Project entry ID |
| 3 | UInt16 | 2 | Parent ID (or 65536 if root entry) |
| 5 | C# String | (variable) | Name |
| 5 + ? | ProjectEntryType | 1 | Entry type (see below) |
| 5 + ? + 1 | Boolean | 1 | True if locked, false otherwise |
Then, for assets only:
| Offset | Type | Size (octets) | Description |
|---|---|---|---|
| 5 + ? + 2 | Boolean | 1 | True if trashed, false otherwise |
| 5 + ? + 3 | UInt16 | 2 | Next revision ID |
| 2 + ? + 5 | UInt16 | 2 | Asset revisions count |
| 2 + ? + 7 | AssetRevision[] | (variable) | Array of asset revisions (see below) |
Each asset entry has a list of revisions with following structure:
| Offset | Type | Size (octets) | Description |
|---|---|---|---|
| 0 | UInt16 | 2 | Entry Revision ID |
| 2 | C# String | (variable) | Name |
| Label | Value |
|---|---|
| Model | 0 |
| ModelAnimation | 6 |
| Map | 1 |
| TileSet | 3 |
| Scene | 2 |
| Script | 7 |
| Document | 4 |
| Sound | 8 |
| Font | 9 |