Word Rescue Level Format
The format is comprised of two layers and some items (perhaps considered a third layer) with the first (background) layer having 16×16 tiles and the second (attribute) layer having 8×8 tiles.
Each file begins with a header.
|UINT16LE mapWidth||Width of map, in 16×16 tiles|
|UINT16LE mapHeight||Height of map, in 16×16 tiles|
|UINT16LE bgColour||Background colour (EGA 0-15)|
|UINT16LE tileset||Number in tileset filename (e.g. 0x03 == back3.wr)|
|UINT16LE backdrop||Number in backdrop filename (e.g. 0x04 == drop4.wr)|
|UINT16LE startX||X-coordinate of starting position (in 8×8 tiles)|
|UINT16LE startY||Y-coordinate of starting position (in 8×8 tiles)|
|UINT16LE endX||X-coordinate of level exit door (in 8×8 tiles)|
|UINT16LE endY||Y-coordinate of level exit door (in 8×8 tiles)|
|UINT16LE gruzzleCount||Number of gruzzles in level|
|WR_COORD gruzzles[gruzzleCount]||Gruzzle coordinates (see below)|
|UINT16LE slimeCount||Number of slime buckets in level|
|WR_COORD slimeBuckets[slimeCount]||Slime bucket coordinates|
|UINT16LE bookCount||Number of books in level|
|WR_COORD books[bookCount]||Book coordinates|
|WR_COORD letters||Coordinates of letters in word to spell|
|UINT16LE animCount||Number of animated tiles|
|WR_COORD animations[animCount]||Animated tile coordinates|
The WR_COORD data type is defined as follows. As shown above it is preceded by a count, with the two fields (X and Y) being repeated that many times. If the associated count is zero, the WR_COORD structure is omitted entirely.
|UINT16LE x||X-coordinate (in 16×16 tiles)|
|UINT16LE y||Y-coordinate (in 16×16 tiles)|
The background layer of map data follows next. The data is stored in a basic and quite inefficient RLE coding. Data is stored as a pair of two bytes. The first byte is a count (often one) and the second byte is the value to repeat that many times. Values (second bytes) of 0xFF refer to transparent/background tiles. After expansion there will be mapWidth * mapHeight bytes/tiles.
Immediately following this is the attribute layer, again RLE compressed in the same manner. This layer uses 8×8 tiles instead, so after expansion there will be (mapWidth - 1) * mapHeight * 4 bytes/tiles. The tiles are positioned from X-coordinate 1 (rather than 0), so it is not possible to place tiles in the first column (where x is zero). However because the tiles are 8×8, those at x=1 still overlap the 16×16 background tile at x=0.
The level entrance and exit are also specified in units of 8×8 tiles. The entrance coordinates are of the bottom-middle of where the door image is drawn, and where the player's feet will appear. The exit coordinates are of the top-left of the door image. The door image is 32×40 pixels in size.
The tileset used is specified in the header (see above.) Each tileset is a 320×200 16-colour PCX file, divided up into 16×16 tiles.
The tile code in the background layer refers directly to an index in the tileset (so a value of 0 refers to the first 16×16 tile in the PCX file.)
Describe how animated tiles work
The tile codes in the attribute layer seem to be constants:
|0x00||First question-mark box|
|0x01||Second question-mark box|
|0x02||Third question-mark box|
|0x03||Fourth question-mark box|
|0x04||Fifth question-mark box|
|0x05||Sixth question-mark box|
|0x06||Seventh question-mark box|
|0x74||Standing tile (can jump up through it or press down to fall through it)|
|0xFD||Unknown (end of layer?)|
This format was reverse engineered by Malvineous. If you find this information helpful in a project you're working on, please give credit where credit is due. (A link back to this wiki would be nice too!)