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. Some of the items use 8×8 coordinates while most use 16×16 coordinates.
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)|
|WR_COORD8||end||Level exit door location|
|UINT16LE||gruzzleCount||Number of gruzzles in level|
|WR_COORD8||gruzzles[gruzzleCount]||Gruzzle coordinates (see below)|
|UINT16LE||dripCount||Number of slime drips|
|DRIP_COORD||drips[dripCount]||Origin and speed of each slime drip|
|UINT16LE||slimeCount||Number of slime buckets in level|
|WR_COORD16||slimeBuckets[slimeCount]||Slime bucket coordinates|
|UINT16LE||bookCount||Number of books in level|
|WR_COORD16||letters||Coordinates of letters in word to spell|
|UINT16LE||animCount||Number of animated tiles|
|WR_COORD16||animations[animCount]||Animated tile coordinates|
|UINT16LE||fgCount||Number of foreground tiles|
|WR_COORD16||fgTiles[fgCount]||Coordinates of tiles the player should walk behind instead of in front of|
The WR_COORD data type is defined as follows. As shown above it is preceded by a count, and then repeated that many times. If the associated count is zero, the WR_COORD structure is omitted entirely. WR_COORD8 values are in units of 8×8 tiles, while WR_COORD16 values are in units of 16×16 tiles. A WR_COORD8 value of (1,2) will be at pixel position (8,16). A WR_COORD16 value of (1,2) will be at pixel position (16,32).
|UINT16LE x||X-coordinate (in tiles)|
|UINT16LE y||Y-coordinate (in tiles)|
Each DRIP_COORD is the same, but with a drip frequency as well:
|WR_COORD8 pos||Drip origin. Should be directly below an open pipe tile.|
|UINT16LE freq||Frequency of drips. 68 is continuous dripping, higher values drip less often. Values lower than 64 may be too fast for the game to draw correctly.|
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.)
Animated tiles are simply a list of coordinates (in the 16×16 space) of which tiles should be animated. The actual frames to use for the animation are hard-coded and cannot be changed, but vary with each tileset.
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!)