jmhobbs

Discovering the DZE format

Last evening I decided to nose around the DZE file format, generated by the venerable DayZ Editor. The DZE format is the "native" save file format of the editor, and is the usual output as well. The recommended way of using edits from the editor is to load files in this format with a special mod.

It is, to the best of my knowledge, a bespoke format. It may be documented somewhere online, and it could be reverse engineered from the mod (or better, the loader mod), but I wanted to take a stab at it going in blind. As I poked around the format I kept a running stream-of-conciousness document open. This post is that document, tidied up to make it understandable from outside my head.

The Setup

I needed some small, sample files, so I fired up editor and made three. On one I placed a single tree. The second was the same tree, but I ticked all the checkboxes in the properties. The final one was deleting a single tree.

To help, I recorded some values from the editor itself. For the add_tree.dze I got the object classname (bldr_plnt_t_malusDomestica_3s_summer), the position (4134.939, 223.920, 10927.966) and the orientation (99.00, 1.23, 4.56). For delete.dze I didn't grab the position or orientation (I probably should have), only the classname, (TreeHard_t_populusNigra_3sb_summer)

Getting Started

The first thing I did was just hex dump one to see what there was to see.

$ hexyl add_tree.dze
┌────────┬─────────────────────────┬─────────────────────────┬────────┬────────┐
│000000000c 00 00 00 45 64 69 746f 72 42 69 6e 6e 65 64_⋄⋄⋄EditorBinned│
│0000001008 00 00 00 05 00 00 0045 6e 6f 63 68 03 00 00⋄⋄⋄⋄⋄⋄Enoch⋄⋄│
│0000002000 dd 8b 81 45 82 a3 5d43 73 da 2a 46 11 00 00×××E××]Cs×*F⋄⋄│
│0000003000 37 36 35 36 31 31 3938 30 34 33 38 34 31 30765611980438410│
│0000004035 30 01 00 00 00 11 0000 00 37 36 35 36 31 3150⋄⋄⋄⋄⋄765611│
│0000005039 38 30 34 33 38 34 3130 35 30 e6 a4 90 6a e698043841050×××j×│
│00000060a4 90 6a 01 00 00 00 2400 00 00 62 6c 64 72 5f××j⋄⋄⋄$⋄⋄⋄bldr_│
│0000007070 6c 6e 74 5f 74 5f 6d61 6c 75 73 44 6f 6d 65plnt_t_malusDome│
│0000008073 74 69 63 61 5f 33 735f 73 75 6d 6d 65 72 24stica_3s_summer$│
│0000009000 00 00 62 6c 64 72 5f70 6c 6e 74 5f 74 5f 6d⋄⋄⋄bldr_plnt_t_m│
│000000a061 6c 75 73 44 6f 6d 6573 74 69 63 61 5f 33 73alusDomestica_3s│
│000000b05f 73 75 6d 6d 65 72 0300 00 00 83 37 81 45 a2_summer⋄⋄⋄×7×E×│
│000000c0eb 5f 43 dd bf 2a 46 0300 00 00 b0 00 c6 42 a3×_C××*F⋄⋄⋄××B×│
│000000d070 9d 3f 84 eb 91 40 0000 80 3f 1e 00 00 00 00p×?×××@×?⋄⋄⋄⋄│
│000000e000 00 00 00 00 00 00 0000 00 00 01 00 00 00 00⋄⋄⋄⋄⋄⋄⋄⋄⋄⋄⋄⋄⋄⋄⋄│
│000000f000 00 00 33 00 00 00 647a 5c 70 6c 61 6e 74 73⋄⋄⋄3⋄⋄⋄dz\plants│
│000001005f 62 6c 69 73 73 5c 7472 65 65 5c 74 5f 6d 61_bliss\tree\t_ma│
│000001106c 75 73 64 6f 6d 65 7374 69 63 61 5f 33 73 5flusdomestica_3s_│
│0000012073 75 6d 6d 65 72 2e 7033 64 00 00 00 00 00 00summer.p3d⋄⋄⋄⋄⋄⋄│
│0000013000 00 00 00 00 00      ⋄⋄⋄⋄⋄⋄  │
└────────┴─────────────────────────┴─────────────────────────┴────────┴────────┘

