Index: tools/cond.rehex.bt
===================================================================
--- tools/cond.rehex.bt	(revision c52dd7b2cdaf1ce785f2117dea3443db7d134a13)
+++ tools/cond.rehex.bt	(revision c52dd7b2cdaf1ce785f2117dea3443db7d134a13)
@@ -0,0 +1,24 @@
+struct unknownchunk {
+	uint16_t size;
+	local uint16_t realLen = size - 2;
+	if (size > 0) {
+		char data[realLen];
+	}
+};
+
+struct recursechunk {
+	local uint16_t start = FTell();
+	uint16_t sizeInBytes;
+
+	struct unknownchunk innerchunks[0];
+	while (FTell() - start < sizeInBytes)
+	{
+		ArrayExtend(innerchunks);
+	}
+};
+
+struct recursechunk chunks[0];
+
+while (!FEof()) {
+	ArrayExtend(chunks);
+}
Index: tools/init.rehex.bt
===================================================================
--- tools/init.rehex.bt	(revision c52dd7b2cdaf1ce785f2117dea3443db7d134a13)
+++ tools/init.rehex.bt	(revision c52dd7b2cdaf1ce785f2117dea3443db7d134a13)
@@ -0,0 +1,131 @@
+LittleEndian();
+
+// A generic struct for a NULL terminated string (until rehex can do it more easily)
+struct NullTerminatedString {
+	local int64_t start = FTell();
+	local int64_t end = start;
+
+	while (ReadU8(end) != 0) {
+		end++;
+	}
+
+	local int64_t size = end - start + 1;
+	char string[size];
+};
+
+FSeek(32); // Skip the header, to be decoded later...
+
+struct TextAndShortcut {
+	struct NullTerminatedString label;
+	struct NullTerminatedString shortcut;
+};
+
+struct Point {
+	uint16_t xpos;
+	uint16_t ypos;
+};
+
+enum <uint16_t> Color {
+	BLACK,
+	BLUE,
+	GREEN,
+	CYAN,
+	RED,
+	MAGENTA,
+	YELLOW,
+	GRAY
+};
+
+struct GlobalButton {
+	struct Point position;
+	enum Color bgcolor;
+	uint16_t unknown[3];
+	uint16_t buttonID;
+	struct TextAndShortcut label;
+};
+
+struct ButtonChunk {
+	uint8_t undecodedData[48];
+	struct GlobalButton globalButtons[0];
+
+	while(ReadU32(FTell()) != 0) {
+		ArrayExtend(globalButtons);
+	}
+	struct Point terminator;
+};
+
+struct Action {
+	uint8_t id;
+	struct TextAndShortcut label;
+};
+
+struct ActionsChunk {
+	struct Action actions[0];
+
+	while(ReadU8(FTell()) != 0) {
+		ArrayExtend(actions);
+	}
+
+	uint8_t chunkTerminator;
+};
+
+struct Object {
+	uint16_t unknowprefix[4];
+	struct NullTerminatedString objectName;
+	struct NullTerminatedString objectDescription;
+	uint8_t actionsWhenFound[3];
+	uint8_t actionsWhenOwned[3]; // ID of the matching actions in the actions list
+};
+
+struct ObjectsChunk {
+	uint16_t unknown;
+	struct Object objects[0];
+
+	while(ReadU8(FTell()) != 0) {
+		ArrayExtend(objects);
+	}
+
+	uint8_t chunkTerminator;
+};
+
+struct StringListChunk {
+	struct NullTerminatedString stringlist[0];
+
+	while(ReadU8(FTell()) != 0x24) {
+		ArrayExtend(stringlist);
+	}
+
+	uint8_t chunkTerminator;
+};
+
+struct InitChunk {
+	uint16_t id;
+
+	if (id == 1) {
+		struct ButtonChunk buttonChunk;
+	} else if (id == 2) {
+		struct ActionsChunk actionsChunk;
+	} else if (id == 3) {
+		struct ObjectsChunk objectsChunk;
+	} else if (id == 4) {
+		struct StringListChunk toolscreensChunk;
+	} else if (id == 5) {
+		struct StringListChunk invalidactionsChunk;
+	} else if (id == 6) {
+		struct StringListChunk availableDirectionsChunk;
+		// Each of the string consists of some of the characters from "nseohbx", each corresponding
+		// to a compass direction (North, South, East, West (Ouest), Up (Haut), Down (Bas), eXit)
+		// It can also be a NULL string or a single _ char (I guess one of them hides the compass
+		// completely and the other just disables all the buttons)
+	} else if (id == 7) {
+		uint16_t unknown_chunk_7;
+	} else if (id == 8) {
+		uint16_t unknown_chunk_8[2];
+	} else if (id == 9) {
+		// This chunk is empty
+	} else {
+		uint16_t unknown_chunk;
+	}
+};
+
+struct InitChunk chunk[9];
Index: tools/msg.rehex.bt
===================================================================
--- tools/msg.rehex.bt	(revision c52dd7b2cdaf1ce785f2117dea3443db7d134a13)
+++ tools/msg.rehex.bt	(revision c52dd7b2cdaf1ce785f2117dea3443db7d134a13)
@@ -0,0 +1,31 @@
+LittleEndian();
+
+// Simple string chunks are defined by a size (self-including) and a
+// string (NULL terminated)
+struct lenstring
+{
+	uint16_t len;
+	local uint16_t realLen = len - 2;
+	char string[realLen];
+};
+
+// Room chunks have a size and are filled by string chunks
+struct ROOM
+{
+	local uint16_t start = FTell();
+
+	uint16_t sizeInBytes;
+
+	struct lenstring substrings[0];
+	while (FTell() - start < sizeInBytes)
+	{
+		ArrayExtend(substrings);
+	}
+};
+
+struct ROOM rooms[0];
+
+while(!FEof())
+{
+	ArrayExtend(rooms);
+}
