ReadySoft scenes

From MultimediaWiki
Jump to navigation Jump to search

The company has created several PC ports of classic FMV games such as Dragon's Lair, Space Ace or Brain Dead 13.

While the formats for each game differ, there is a lot of common between them. For instance, they all employ RLE compression, splitting image into background and sprite and moving them separately.

Dragon's Lair scenes

Files start with 128-byte header, followed by chunks with the following header:

 2 bytes - some count
 4 bytes - chunk size
 4 bytes - unknown
 4 bytes - chunk type

Chunk type is a four-character code telling what kinds of data it has inside. First letter being 'A' means RLE-encoded inter frame while 'B' chunks contain raw background image and audio. Images are stored in VGA banked mode (i.e. every fourth column).

Space Ace scenes

Data is organised into chunks (32-bit next chunk offset plus 16-bit chunk ID) with the following meaning:

  • 0 - background
  • 1 - sprite
  • 2 - audio
  • 5 - frame output command?
  • 6 - VGA palette update (starts with 16-bit number of colours, 32-bit offset to palette data)

Background data starts with several 16-bit values: image translation vector (i.e. how to shift it up/left), update area X offset and width, update area Y offset and with. Then there are 32-bit image data size and offset (usually image starts immediately after the header). Image is coded with RLE: one-byte opcode, 0x80 means end of decoding, negative values mean run, 0x00 is no-op, positive values mean copy.

Sprite data starts with 16-bit coordinates, 32-bit mask offset and 32-bit data offset. Mask tells which 8x8 sprite blocks should be decoded and displayed over background.

Audio data starts with 32-bit size and offset.

Additionally images are coded for VGA banked mode (i.e. interlaced by every fourth column), in transposed form and background image has size 328x208.

Brain Dead 13 scenes

Data is organised into chunks (32-bit next chunk offset plus 16-bit chunk ID) with the following meaning:

  • 0 - background
  • 1 - sprite
  • 2 - audio
  • 5 - frame output command?
  • 6 - VGA palette update (starts with 16-bit number of colours, 32-bit offset to palette data)
  • 10 - some header chunk
  • 11 - audio header

Background data starts with three pairs of 16-bit values: image translation vector (i.e. how to shift it up/left), update area coordinates, update area dimensions. Then there are 32-bit image data size and offset (usually image starts immediately after the header). Image is coded with RLE: one-byte opcode, 0x80 means end of decoding, negative values mean run, positive values mean copy.

Sprite data starts with 16-bit coordinates, 16-bit update flag, 32-bit sprite data size and offset. Image data is coded in the same manner but with two enhancements: opcode 0x00 means long RLE with actual 16-bit operation length, and there are two special pixel values (0x00 mean leave pixel unchanged and 0xFF mean copying data from the background frame).

Audio data starts with 32-bit size and offset.