АКЦИЯ от www.R3.ru - хостинг сайтов 72р. в месяц. Домен в подарок!

.werkkzeug 4 datafile format

This is description of legendary .wz4 format. Some fields are marked as unknown, but most of them are not really unknown, some fields is reserved for use in future version of wz4 or simply are not used.

/**
 *  .werkkzeug 4 file format.
 *  (c) 2011, Sauron.
 *  
 *  Comments:
 * 
 *  1. Project, meta and operator structures has its own version formats.
 *  This document describes following versions:
 *  - wz4project: 0x0b and 0xc;
 *  - wz4meta: from 0x2 to 0xd;
 *  - wz4block: 0x0c only.
 *
 *  2. All strings in this format is wide (UNICODE-16). It is recommended to
 *  create function for reading this kind of strings, which must to read length,
 *  read string, and then align stream to base 0x04.
 */

// .werkkzeug 4 project
struct wz4project {
	// start tag (always '<<<<')
	uint32 startTag;
	// format ID (always 0x00040007)
	uint32 formatId;
	// format version
	uint32 formatVersion;
	if (formatVersion<=0x0b) {
		// page metadata
		struct wz4pageMeta[nrPages] pageMeta;
		// ..
		uint32 unknown0;
	};
	// demo metadata
	struct wz4meta meta;
	// number of pages
	uint32 nrPages;
	if (formatVersion>=0x0c) {
		// page metadata
		struct wz4pageMeta[nrPages] pageMeta;
		// ..
		uint32 unknown0;
	};
	// pages
	struct wz4page[nrPages] pages;
	// ..
	uint32 unknown1;
	// it must be equals to nrPages
	uint32 nrPageCaches;
	// page name cache
	struct wz4pageCache[nrPageCaches] pageCache;
}

// .werkkzeug 4 demo meta data
struct wz4meta {
	// start tag (always '<<<<')
	uint32 startTag;
	// format ID (always 0x0002001f)
	uint32 formatId;
	// format version
	uint32 formatVersion;
	// length of project path
	uint32 projectPathLength;
	// project path
	wchar[projectPathLength] projectPath;
	align 4;
	// length of demo title
	uint32 demoNameLength;
	// demo title
	wchar[demoNameLength] demoName;
	align 4;
	if (formatVersion>=0x0b) {
		// project ID
		uint32 projectID;
		// ID on www.farbrausch.de
		uint32 projectSiteID;
	};
	// still unknown
	if (formatVersion>=0x03) {
		uint32 unknown2;
	};
	if (formatVersion>=0x04) {
		uint32 unknown3;
	};
	if (formatVersion>=0x05) {
		// unknown
		uint32 unknown04;
		// length of soundtrack filename
		uint32 sountrackLength;
		// soundtrack filename
		wchar[soundtrackLength] soundtrack;
		align 4;
	};
	// still unknown
	if (formatVersion>=0x0a) {
		uint32 unknown6;
	};
	// still unknown
	if (formatVersion>=0x09) {
		uint32 unknown7;
	};
	if (formatVersion>=0x06) {
		// default screen resolution
		uint32 xresolution;
		uint32 yresolution;
	};
	if (formatVersion>=0x07) {
		// length of last page name
		uint32 lastPageLength;
		// name of page which has been opened recently
		wchar[lastPageLength] lastPage;
		align 4;
	};
	if (formatVersion>=0x08) {
		// unknown length
		uint32 unknown8;
		// unknown string
		wchar[unknown8] unknown8s;
		align 4;
	};
	// "beat per minute" structures
	if () { // ?
		struct wz4bpm[32] bpms;
	};
	if (formatVersion>=0x0d) {
		// still unknown
		uint32 frequency;
		uint32 unknown9;
		uint32 unknown10;
	};
	// end tag (always '>>>>')
	uint32 endTag;
}

// "Beat per minute" structure
struct wz4bpm {
	float32 unknown01;
	float32 unknown02;
	float32 unknown03;
	float32 unknown04;
}

// .werkkzeug 4 page descriptor
struct wz4pageMeta {
	// number of operators layered on this page
	uint32 nrBlocks;
	uint32 unknown0;
	uint32 unknown1;
	uint32 unknown2;
	uint32 unknown3;
}

// .werkkzeug 4 page
struct wz4page {
	// length of page name
	uint32 nameLength;
	// page name
	wchar[nameLength] name;
	align 4;
	// ???
	uint32[3] unknown;
	// blocks
	struct block[] blocks;
}

// .werkkzeug 4 operator (outer)
struct wz4block {
	// position
	uint32 xpos;
	uint32 ypos;
	// width of block
	uint32 width;
	// still unknown
	uint32 unknown011;
	// bypass flag
	uint32 bypass;
	// still unknown
	uint32 unknown012;
	// contents
	struct wz4operator operator;
}

// .werkkzeug 4 operator (inner)
struct wz4operator {
	// start tag (always '<<<<')
	uint32 startTag;
	// format ID (always 0x00040008)
	uint32 formatId;
	// format version
	uint32 formatVersion;
	// length of operator name
	uint32 nameLength;
	// operator name
	wchar[nameLength] name;
	align 4;
	// length of opclass name
	uint32 opclassLength;
	// opclass name
	wchar[opclassLength] opclass;
	align 4;
	// length of operator category
	uint32 categoryLength;
	// operator category
	wchar[categoryLength] category;
	align 4;
	// 
	uint32 unknown02;
	// number of regular parameters
	uint32 nrDwords;
	// regular parameters
	uint8[dwords*4] dwords;
	// number of string parameters
	uint32 nrStrings;
	// string parameters
	struct wz4stringPara[nrStrings] strings;
	// number of links
	uint32 nrLinks;
	// links
	struct wz4link[nrLinks] links;
        // size of element of array (measured in dwords)
	uint32 arrayParaSize;
	// number of elements of array
	uint32 arrayParaCount;
	// still unknown
	uint32[3] unknown04;
	// end tag (always '>>>>')
	uint32 endTag;
}

// .werkkzeug 4 string parameter
struct wz4stringPara {
	// length
	uint32 valueLength;
	wchar[valueLength] value;
	align 4;
}

// .werkkzeug 4 link struct
struct wz4link {
	// length of linked parameter name
	uint32 nameLength;
	// linked parameter name
	wchar[nameLength] name;
	align 4;
	// page contains linked parameter
	uint32 page;
	// enables alternative (internal) link
	uint32 hasBackground;
	// internal link
	struct wz4operator[hasBackground] background;
}

// .werkkzeug 4 page cache entry
struct wz4pageCache {
	uint32 pageNameLength;
	wchar[pageNameLength] pageName;
	align 4;
}