Well, some things jump right out, don't they? First off, lots of ASCII strings in there. A couple are obvious, EditorBinned looks like a marker for the format, Enoch is the name of the DayZ mission (that's the name of Livonia), and I can see the classname of the tree I deleted, as well as a reference to the 3D model (...summer.p3d)

A less obvious string is 76561198043841050. I only recognize that because I see it somewhat regularly, it's my Steam ID.

Before each string there is a pattern, XX 00 00 00. This looks like a length encoding; so a string entry would be an integer "how long is the string" and then the string bytes. At four bytes, it's probably a little endian uint32, and if we check them, it does match up: 0x0c == 12 == len("EditorBinned").

With that sorted, our format looks like this:

┏━━━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━━━━┯━━━━━━━━┯━━━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃000000000c 00 00 00             ┊                         │x    ┊        │ String Length              ┃
┠┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┨
┃0000000445 64 69 74 6f 72 42 696e 6e 65 64EditorBinned    │ String                     ┃
┠┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┨
┃0000001608 00 00 00             ┊                         │x    ┊        │ Unknown                    ┃
┠┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┨
┃0000002005 00 00 00             ┊                         │x    ┊        │ String Length (Map)        ┃
┠┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┨
┃0000002445 6e 6f 63 68          ┊                         │Enoch   ┊        │ String (Map)               ┃
┠┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┨
┃0000002903 00 00 00 dd 8b 81 4582 a3 5d 43 73 da 2a 46xxxxExx]Csx*F│ Unknown                    ┃
┠┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┨
┃0000004511 00 00 00             ┊                         │x    ┊        │ String Length (Steam ID)   ┃
┠┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┨
┃0000004937 36 35 36 31 31 39 3830 34 33 38 34 31 30 357656119804384105│ String (Steam ID)          ┃
┃0000006530                      ┊                         │0       ┊        │                            ┃
┠┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┨
┃0000006601 00 00 00             ┊                         │x    ┊        │ Unknown                    ┃
┠┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┨
┃0000007011 00 00 00             ┊                         │x    ┊        │ Length (Steam ID Again)    ┃
┠┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┨
┃0000007437 36 35 36 31 31 39 3830 34 33 38 34 31 30 357656119804384105│ String (Steam ID Again)    ┃
┃0000009030                      ┊                         │0       ┊        │                            ┃
┠┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┨
┃00000091e6 a4 90 6a e6 a4 90 6a01 00 00 00xxxjxxxjx    │ Unknown                    ┃
┠┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┨
┃0000010324 00 00 00             ┊                         │$    ┊        │ Length (Object Name)       ┃
┠┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┨
┃0000010762 6c 64 72 5f 70 6c 6e74 5f 74 5f 6d 61 6c 75bldr_plnt_t_malu│ String (Object Name)       ┃
┃0000012373 44 6f 6d 65 73 74 6963 61 5f 33 73 5f 73 75sDomestica_3s_su│                            ┃
┃000001396d 6d 65 72             ┊                         │mmer    ┊        │                            ┃
┠┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┨
┃0000014324 00 00 00             ┊                         │$    ┊        │ Length (Object Name Again) ┃
┠┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┨
┃0000014762 6c 64 72 5f 70 6c 6e74 5f 74 5f 6d 61 6c 75bldr_plnt_t_malu│ String (Object Name Again) ┃
┃0000016373 44 6f 6d 65 73 74 6963 61 5f 33 73 5f 73 75sDomestica_3s_su│                            ┃
┃000001796d 6d 65 72             ┊                         │mmer    ┊        │                            ┃
┠┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┨
┃0000018303 00 00 00 83 37 81 45a2 eb 5f 43 dd bf 2a 46xx7xExx_Cxx*F│ Unknown                    ┃
┃0000019903 00 00 00 b0 00 c6 42a3 70 9d 3f 84 eb 91 40xxxBxpx?xxx@│                            ┃
┃0000021500 00 80 3f 1e 00 00 0000 00 00 00 00 00 00 00x?x│                            ┃
┃0000023100 00 00 00 01 00 00 0000 00 00 00x    │                            ┃
┠┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┨
┃0000024333 00 00 00             ┊                         │3    ┊        │ Length (Model)             ┃
┠┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┨
┃0000024764 7a 5c 70 6c 61 6e 7473 5f 62 6c 69 73 73 5cdz\plants_bliss\│ String (Model)             ┃
┃0000026374 72 65 65 5c 74 5f 6d61 6c 75 73 64 6f 6d 65tree\t_malusdome│                            ┃
┃0000027973 74 69 63 61 5f 33 735f 73 75 6d 6d 65 72 2estica_3s_summer.│                            ┃
┃0000029570 33                   ┊                         │p3      ┊        │                            ┃
┠┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┨
┃0000029764 00 00 00             ┊                         │d    ┊        │ Unknown                    ┃
┗━━━━━━━━┷━━━━━━━━━━━━━━━━━━━━━━━━━┷━━━━━━━━━━━━━━━━━━━━━━━━━┷━━━━━━━━┷━━━━━━━━┷━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛

