Username:    Password:    Login
Main  Secrets  Links  Specs  Articles  Forum  News  Downloads  Utilities  SCUMM?  Games  Demos  Contact
Main  Secrets  Links  Specs  Articles  Forum  News  Downloads  Utilities  SCUMM?  Games  Demos  Contact

SCUMM file format specifications and documentation

The Really Useful SCUMM etc. Info File
Maniac Mansion .lfl-files
Additional .lfl info
AKOS format
Preliminary SAN documentation
Monkey Island 1 & 2 costume format
Monkey Island 2 costume format
Monkey Island 2 SCUMM opcodes
SCUMM index files
.bun file format
.lab file format
EMI .lab file format
EMI .til file format
GF/EMI .laf fonts file format
EMI mesh specs

(download file)


Multimedia format research based on ScummVM

* a chunked multimedia format possibly with several variations
* multi-byte numbers are little endian (always?)
* no: the chunk lengths are big endian
* chunks are marked by FOURCCs; known FOURCCs:
- ANIM
- AHDR
- FRME
- NPAL
- FOBJ
- PSAD
- TRES
- XPAL
- LACT
- STOR
- FTCH
- SKIP
- STRK
- SMRK
- SHDR
- SDAT
- SAUD
- iMUS
- FRMT
- TEXT
- REGN
- STOP
- MAP_
- DATA
- ETRS
* carries a payload comprised of different chunk types
* these chunk types are known:
- codec 1
- codec 37
- codec 44
- codec 47

* codec 1: RLE encoding:
- for each line in image height:
  - 16-bit number indicates encoded line size
  - while there are still encoded data bytes for this line:
    - next byte is code
    - length = code / 2 + 1
    - if bit 0 of code is set:
      - value = next byte
      - if value is 0:
        - skip (length) pixels in output
      - else:
        - put (value) in output (length) times
    - else:
      - for each count in length:
        - value = next byte
        - if value is 0:
          - skip pixel in output
        - else:
          - put value in output


* codec 37:
- assign width and height
- assign bw as block width
- assign bh as block height
- codec must operate on 4x4 blocks
- assign pitch as block width * 4 (not the same as width necessarily since 
block width is rounded up to nearest multiple of 4)
- assign chunk size as size of input chunk - 14
- allocate a buffer with that size
- read chunk_size bytes into new buffer
- sequence number LE_16 @ chunk[2]
- decoded size is LE_32 @ chunk[4]
- maskflags = chunk[12]
- make table with pitch and chunk_buffer[1] as index:
  - index *= 255
  - if (index + 254 < sizeof(table) / 2)
    - assert error condition
  - for i = 0..255
    - j = (i + index) * 2
    - offsettable[i] = maketable_bytes[j+1] * pitch + maketable_bytes[j]
- if (chunk[0] == 0)

- else if (chunk[0] == 1)
  - "missing opcode codec47" (?)

- else if (chunk[0] == 2)

- else if (chunk[0] == 3)

- else if (chunk[0] == 4)


* codec 44:
- iterate through the encoded chunk from 0 to size - 14 (?):
  - size of encoded line = next LE_16 in chunk
  - while size is not 0:
    - count = next byte
    - pixel = next byte
    - put (pixel) in output (count) times
    - if size of line is not 0 at this point:
      - count = next LE_16 + 1
      - copy (count) pixels from encoded stream to output
  - at the end of line, output buffer rewinds by one pixel (?)


* codec 47:
- chunk size = size of chunk passed in minus 14 bytes
- sequence number = first LE_16 of chunk
- encoded graphic data begins at chunk + 26
- the bytes at chunk[12] and chunk[13] serve as initializers for 
deltabufs[0] and [1] respectively
scumm.mixnmojo.com

RANDOM ARTICLE
Article


Google THIS SITE
Web
scumm.mixnmojo.com


FEATURED PROGRAM
SCUMM Revisited screenshot
SCUMM Revisited



HOT LINKS
ScummVM
Quick & Easy
SCUMM Hacking Forum
mixnmojo.com