Ok, so I managed to figure it out by disassembling the game code.
Structure of block is:
u32 - total amount of nodes
u32 - total amount of properties on all nodes
u32 - total size of string table
u8 * total size of string table - string table itself, act as a queue; where you see string, asume that string should be popped from this queue
next follow nodes. Node layout is:
u8 - node flags
u32 - node id (some random number, it's fine to have absurd big number here)
if have name:
string - node name
if have properties:
u8/u32 - property count
next follow properties. Property layout is:
u32 - property type (not data type actually, assume it as property name; on different nodes, properties that form similar groups with seemingly similar purpose have same types)
string - property value
if have children:
u8/u32 - children count
... - end of block, following bytes define children nodes; when child node have it's own children, it should write them before we move to the next node on same depth
Node flags are:
0x01 - does node have name
0x02 - does node have properties
0x04 - does node have children
0x08 - do property/children counts take 1 byte or 4 (raised flag means 1 byte, i.e. compact number, 4 byte otherwise)
I hope that will help someone doing codding stuff for that game <3