How about those floats...

Ok, so that clears a lot out, but leaves a lot to decode. One thing we know should be in here are the position and orientation floats. I wrote a little Go to encode those so we know what to look for (sadly, I can't do IEEE 754 in my head);

package main

import (
	"encoding/binary"
	"os"
)

func main() {
	f, err := os.Create("floats.bin")
	if err != nil {
		panic(err)
	}
	defer f.Close()
	binary.Write(f, binary.LittleEndian, 4134.939)
	f.Write([]byte{0, 0, 0, 0})
	binary.Write(f, binary.LittleEndian, 223.920)
	f.Write([]byte{0, 0, 0, 0})
	binary.Write(f, binary.LittleEndian, 10927.966)
	f.Write([]byte{0, 0, 0, 0})
	binary.Write(f, binary.LittleEndian, 99.0)
	f.Write([]byte{0, 0, 0, 0})
	binary.Write(f, binary.LittleEndian, 1.23)
	f.Write([]byte{0, 0, 0, 0})
	binary.Write(f, binary.LittleEndian, 4.56)
	f.Write([]byte{0, 0, 0, 0})
}

And the output...

$ hexyl floats.bin
┌────────┬─────────────────────────┬─────────────────────────┬────────┬────────┐
│00000000f2 d2 4d 62 f0 26 b0 4000 00 00 00 3d 0a d7 a3××Mb×&×@⋄⋄⋄⋄=_××│
│0000001070 fd 6b 40 00 00 00 00f8 53 e3 a5 fb 57 c5 40p×k@⋄⋄⋄⋄×S×××W×@│
│0000002000 00 00 00 00 00 00 0000 c0 58 40 00 00 00 00⋄⋄⋄⋄⋄⋄⋄⋄×X@⋄⋄⋄⋄│
│00000030ae 47 e1 7a 14 ae f3 3f00 00 00 00 3d 0a d7 a3×G×z××?⋄⋄⋄⋄=_××│
│0000004070 3d 12 40 00 00 00 00p=@⋄⋄⋄⋄│
└────────┴─────────────────────────┴─────────────────────────┴────────┴────────┘

Well, none of that is in there. Not big endian either, since it's the same bytes, just in another order and, for instance, 0x6b isn't in the file at all.

After stewing for a bit I realized Go was encoding 64 bit floats, and this format (like many DayZ things) was almost certainly using 32 bit floats. I wrapped all my literals in float32() and ran it again, and there they all were, same as in the file.

$ hexyl floats.bin
┌────────┬─────────────────────────┬─────────────────────────┬────────┬────────┐
│0000000083 37 81 45 00 00 00 0085 eb 5f 43 00 00 00 00×7×E⋄⋄⋄⋄××_C⋄⋄⋄⋄│
│00000010dd bf 2a 46 00 00 00 0000 00 c6 42 00 00 00 00××*F⋄⋄⋄⋄⋄⋄×B⋄⋄⋄⋄│
│00000020a4 70 9d 3f 00 00 00 0085 eb 91 40 00 00 00 00×p×?⋄⋄⋄⋄×××@⋄⋄⋄⋄│
└────────┴─────────────────────────┴─────────────────────────┴────────┴────────┘

Marking those out gets us this segment;

┏━━━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━━━━┯━━━━━━━━┯━━━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃0000018303 00 00 00             ┊                         │x    ┊        │ Unknown                    ┃
┠┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┨
┃0000018783 37 81 45             ┊                         │x7xE    ┊        │ Position X                 ┃
┠┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┨
┃00000191a2 eb 5f 43             ┊                         │xx_C    ┊        │ Position Y                 ┃
┠┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┨
┃00000195dd bf 2a 46             ┊                         │xx*F    ┊        │ Position Z                 ┃
┠┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┨
┃0000019903 00 00 00             ┊                         │x    ┊        │ Unknown                    ┃
┠┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┨
┃00000203b0 00 c6 42             ┊                         │xxB    ┊        │ Orientation X              ┃
┠┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┨
┃00000207a3 70 9d 3f             ┊                         │xpx?    ┊        │ Orientation Y              ┃
┠┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┨
┃0000021184 eb 91 40             ┊                         │xxx@    ┊        │ Orientation Z              ┃
┗━━━━━━━━┷━━━━━━━━━━━━━━━━━━━━━━━━━┷━━━━━━━━━━━━━━━━━━━━━━━━━┷━━━━━━━━┷━━━━━━━━┷━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛

As a WAG, I'd say those 03 00 00 00 fields are a count of the coming float values, so we will assume that for now. Using this format, are there any other float-triplets in here that seem likely? Just one, near the top right after the map name. If we convert those bytes to floats, what would they be?

package main

import (
	"encoding/binary"
	"fmt"
)

func main() {

	var x, y, z float32
	binary.Decode([]byte{0xdd, 0x8b, 0x81, 0x45}, binary.LittleEndian, &x)
	binary.Decode([]byte{0x82, 0xa3, 0x5d, 0x43}, binary.LittleEndian, &y)
	binary.Decode([]byte{0x73, 0xda, 0x2a, 0x46}, binary.LittleEndian, &z)

	fmt.Println(x, y, z)
}
$ go run main.go
4145.483 221.6387 10934.612

Those sure look like in game coordinates, and are very near our tree. Since these are in the "header" section of the file, I think it's probably the camera location at time of save, since I do know DayZ Editor stores that (you zoom to the camera location when loading a DZE file). No orientation though, which is interesting. Something to test and come back to later.

Vexillology

At this point, I had only a few points of data left; the flags I knew I toggled in add_tree_all_flags.dze I ran the current packet printer against both and compared the diff. These lines jumped out at obviously being flags;

64c64
< ┃00000227│ 00 00 00 00             ┊                         │⋄⋄⋄⋄    ┊        │ Unknown    ┃
---
> ┃00000227│ 01 00 00 00             ┊                         │x⋄⋄⋄    ┊        │ Unknown    ┃
66c66
< ┃00000231│ 00 00 00 00             ┊                         │⋄⋄⋄⋄    ┊        │ Unknown    ┃
---
> ┃00000231│ 01 00 00 00             ┊                         │x⋄⋄⋄    ┊        │ Unknown    ┃
70c70
< ┃00000239│ 00 00 00 00             ┊                         │⋄⋄⋄⋄    ┊        │ Unknown    ┃
---
> ┃00000239│ 01 00 00 00             ┊                         │x⋄⋄⋄    ┊        │ Unknown    ┃

I remember ticking more than three, but maybe they are not all things that get written to the save file? Either way, to classify exactly which is which. I'll have to generate new test files for each flag, something to pursue later.

Wait, why did that change?

The diff also showed some other changes. The position and orientation had changed, but that was expected because one of the tick boxes gave the tree physics and it fell over. The other change was more suspicious;

32c32
< ┃00000091│ e6 a4 90 6a e6 a4 90 6a ┊ 01 00 00 00             │xxxjxxxj┊x⋄⋄⋄    │ Unknown   ┃
---
> ┃00000091│ fd a4 90 6a e6 a4 90 6a ┊ 01 00 00 00             │xxxjxxxj┊x⋄⋄⋄    │ Unknown   ┃

It's up in the metadata/header area of the file, right after the second Steam ID value. Why would that change, but only a little bit?

Well, one obvious reason is perhaps a timestamp. This file was saved after the first add_tree.dze, so maybe it's a timestamp that updated? But 12 bytes is too big for a timestamp, what would that even unpack into? The 01 00 00 00 looks like another length one, so let's drop that and see what the top 8 bytes decodes to.

package main

import (
	"encoding/binary"
	"fmt"
)

func main() {
	var t uint64
	binary.Decode([]byte{
		0xfd, 0xa4, 0x90, 0x6a,
		0xe6, 0xa4, 0x90, 0x6a,
	},
		binary.LittleEndian,
		&t,
	)

	fmt.Println(t)
}
$ go run main.go
7678818674203993341

Ok, that is way too big. Even assuming nanosecond precision, if that's a unix timestamp it's for the year 2213.

Looking at the diff again, I noticed on the first file it's the same 4 bytes twice. That'd be a wild coincidence for a timstamp, so what if it's actually two timestamps? Created and modified?

package main

import (
	"encoding/binary"
	"fmt"
)

func main() {
	var ta, tb uint32
	binary.Decode([]byte{
		0xe6, 0xa4, 0x90, 0x6a,
	},
		binary.LittleEndian,
		&ta,
	)

	binary.Decode([]byte{
		0xfd, 0xa4, 0x90, 0x6a,
	},
		binary.LittleEndian,
		&tb,
	)

	fmt.Println(ta, tb)
}
$ go run main.go
1787864294 1787864317

Well look at that, two timestamps, and they are even from today. That seems like a match!

Wrapping Up

At this point most of the file is accounted for, with some odds and ends remaining.

The 08 00 00 00 at the top is almost certainly a file version, I'll have to gather some old DZE files to know for sure.

We have a couple 01 00 00 00 left in as well, we will assume those are field counts similar to the 03 00 00 00 for the floats. We don't know what they do exactly, but they seem to be carrying information themselves. I think the one after the timestamps is probably a count of the object entries that follow.

The biggest unknown segment is the 00 00 80 3f 1e 00 00 00 00 00 00 00.

One thing I forgot to inject in my test files was a scale factor I could search for. The default scale it 1.00, so it should be in here somewhere. Encoded that is 00 00 80 3f, which we do have in that unknown section. Another one bytes the dust!

Wrapping it up here is the final format we have sniffed out.

┏━━━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━━━━┯━━━━━━━━┯━━━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃000000000c 00 00 00             ┊                         │x    ┊        │ String Length              ┃
┠┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┨
┃0000000445 64 69 74 6f 72 42 696e 6e 65 64EditorBinned    │ String                     ┃
┠┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┨
┃0000001608 00 00 00             ┊                         │x    ┊        │ Unknown                    ┃
┠┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┨
┃0000002005 00 00 00             ┊                         │x    ┊        │ String Length (Map)        ┃
┠┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┨
┃0000002445 6e 6f 63 68          ┊                         │Enoch   ┊        │ String (Map)               ┃
┠┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┨
┃0000002903 00 00 00             ┊                         │x    ┊        │ Float32 Count              ┃
┠┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┨
┃00000033dd 8b 81 45             ┊                         │xxxE    ┊        │ Camera Position X          ┃
┠┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┨
┃0000003782 a3 5d 43             ┊                         │xx]C    ┊        │ Camera Position Y          ┃
┠┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┨
┃0000004173 da 2a 46             ┊                         │sx*F    ┊        │ Camera Position Z          ┃
┠┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┨
┃0000004511 00 00 00             ┊                         │x    ┊        │ String Length (Steam ID)   ┃
┠┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┨
┃0000004937 36 35 36 31 31 39 3830 34 33 38 34 31 30 357656119804384105│ String (Steam ID)          ┃
┃0000006530                      ┊                         │0       ┊        │                            ┃
┠┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┨
┃0000006601 00 00 00             ┊                         │x    ┊        │ Unknown                    ┃
┠┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┨
┃0000007011 00 00 00             ┊                         │x    ┊        │ Length (Steam ID Again)    ┃
┠┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┨
┃0000007437 36 35 36 31 31 39 3830 34 33 38 34 31 30 357656119804384105│ String (Steam ID Again)    ┃
┃0000009030                      ┊                         │0       ┊        │                            ┃
┠┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┨
┃00000091e6 a4 90 6a             ┊                         │xxxj    ┊        │ Timestamp (Modified)       ┃
┠┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┨
┃00000095e6 a4 90 6a             ┊                         │xxxj    ┊        │ Timestamp (Created)        ┃
┠┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┨
┃0000009901 00 00 00             ┊                         │x    ┊        │ Unknown                    ┃
┠┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┨
┃0000010324 00 00 00             ┊                         │$    ┊        │ Length (Object Name)       ┃
┠┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┨
┃0000010762 6c 64 72 5f 70 6c 6e74 5f 74 5f 6d 61 6c 75bldr_plnt_t_malu│ String (Object Name)       ┃
┃0000012373 44 6f 6d 65 73 74 6963 61 5f 33 73 5f 73 75sDomestica_3s_su│                            ┃
┃000001396d 6d 65 72             ┊                         │mmer    ┊        │                            ┃
┠┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┨
┃0000014324 00 00 00             ┊                         │$    ┊        │ Length (Object Name Again) ┃
┠┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┨
┃0000014762 6c 64 72 5f 70 6c 6e74 5f 74 5f 6d 61 6c 75bldr_plnt_t_malu│ String (Object Name Again) ┃
┃0000016373 44 6f 6d 65 73 74 6963 61 5f 33 73 5f 73 75sDomestica_3s_su│                            ┃
┃000001796d 6d 65 72             ┊                         │mmer    ┊        │                            ┃
┠┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┨
┃0000018303 00 00 00             ┊                         │x    ┊        │ Float32 Count              ┃
┠┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┨
┃0000018783 37 81 45             ┊                         │x7xE    ┊        │ Position X                 ┃
┠┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┨
┃00000191a2 eb 5f 43             ┊                         │xx_C    ┊        │ Position Y                 ┃
┠┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┨
┃00000195dd bf 2a 46             ┊                         │xx*F    ┊        │ Position Z                 ┃
┠┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┨
┃0000019903 00 00 00             ┊                         │x    ┊        │ Float32 Count              ┃
┠┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┨
┃00000203b0 00 c6 42             ┊                         │xxB    ┊        │ Orientation X              ┃
┠┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┨
┃00000207a3 70 9d 3f             ┊                         │xpx?    ┊        │ Orientation Y              ┃
┠┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┨
┃0000021184 eb 91 40             ┊                         │xxx@    ┊        │ Orientation Z              ┃
┠┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┨
┃0000021500 00 80 3f             ┊                         │x?    ┊        │ Float (Scale)              ┃
┠┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┨
┃000002191e 00 00 00 00 00 00 00 ┊                         │x┊        │ Unknown                    ┃
┠┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┨
┃0000022700 00 00 00             ┊                         │    ┊        │ Flag ???                   ┃
┠┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┨
┃0000023100 00 00 00             ┊                         │    ┊        │ Flag ???                   ┃
┠┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┨
┃0000023501 00 00 00             ┊                         │x    ┊        │ Flag ???                   ┃
┠┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┨
┃0000023900 00 00 00             ┊                         │    ┊        │ Flag ???                   ┃
┠┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┨
┃0000024333 00 00 00             ┊                         │3    ┊        │ Length (Model)             ┃
┠┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┨
┃0000024764 7a 5c 70 6c 61 6e 7473 5f 62 6c 69 73 73 5cdz\plants_bliss\│ String (Model)             ┃
┃0000026374 72 65 65 5c 74 5f 6d61 6c 75 73 64 6f 6d 65tree\t_malusdome│                            ┃
┃0000027973 74 69 63 61 5f 33 735f 73 75 6d 6d 65 72 2estica_3s_summer.│                            ┃
┃0000029570 33                   ┊                         │p3      ┊        │                            ┃
┠┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┨
┃0000029764 00 00 00             ┊                         │d    ┊        │ Unknown                    ┃
┗━━━━━━━━┷━━━━━━━━━━━━━━━━━━━━━━━━━┷━━━━━━━━━━━━━━━━━━━━━━━━━┷━━━━━━━━┷━━━━━━━━┷━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛

Next Steps

So what next? Well, more data is needed really. I need to attribute the flags we observed, figure out why steam ID is in there twice (my guess is creator and last editor), and figure out some of those length fields. Lastly is that long 1e 00... segment which I have no idea about, and the trailer 64 00....

Still, not bad for a first pass! At a minimum, we should be able to parse locations out of here, which we can use for....something!

I've got the beginnings of a decoder going on GitHub, and will update it as I learn more. If there's enough to be getting on with, maybe I'll write a follow up post.