@Don the Oiler
Sorry, my mistake.
Links are updated now. Please redownload fixed version.
@Copernicus
I had a go at the BOD (BinaryObjectData) format a few days ago and managed to crack it as well. I'm still not sure what the DWORD after the zipped-flag is used for, any ideas?
Possibly version or number of objects in the file. It's equal to 1 in all demo files, so there's no way to tell really.
I also gotta say that I found the BOD format too complicated for what it is.
Agreed. Almost drove me mad at one point... 


What do the BOD DataTypes 05 and 07 mean to you? 07 seems to be some kind of index, 05 appears to be some kind of container which adds a key to an unkeyed value.
I'm not sure about 05. You can read it as hashed string, but 0F is also a hashed string, so there must be some difference between the two. 07 is quite interesting bacause it's globally indexed. The value after 07 is starting from 0 and increasing by one each time 07 element appears anywhere in the file. Not sure what to think of this tbh. 
Edit: So after converting a file using your tool I see that you used 05 to create the element nodes and 07 to get their IDs.
Not quite. I understand 07 to be element node and 05 the name of this element. Tbh it's still doesn't make terribly lot of sense but works good enough. I'm actually using the XML structure from the couple of files I've found in the demo (data\config\graphicsdb.xml and *.wmem).
Here's the full format for you: (feel free to fill in the blanks if you can
)
Code:
================
BOD File Format
================
Version: 0.1.1
Author: Santos
================
Types
-----
GUID unique id (8 bytes)
HSTRING hashed string (with GUID being a key into string table)
------
HEADER
------
CHAR[3] signature (BOD)
UINT8 ? (0xFD)
UINT8 ? (2)
UINT8 compressed (0, 1)
UINT32 ? (1)
IF (compressed == 1) THEN
UINT32 uncompressed data size
DATA[N} zlib compressed data (N - to file's end)
ELSE IF (compressed == 0) THEN
UINT32 num strings
UINT32 max string length
FOR (num strings) DO
GUID id
STRING string
OBJECT root object
------
OBJECT
------
UINT8 type? (1)
HSTRING class
UINT32 num properties
FOR (num properties) DO
HSTRING property name
PROPERTY property
--------
PROPERTY
--------
UINT8 type
CASE (type) OF
0x02: INT32 value
0x03: FLOAT value
0x04: BOOL value
0x05: HSTRING value
0x07: UINT32 id
PROPERTY property
0x09: UINT32 count
UINT8 flag (0, 1)
IF flag == 1:
UINT8 type? (5)
HSTRING name
PROPERTY property
0x0B: UINT32 count
FOR (count) DO
PROPERTY value
0x0D: DATA[8] value
0x0F: HSTRING value
0xFE: // No value
0xFF: UINT32 value
--------------
Property Types
--------------
0x02 - int
0x03 - float
0x04 - bool
0x05 - ?
0x07 - object
0x09 - array
0x0B - vector
0x0D - ?
0x0F - hstring
0xFE - ?
0xFF - ?
-----
Notes
-----
- if compression is equal to 1, entire data block is compressed with zlib (best compression level)
- four out of eight BOD file types are compressed - Layer, O3d, region, world
- property type 0x02 is signed integer (can be negative)
- property types 0x05 and 0x0F are both hashed strings, difference between the two is unknown
- property type 0x07 is indexed globally
- property type 0x0D is of unknown value type
- property type 0xFE is unknown and has no value
- property type 0XFF is unsigned integer, purpose unknown