Dark Seed platform comparison

Dark Seed was a point-and-click adventure game from 1992. It was originally made for DOS but was ported to several different platforms over the following years.

Platform Release year
DOS (floppy) 1992
Amiga (floppy) 1992
Macintosh (floppy) 1993
Amiga CD32 1994
Macintosh (CD-ROM) 1994
DOS (CD-ROM) 1994
Windows 3.x 1995
Sega Saturn 1995
PlayStation 1995

It seems that the Macintosh port was influential, and served as the basis for the Saturn and PlayStation. The Amiga floppy disk version served as the basis for the Amiga CD32 version. The DOS floppy disk version served as the basis for the DOS CD-ROM version.

I haven't been able to examine the version released in Japan for Windows 3.1 to compare it with the DOS CD-ROM version.

DOS floppy DOS CD Amiga Macintosh Saturn PlayStation
Frame/border *FRAME.PIC *FRAME.PIC B1/B2/B3 Fram
Room picture ROOM*.PIC ROOM*.PIC R*A Room .PIC .PIC
Non-room picture *.PIC *.PIC N*A PicL, PicD
Music .SBR, .SIT .MID MX* Midi, Inst .TON, .SEQ .VAB, .SEQ
Sound effects .DIG .SFX SD* snd .PCM
Speech .VOC .VOC VC* , *.efx snd .PCM .PCM
Room moveability mask .ROM .ROM R*M
Fonts N03A, I* BFnt .FON .FON
Pointer images DS CURS DS.MP? DS.MP?
Inventory images I*
Room connections .ROM .ROM Rmdt .RMD .RMD
Object locations .ROM .ROM Rmdt .RMD .RMD
Sprite stencil/mask S*, R*S
Per-room sprites ROOM*.NSP ROOM*.NSP R*B, R*C, R*E, R*F Sprt .SPR .SPR
Sprite images .NSP .NSP N*B, N*C, W*, F* Sprt .SPR .SPR
Sprite positions and animation DS Objt
Frame-based animation .IMG, .ANM .IMG, .ANM M*A, M*B Movi .MOV .MOV
Palettes .PAL .PAL DS pltt
Messages TOSTEXT.BIN TOSTEXT.BIN DS STR# .STR .STR
Strings TOS.EXE TOS.EXE DS STR# .STR .STR
Credits START.EXE START.EXE DS STR# .STR .STR

DOS

Dark Seed for DOS seems to be based on a game engine (or entire game?) called "TOS", presumably the work of programmer Lennard Feddersen. From the manual:

The programming aspects required two programmers, Lennard Feddersen, who had been developing an engine for this type of game since September, 1990, and John Krause who constructed the promotional disk and the nightmare and title sequences.

There are several remnants of TOS in the Dark Seed for DOS files: the main game executable is called TOS.EXE and most of the strings in the game appear in TOSTEXT.BIN. A dragon-based logo for TOS as well as some icons for an editing tool are in the file TOSICONS.SPR which the Dark Seed game does not use at play-time (and were not included in all versions). Depending on version, there are also support files TOSFONT.OBT, TOSFONT.NSP, TOSICONS.SPR, TOSSTD.PAL.

The two programmers seem to have worked on two separate executables, with the "nightmare and title sequences" handled in START.EXE and the actual gameplay handled in TOS.EXE. The batch script START.BAT ties the two together so that when one exits the other begins.

Pictures

Dark Seed for DOS uses a somewhat unusual VGA graphics mode: 640x350 with 16 colors. The manual explains how this was negotiated with artist H R Giger:

Giger agreed to lend his artwork, provided Cyberdreams uses only high-resolution graphics mode, in order to avoid the "square and jagged" look of low resolution.

The two programs by (START.EXE and TOS.EXE) by the two separate programmers (Krause and Feddersen, respectively) each use their own image formats. START.EXE uses files called ".IMG" while TOS.EXE uses ".PIC" instead.

Still images

The picture files (".PIC") are compressed with a nybble-based run-length encoding scheme. Consider the file as a stream of 4-bit values, with each byte in the file representing two distinct 4-bit values: first the low-order nybble (x & 0xf), then the high-order nybble (x >> 4). This stream of values can then be interpreted as a sequence of "runs", either:

  • nybble representing the length of a solid run, followed by a single value to be repeated for that length, or
  • nybble representing the length of a literal run, followed by that many literal nybbles

Literal runs of length n + 1 are represented with the value n. So a value of 7 means the next 8 nybbles are literals (the longest literal run that this scheme can represent).

Solid runs of length n are represented with the sign-extended value -n + 1 (or, equivalently, 17 - n). So the value 8 (-7) means the next nybble is repeated 9 times, while the value 15 (-1) means that the next nybble is repeated twice.

IMG files

John Krause's START.EXE uses IMG files which are in a format similar to PIC but quite distinct from it. The compression is byte-based rather than nybble-based, and they have some header information at the start.

The file begins with a a two-byte header: uint16le size of the decompressed buffer. After decompressing, the decomprssed data begins with a five-byte header: height (in rows, uint16), bytes per row (uint16), and mode (int8).

Animations

This section is a stub.

START.EXE uses image (IMG) and animation (ANM) files, while TOS.EXE uses picture (PIC) and (NSP).

PREFS Description Resource names
E Ship leaves? left
H Third nightmare nm3
Y Born born
C Valves valves.anm
D Doll/embryo bdoll, embryo
G Doll/book bdoll, book
B Mirror/Dark Mike dmik
Z End
I Intro

Sprites

This section is a stub.

NSP files (aNimated SPrite?) start with 192 bytes, or more specifically 96 pairs of bytes. Each pair of bytes represents the size of an image frame.

These 96 size pairs are followed by 0x60 image frames, each of which has its size the calculated size s.

An empty/unspecified image is 0x01 0x01 (1 width, 1 height) with the body byte being 0xff. Most images in most files are empty.

The matching OBT files are in a different format, containing information to animate the sprite frames.

OBT files (object transformation?) contain exactly 20 "objects" (animation information), and are mostly empty. They are a fixed size, regardless of how much is used.

Each object (animation) starts with a byte that counts the number of meaningful frames of movement in the animation. Then 20 frame steps (mostly empty). Each frame step is 8 bytes: delta X (one byte for x-direction, two bytes for distance), delta Y (three bytes, same structure as X), sprite number to move (byte), tick duration (byte).

All of the OBT files are the same fixed size ( 20*(1+(20*8) = 3220 bytes) except for four smaller ones: ROOM2.OBT (for room "SECRET1"), ROOM3.OBT (for room "SECRET2"), ROOM56.OBT (for room "ARCHIVES") and MIRROR.OBT. Each of these is 3072 bytes long.

TODO: Check how the shorter OBT files are handled. Does the loader ask for less data, or perhaps simply handles an early finish?

Palettes

The palettes are stored in files with the extension ".PAL". The format is straightforward and maps very closely to VGA hardware. There are two sizes: most are 16-color palettes (stored as 48 bytes), and also a few 256-color palettes (stored as 768 bytes) but these seem to be unused in the game.

Each of the sixteen entries is three bytes: one byte for red, one byte for green, one byte for blue. The maximum value is 63. Thus pure white is represented as (63, 63, 63), pure black as (0, 0, 0).

Each room has its own palette file but many of them are complete duplicates.

Sound and music

Later (CD-ROM) versions of Dark Seed for DOS used standard MIDI files for music and Creative Labs "Voice" files for sound effects and speech. The speech files have the usual ".VOC" file extension and the sound effects use the alternative ".SFX" name.

Earlier (floppy) versions of Dark Seed for DOS provided music and sound in other formats to work with various hardware at the time. The three options are the basic PC speaker, AdLib, and Sound Blaster.

Music

This section is not fully researched.

Musical sequences are in SBR files and the instrument definitions are in a matching SIT file. There are also some PCS files, too, but they are loaded even when using SoundBlaster or AdLib sound, suggesting they are not just for the simple "PC speaker".

There are some DIG files to match many of the music pieces. Presumably these are "digital sound" definitions of some sort.

In PC Speaker mode, the PCS and DIG files are loaded together.

  • TOS1.NAM contains musical instrument names

SBR musical sequences

This section is not fully researched. After I published this initial research, it has come to my attention that user "crampen" has since researched and implemented a lot of SBR music in ScummVM's Dark Seed engine. Any future updates to this section will likely draw from crampen's work.

SBR files are laid out in tracks. The first byte is something that applies to the whole track, perhaps instrument number. Then follows a series of six-byte tuples. The musical note is the sixth byte, and the track ends when that byte is zero.

Thus a sequence of mostly-ascending bytes like the following:

01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11 12 00 13 14 15 16 17 18 00

can be interpreted like the following four notes across two tracks:

channel? volume? ?? duration? percussion? voice? pitch?
01 02 03 04 05 06 07
(01) 08 09 0a 0b 0c 0d
(01) 0e 0f 10 11 12 00 (end)
13 14 15 16 17 18 00 (end)

Pitch seems to be MIDI-style, with middle C note at decimal 60 and 61 a semitone above that. A pitch of zero ends the track (the first two values are also treated as zeroes for this case). A rest seems to be indicated with a pitch of 02.

The second column is almost always zero, but sometimes there are some non-zero values at the start (like 02) or at the end (like 05). A 02 at the start is sometimes followed by 08 or 09, but usually 00 or 02. No values are higher than 09.

The third column appears to be duration/delay. Presumably there is a tempo somewhere or all the files use the same interpretation of delay.

The fourth column is also usually zero, and never more than 09, but it has wider variety of values and patterns. A few tracks have 01 at somewhat regular intervals, sometimes even a series of 010101... Perhaps it is a percussion line?

The fifth column is sometimes all zeroes but is usually a single value repeated for the entire length. The value is never more than 0x6e (110). It sometimes ends with 05 and sometimes starts with 05 and perhaps another different byte after that. Perhaps it is instrument/voice number?

Speech

The recorded voice sounds provided in Creative Labs' "Voice" (.VOC) format (unsigned 8-bit PCM at 8000 Hz).

These are played properly in SoundBlaster mode, less well with AdLib, and presumably not at all with the PC speaker.

Sound effects

The earlier versions of Dark Seed for DOS distributed on floppy disk play sound effects as if they were short musical pieces, combined in the files called TOS1.nnn.

The instructions for playing the sound effects is in the same format as music and instruments. Sound effects for the PC speaker are presumably in TOS1.PCS. Further research suggests that those aren't the assignments.

  • TOS1.PCS
  • TOS1.SBR (used for AdLib sound effects)
  • TOS1.DIG (used for PC speaker sound effects)

The file TOS1.NTE contains a list of 120 sound effect names as null-terminated strings. Some are blank or the string "FREE", and the first dozen or so are repeated later around position 90.

The later CD-ROM version of Dark Seed for DOS plays recorded sound files called .SFX but their contents are in the standard Creative Voice (.VOC) format. All the sounds are 8-bit unsigned PCM data. Most (45) of these SFX are at 22727 Hz, while a few (PULSAR, KNOCK, POP, and POPII) are at 11235 Hz. The sounds do not all perfectly correspond, either: for example, there is no footstep sound effect in the CD-ROM version

PC Speaker sound effects

TOS1.DIG contains the PC speaker definitions of 120 sound effects, although many are empty.

Each sound has three bytes of header data (one byte for type, int16le length including header). If the type is 2 or 3, the length is considered 15 bytes (3 bytes of header + 12 bytes of payload).

Not yet researched: The payload may be a time series of PWM.

String lists

The credits text is embedded as data in START.EXE, and the names of objects are embedded as data in TOS.EXE. Most of the in-game messages are read from an TOSTEXT.BIN.

The format of TOSTEXT.BIN begins with an ordered series of little-endian uint16 offset values. Each one of these offset values point to the start of a text string later in the file. The offset value is an absolute position within the file.

The series of bytes at the start of the file:

a6 07 d4 07 f6 07 ...

Can be read as a series of little-endian integers:

  • 0x07a6
  • 0x07d4
  • 0x07f6

Which in turn can be used as file offsets to find a line of text:

0x07a6: "You have dared touch an Ancient! You die!\r\n"
0x07d4: "Fido takes a chunk of your head\r\n"
0x07f6: "The fleshy stalk"...

Amiga

The Amiga (floppy disk) and the Amiga CD32 versions are technologically similar to each other, but quite different to the other platform ports.

The game uses a graphical resolution of 320x400 (interlaced) for both editions. It had fewer (wider) horizontal pixels than the DOS game and also a coarser palette (4 bits per color channel compared to the 6 bits that DOS VGA provided).

The CD32 version has many of the same files as the Amiga floppy disk version, although with many more voice samples.

Many of the files are compressed. The "MCP" header magic number is an indicator of compression, as is "MDCS".

Executable

The file called ds (or sometimes DS) is the main executable for the Amiga. It is the format that was standard on the platform at the time, a format which lacks a formal name but is sometimes called "old-style Amiga executable", "LoadSeg" or "hunky" format.

It consists of a number of distinct "hunks", some of which are code, some data, and some a mix of both.

The English floppy disk demo and full version look much the same:

hunk content
0 main game code, and supporting data
1 main game data: message tables, disk allocations, character encoding
2 graphics data: coprocessor (copper) lists and support, pointer icons
3 graphics code and variables
4 game data
5 game data: messages, item names
6 disk io code
7 MaxTrax music/sfx variables
8 MaxTrax music/sfx code

In some versions, like the CD32 edition, MaxTrax variables and code appear in single hunk together.

Pictures

Files with that begin with the header magic number "MCP" (M's Compressed Picture, perhaps?) are, once decompressed, in a suitable format for blitting to the Amiga graphics hardware.

offset value used for
0-2 'M' 'C' 'P' file type identification
3 0x11, 0x14 number of bitplanes (1 or 4)
4-5 0x0100 width
6-7 0x00e5, 0x0074 height

The header is eight bytes. The low-order nybble of the fourth byte is either 1 or 4, and shows the count of bitplanes. A single bitplane file can be decompressed as a single stream.

The following two 16-bit values represent width and height respectively. The width is rounded up to the next multiple of 16 then divided by 8 and stored as a count of bytes per line. The height is multiplied by half of the width and the result is stored as the number of 16-bit words per bitplane. In the case of a single bitplane, that number (height times width-rounded-up divided by 16) is the number of words in the whole decompressed file.

In the case of multiple bitplanes, the decompression result is allocated first to the first (lowest-order) bitplane until it fills up (at a 16-bit word boundary). The next bytes to be decompressed fill up the second bitplane, until it fills up, and so on until all four are filled. These filled bitplanes are all the same size, and can be converted to so-called "chunky" format of one-byte-per-pixel palette indexes using an established "planar to chunky" conversion algorithm.

Here are the header bytes of some example files and their expected decompressed size:

approximate decompressed size sizing bytes (hex)
r00s 7786 M C P 11 . 01 10 . 00 e5
r00m 7328 M C P 11 . 01 00 . 00 e5
r00a 29312 M C P 14 . 01 00 . 00 e5

The compressed body (LZSS)

After the eight-byte MCP file header, the actual compressed bytes follow, starting with a byte of eight "control flags".

The compression is a kind of LZSS (Lempel-Ziv Storer-Szymanski) with some idiosyncracies. Some particular parameters:

  • Control flags are stored in 8-bit sequences
  • The most significant bit in the control flag byte controls the first item after the control byte
  • The window is 4096 bytes, initially seeded with some particular content:
    • 256 bytes of descending values (255, 254, ..., 1, 0) starting at offset 0x3e8 (1000 decimal)
    • 256 bytes of ascending values (0, 1, 2, ..., 255) starting at offset 1256
    • everything else zero bytes (but probably not much of it referenced)
  • A control flag set (1) means copy a single literal byte into the window
  • The first byte written to the output buffer is written to the start of the window
  • A control flag clear (0) means that the next two bytes are a reference
  • References are two bytes arranged as a 12-bit offset, and a 4 bit length
  • Reference lengths are 2-17 (low-order nybble of the second reference byte, plus one)
  • Reference offsets are byte indexes into the 4096-byte window
  • The reference bits are interpreted such that the two-byte reference 0xAB 0xCD is offset 0xABC of length 0xD+1

Palettes

The Amiga floppy disk and Amiga CD32 version of Dark Seed both use 16-color (4-bit) palettes. Each of the 16 entries is a 16-bit number: 0xfff is bright white, 0x000 is pure black. The palettes are stored as data in the game executable rather than in a separate file.

There is a default palette and a table of 8 alternate palettes. The table of alternate palettes is 256 bytes: 8 palettes of 16 entries. There is a different table of data elsewhere in the executable which you can use to calculate which palette to load for each resource.

ID Disk Palette
"B1" 1 0x00
"M00A" 0 0xcb
"N10L" 3 0x12
"R10A" 2 0x04

Resource IDs are 32-bit numbers that can also be treated as four-character ASCII filenames ("R10A" is 0x52303141).

Resources with a zero palette byte: No modification.

Resources with a "positive" palette byte (0x01-0x7e): Standard with modification. The second-highest palette entry is replaced with a value from a 63-entry lookup table.

Resources with a "negative"/high palette byte (0x80-0xff): A specific alternate palette. The number of the alternate palette can be calculated using (x + 5) % 8 where x is the byte in the lookup table and % is the remainder after division.

Sprites

Smaller image overlays and updates are stored as flat images in the additional materials files. They are pictures in the same MCP (compressed picture) format as the room pictures.

The coordinates and parameters for which parts of the image data are used, as well as animation timing, live in the executable file (see Object data).

Sprite image file R00B, bed animation, phone animation, open door overlay

R00B stores the sprite image data for room 0, but not all rooms have such image data. Room 1 has none at all, while room 31 has several separate images for different sprites: R31B (stick), R31C (Delbert throwing), R31D (dog), R31E (Delbert walking and drinking), and R31F (Delbert standing).

Sprite image file R31B, stick
Sprite image file R31C, Delbert throwing
Sprite image R31E, Delbert walking and drinking

The image data for player walking sprites is stored in the resource file W1 (light world) and W2 (dark world). Likewise, the image data for the player falling is stored in resources F1 (light world) and F2 (dark world).

Sprite image W1, light world walking player sprites

The styled font used for the opening credit sequence is a sprite too, stored in N03A. The main font for message text in the game is stored in the same file as the inventory pictures: I1 (light world) and I2 (dark world).

Sprite image N03A, credit sequence font
Sprite image I1, light world inventory and font
light dark use
I1 I2 inventory items and main font
W1 W2 player character walking animation frames
F1 F2 player character falling animation frames

Sprite animations ("Object")

The Amiga game executable contains some of the same animation information that is called "Objt" in the Macintosh port and .OBT files for DOS.

  • Byte: sprite number
  • Byte: x
  • Byte: y
  • Byte: count1
  • Byte: count2

Then a series of:

  • byte: xdelta
  • byte: ydelta

Sound and music

Sound effects

Short "sound" resources (a clock ticking, glass breaking, etc) are stored without compression in files called SD01, SD02, etc. These sounds are identical on the Amiga floppy disk and CD32 version, but the CD32 has one additional sound file (SD17).

These short files are "encoded" as PCM data using the "signed 8-bit" number format, plus a small 4-byte header at the start. The header bytes are simply:

offset meaning
0-1 magic number identfier ("SD")
2-3 uint16 (big-endian) size of the buffer to allocate
4 raw int8 PCM samples

These sounds are played back with a specific "period", usually 851, which is equivalent to a sample rate of 4167 Hz (based on PAL timings) to 4206 Hz (based on NTSC timings). One sound, SD02, is played with a period of 428 instead, equivalent to a sample rate of 8287 Hz (PAL) or 8364 Hz (NTSC). Some sounds are played in a loop.

file dist special? DOS Mac description
SD01 in demo looped
SD02 in demo sample rate (period 428 instead of 851)
SD03
SD04 13004 Doorbell
SD05
SD06
SD07 in demo Tick?
SD08
SD09
SD10
SD11 in demo
SD12 in demo
SD13 Tune in radio
SD14
SD15
SD16
SD17 CD only
SD18
SD19 looped
SD20 23 3020 Digging
SD21
SD22
SD23
SD24
SD25
SD26
SD27 looped
SD28 3028 Make hammer
SD29 Evil beast
SD30 Laser
SD31
SD32
SD33
SD34
SD35
SD36 sunset bird?
SD37
SD38
SD39

Voice/speech messages

Longer "voice" data is stored with the same compression algorithm as the picture resources (LZSS) in files called VC01 (for the Amiga floppy disk version) or 001.efx (for Amiga CD32). The floppy disk edition has 24 voice files for the player character interacting with other humans (etc). The CD edition contains hundreds of these voice files, replacing or supplementing almost every message string in the game.

These long "voice" files are laid out in the following shape:

offset meaning
0-3 magic number identfier ("MDCS")
4-7 uint32 (big-endian) size of the buffer to allocate
8 LZSS compressed data

After decompression, the sounds are raw PCM samples in signed 8-bit format. They are played at a fixed sample rate per edition. Around 8kHz for the floppy disk "VC" files and around 11kHz for the CD "efx" files.

Edition period equivalent sample rate
Floppy disk French 447 7935 Hz

These speech sounds are played back with a fixed "period" of 317, which is equivalent to a sample rate of 11188 Hz (based on PAL timings) or 11291 Hz (based on NTSC timings).

Amiga floppy file efx DOS floppy file speaker meaning
VC01 928 CL1.VOC shop clerk serve
VC02 906 CL2.VOC shop clerk last bottle
VC03 907 CL3.VOC shop clerk sorry
VC04 908 D4A-1.VOC Delbert introduces himself
VC05 909 D6C-2.VOC Delbert offers card
VC06 910 D5A-1.VOC Delbert follow
VC07 911 D6A-2.VOC Delbert drinks
VC08 917 G10A-1.VOC Sargo introduce
VC09 918 G10B-1.VOC Sargo gift
VC10 925 GL2A.VOC librarian card with book
VC11 925 GL3A.VOC librarian book hold
VC12 923 K15A-1.VOC Keeper remember mirror
VC13 914 K9A-3.VOC Keeper greetings
VC14 915 K9C-3.VOC Keeper if born
VC15 916 K9E-3.VOC Keeper also police
VC16 905 M1-1.VOC (multiple) phone chat
VC17 920 O12A-1.VOC radio hint steal
VC18 921 O13A-1.VOC radio hint reflect
VC19 922 O14A-1.VOC radio hint turn
VC20 924 S16A-1.VOC cop2 gun
VC21 913 S8A-2.VOC cop arrest
VC22 926 GL0A.VOC librarian not sure why i'm here
VC23 927 GL1B.VOC librarian strange prescription
VC24 919 M11A-1.VOC Mike understand

It seems the German floppy disk version may have some differences.

German floppy file differences
VC04 card in VC04 instead of VC05
VC05 invite in VC05 instead of VC04
VC12 (not used? perhaps skipped entirely.)

TODO: Check to see how the German floppy disk version behaves.

The efx speech files on the compact disc version match to printed game messages. The efx files start at 001.efx while the internal code starts at 0.

Music

Music is stored in files matching the pattern MX00, and begin with the magic header "MXTX". This the same header as MaxTrax module format, and in fact these files can probably be played with a MaxTrax module player.

The mapping of which music plays in which room is stored in the game executable as a linear table of bytes.

Rooms

The "R00A" file holds the static picture for room 0 in the same format as the other game graphics.

Sprite image file R00A, room 00 base image

Room data

The "R01M" file holds the movement mask for Mike, the player character, in room 1. It is a single-bitplane image the same size as the room picture, and distinguishes between the places Mike can move to (bit set) and cannot move to (bit clear). All (or at least most) rooms have a movement mask.

Image file R05M, Mike's movement map for room 5. It shows a black-and-white version of the upstairs hallway. Only the parts corresponding with the floor are filled in.

The "R01S" file doesn't exist because room 1 doesn't have a room-specific sprite stencil. It uses the general light-world sprite stencil S1. Room 5, the upstairs hall, does have a room-specific sprite stencil. It is a single-bitplane image the same size as the room picture. Only the pixel locations with bits set in the stencil will draw through. This allows a sense of layered depth, letting the sprites appear to go "behind" parts of the picture.

Image file R05S, sprite stencil shape image for room 5. It shows a black-and-white image of staircase railings.

Room objects

This section is a stub.

The locations of in-game clickable objects seem to be stored somewhere in the game executable, but I don't yet know the location or format.

Likewise, room connections are still unknown to me.

In both cases, I have a hunch that the data is in the same "hunk" of the executable as most of the game variables, but I haven't confirmed anything yet.

String lists

The Amiga editions do not store string lists in separate files, but rather as data in the game executable file.

There are two string lists:

  • a big one with response messages (001-997), matching the efx speech
  • a small one with item names and credits (0-301)

Both the string lists are in the same "hunk" of the executable, the final hunk.

A string list is stored as a big block of strings are provided concatenated together without any dividing marker. After the strings have finished, there is a separate numerical list of each string's starting position within that concatenated block.

NothingBoxHandQuestionCtrlcrowbarjournalscotch
^      ^  ^   ^       ^   ^      ^      ^
0      7  10  14      22  26     33     40
string number offset string
0 0 "Nothing"
1 7 "Box"
2 10 "Hand"
3 14 "Question"
4 22 "Ctrl"
5 26 "crowbar"
6 33 "journal"
7 40 "scotch"

There is some special handling for messages 977-999. These are formatted messages stored in a somewhat unusual form.

The table is located in the data hunk after the encoding table. The table is 128 bytes long, and covers 25 messages. The game uses this table to assemble multi-part messages such as those that mention a held item. 22 rows of 5 bytes each, then some more rows of 6 bytes each. Each row represents a combined message, with each byte representing a segment. The byte 0xff signals the end of the message. The byte 0xfe represents string 0x10d, which is "You see the ". Byte values 0-3 are replaced with object names for the held object, the interacted object, and something else like that.

The first composite string (in the English CD32 version) is the byte sequence EC 01 FF FF FF. This two strings, entry 0xec in the smaller string table ("This sentry cannot be stopped with a"), the name of the object being held. The first 0xFF byte signals the end of the sequence, the others are unused.

This is equivalent to "This sentry cannot be stopped with a ^1." as used in the Macintosh port of Dark Seed.

The next composite string is the byte sequence CA 00 EB FF FF. This is three strings, with a different placeholder. The first and third byte represent entries in the smaller string table (0xCA is "The", 0xEB is "has no effect on the alien tubes."). The 00 value is a a placeholder for the the object being held.

This is equivalent to "The ^0 has no effect on the alien tubes." as used in the Macintosh port of Dark Seed.

TODO: confirm the difference between 0 and 1 placeholders.

Text character encoding (accents etc)

All strings in the string table are encoded in a subset of ISO-8859-1. The English editions don't use anything beyond ASCII (and in fact a quite limited subset of ASCII) while the French, German, and Spanish translations make use of language-specific characters. All use the same encoding and font. The main game font "sprites" (I1/I2) only provide images for up to 104 of the 256 possible byte values. Character code points are mapped to font "sprites" in a table in the game executable.

Sprite image I1, light world inventory and font

The ASCII upper-case letters, lower-case letters, and numerals are all present. Some limited ASCII punctuation is provided:

Hex Char
21 !
22 "
27 '
2C ,
2D -
2E .
3A :
3F ?

The floppy disk editions provide ASCII slashes too:

Hex Char
2F /
5C \

The ISO-8859-1 subset beyond ASCII are these:

Hex Char Description
A1 ¡ INVERTED EXCLAMATION MARK
BF ¿ INVERTED QUESTION MARK
C4 Ä LATIN CAPITAL LETTER A WITH DIAERESIS
CB Ë LATIN CAPITAL LETTER E WITH DIAERESIS
D6 Ö LATIN CAPITAL LETTER O WITH DIAERESIS
DC Ü LATIN CAPITAL LETTER U WITH DIAERESIS
DF ß LATIN SMALL LETTER SHARP S
E0 à LATIN SMALL LETTER A WITH GRAVE
E1 á LATIN SMALL LETTER A WITH ACUTE
E2 â LATIN SMALL LETTER A WITH CIRCUMFLEX
E4 ä LATIN SMALL LETTER A WITH DIAERESIS
E7 ç LATIN SMALL LETTER C WITH CEDILLA
E8 è LATIN SMALL LETTER E WITH GRAVE
E9 é LATIN SMALL LETTER E WITH ACUTE
EA ê LATIN SMALL LETTER E WITH CIRCUMFLEX
ED í LATIN SMALL LETTER I WITH ACUTE
EE î LATIN SMALL LETTER I WITH CIRCUMFLEX
F1 ñ LATIN SMALL LETTER N WITH TILDE
F3 ó LATIN SMALL LETTER O WITH ACUTE
F4 ô LATIN SMALL LETTER O WITH CIRCUMFLEX
F6 ö LATIN SMALL LETTER O WITH DIAERESIS
F9 ù LATIN SMALL LETTER U WITH GRAVE
FA ú LATIN SMALL LETTER U WITH ACUTE
FB û LATIN SMALL LETTER U WITH CIRCUMFLEX
FC ü LATIN SMALL LETTER U WITH DIAERESIS

The following translation table shows mappings (and non-mappings, marked as ..):

x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF
0x .. .. .. .. .. .. .. .. .. .. 3d .. .. .. .. ..
1x .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..
2x 4b 34 35 .. .. .. .. 36 .. .. .. .. 37 3a 38 4c*
3x 41 42 43 44 45 46 47 48 49 4a 3b .. 3c .. .. 39
4x .. 1a 1b 1c 1d 1e 1f 20 21 22 23 24 25 26 27 28
5x 29 2a 2b 2c 2d 2e 2f 30 31 32 33 4d* .. .. .. ..
6x .. 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e
7x 0f 10 11 12 13 14 15 16 17 18 19 .. .. .. .. ..
8x .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..
9x .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..
Ax .. 66 .. .. .. .. .. .. .. .. .. .. .. .. .. ..
Bx .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. 65
Cx .. .. .. .. 58 .. .. .. .. .. .. .. .. .. .. ..
Dx .. .. .. .. .. .. 5e .. .. .. .. .. 5f .. .. 67
Ex 53* 60 51* .. 52 .. .. 54 56* 50 55* .. .. 61 57 ..
Fx .. 64 .. 62 5a* .. 5b .. .. 5d* 63 5c* 4f .. .. ..

Most versions of Dark Seed for Amiga use a similar font image and a similar table. Some versions have differences like the ones marked * in the table (for example, the French floppy disk).

The encoding table is located in data hunk after the file resource table (which file is on which disk) but before the five-stride array (which starts with the byte sequence fe01ffffff, ec01ffffff).

A separate table holds the width (in pixels) of each glyph. Most are 6 pixels wide but the letter 'l' is only 2.

Movies

The four resources called M00B, M01B, M02B, M03B each have the signature MDA and seem to represent full-screen animations.

These files have a header structure not unlike MCP.

The low-order nybble of the fourth byte (offset 3) is used for the number of bitplanes. (All four files have the value 4 here, for 4 bitplanes). The higher-order nybble (always 1 in these files) is used to calculate bytes ber bitplane with the following algorithm: (x + 1) * 2

The next four bytes are interpreted as 16-bit integers (big-endian) are width and height. Always 320 width and 400 width.

The rest of the file is structured as follows:

  • MSB word, COUNT, count of the upcoming chunk of data bytes
  • one byte indicating which bitplanes to update
  • another byte (padding, seemingly ignored)
  • COUNT bytes of difference data for the frame in the format described below

Each frame is structured as follows:

  • changes for bitplane 0
    • five bytes (40 bits)
    • a series of byte-column row changes
  • changes for bitplane 1
    • five bytes (40 bits)
    • a series of byte-column row changes
  • changes for bitplane 2
    • five bytes (40 bits)
    • a series of byte-column row changes
  • changes for bitplane 3
    • five bytes (40 bits)
    • a series of byte-column row changes

Each bit in the five-byte stretch at the start of each bitplane represents a "byte column" (8 pixels) in the picture. If there are no changes to this bitplane in this frame, these bits will all be clear. If the first (highest-order) bit is set, the leftmost "byte column" has changes in this frame -- that is, some of the left-most 8 pixels have changed value.

For each column bit set, there will be a set of row updates. These follow in order directly after the byte column change summary.

  • count of upcoming row updates, each of which has:
    • byte (uint8) for row count which is is split:
      • high bit clear means changes are included
      • high bit set means no changes to row count rows
      • remaining bits are the actual row count (RC)
    • Series (length RC) of bytes of of data to be XORed

Files

filename magic count on floppy/CD purpose format
R00A "MCP" 1,4 65 room pictures custom LZSS-style compress
R00B "MCP" 1,4 48 room sprites ?
R00C "MCP" 1,4 10 ? ?
R00D "MCP" 1,4 5 alternate room sprites ?
R00E "MCP" 1,4 1 ? ?
R00F "MCP" 1,4 1 ? ?
R00M "MCP" 1,1 60 per-room movement mask (where the player can walk) compressed bitplane (1 bit per pixel)
R00S "MCP" 1,1 19 per-room stencil for sprite drawing ?
N00A "MCP" 1,4 5 misc pictures, font
N00B "MCP" 1,4 11 picture alternate sections ?
N00C "MCP" 1,4 1 ? ?
N00D "MCP" 1,4 14 pictures, dark ?
N00L "MCP" 1,4 16 pictures, light ?
B0 "MCP" 1,4 3 border picture around room picture
F0 "MCP" 1,4 2 falling sprites for player character
I0 "MCP" 1,4 2 inventory and game font
S0 "MCP" 1,1 2 per-world stencils for sprite drawing compressed bitplane (1 bit per pixel)
W0 "MCP" 1,4 2 walking sprites for player character
M00A "MCP" 1,4 3 movie start screens
M00B "MDA" 4 full-screen animations?
MX00 "MXTX" 19 Music MaxTrax music modules like the Legend of Kyrandia
SD00 "MS" 35/36 sounds 8-bit signed PCM at a fixed sample rate (around 8000)
VC00 "MDCS" 24/0 voice/speech
000.efx "MDCS" 0/670 voice/speech Same LZSS compression as MCP but with simpler, byte-size header
file content
N01A nightmare picture doll head machine
N03A font for credits etc
N04A travel book (light) compression seems askew
N18A doll in box
N19A mirror reflection
M00A opening credit frame and background
M01A nightmare implant picture
M03A sideways mike mirror picture
N00D menu screen
N02D business card (dark border?)
N03D MaxTrax licensing credit
N05D Blueprints (dark border)
N09D Library card (dark border)
N12D journal scrap (dark border) "I know that I am doomed"
N15D binocular view (dark)
N16D diary ripped (dark) "After I moved into this house"
N20D journal scrap (dark) compression seems askew; "made it into a tool"
N21D evil plans
N23D ??? dark compression seems askew
N24D ??? goggle face dark
N25D ??? li face dark
N26D ??? mask face dark
R07D animation frames for breaking mirror
R16D animation frames for handing (payment?)
R30D animation frames for guard handing
???D couldn't see
R53D fido stick animation frames
N08L box with note compression seems askew
N09L library card (light)
N10L better homes and cellars interlaced
N11L mover's note interlaced
N12L journal "I know that I am doomed", compression seems askew
N13L newspaper interlaced
N14L shard with note interlaced

Many of the files are exactly the same between the Amiga floppy disk version and the CD32 version. There may be some language-specific changes in pictures (like the newspaper, the note from the movers, etc).

Macintosh

The Macintosh version seems to be adapted from the DOS version but significantly reworked for the platform.

It uses the Macintosh "resource" system for pretty much everything.

Resources in Dark Seed

ResType # names purpose format
"PicL" 23 "Library Card Light", "Save Screen Light" Light pictures
"PicD" 13 "Library Card Dark", "Save Screen Dark" Dark pictures
"Fram" 6 "LightFrame", "Nightmare 1 Frame" Graphical frames surrounding other images
"pltt" 95 "ROOM08.PAL", "BNOC.PAL", "StdDarkPal" palettes
"snd " 97+ "Boy, that's smooth", "short english horn" Sound data AIFF-style, encoded as PCM-u8 or MACE3
"Sprt" 102 "ASPIRIN.NSP", "ROOM08.NSP" Sprite animations
"Rmdt" 66 "rmMasterBedroom", "rmFrontOfHouse" Room data Custom format described by a TMPL resource
"Objt" 106 "ASPIRIN.OBT", "ROOM08.OBT" Room object data Custom format described by a TMPL resource
"TMPL" 2 "Objt", "Rmdt" Resource templates Standard Macintosh template resource format with Resorcerer extensions
"STR#" 9 "Credits", "English Item Strings" Strings Standard Macintosh string resource format (Pascal-count)
"Movi" 26 "Nightmare 1c", "SpaceLetters c" Animations
"Inst" 40 "Song 1 Instruments" Instrument definitions for music
"Midi" 20 "Baby Doll Morph" Music sequences Standard MIDI file

A credit image says "Darkseed Macintosh developed and programmed by Brian Fitzgerald", and that name appears in other credits.

It seems to have been built with "THINK C" and AppMaker, and some debugging/development information seems to have been left behind. (A happy accident for digital preservationists.) An icon says "THIS SPACE FOR RENT", presumably as a joke.

Templates

Macintosh resource management tools like ResEdit and the third-party Resorcerer use template resources (with the ResType "TMPL") to provide a convenient user interface for resource data.

The format of TMPL resources is documented in the official Macintosh ResEdit Reference from Apple, and the Resorcerer Template Information has information on some extended structures that Resorcerer provides.

Pictures

Dark Seed uses at least four different resource types for graphic data ("PicL", "PicD", "Fram", "Room"), but they all seem to be encoded in the same way.

It presumably uses compression, perhaps similar to the compression used in Dark Seed for DOS (nybble-based run-length encoding) or Dark Seed for Amiga (LZSS).

The window frame pictures ("Fram" resources) come in two sizes, one default and one for 12-inch displays (presumably targeting a 512x384 resolution instead of the default 640x480).

TODO: Research the actual storage format and compression.

Palettes

Many resources with ResType "pltt" have names closely tied to the DOS version of Dark Seed ("ROOM04.PAL", "LIB-BABE.PAL"). The format seems to be a 16-bit big endian count of entries, then 16 bytes for each entry. An entry is mostly zeroes. Three of the bytes are not zero, and I presume then to be a byte each for red, green and blue.

Most of the palettes seem quite similar to each other, or even exactly the same.

Sprites

The resources with ResType "Sprt" are sprite animations.

They have names quite closely tied to the DOS version of Dark Seed ("ASPIRIN.NSP", "RM10STAIRS.NSP", "ROOM04.NSP") and are often similar in size to the DOS editions too. They presumably represent much the same data as the DOS ".NSP" files but have such different byte values that the data must be structured differently.

Rooms

The "Room" resources appear to hold the per-room static picture in the same format as the other game graphics.

Room data

The resource templates tell us the structure to interpret "Rmdt" room data:

  • one-based count for list of links, where each item has:
    • destination (UBYT, unsigned decimal byte) - presumably room number
    • direction (UBYT, with four cases: enum up=0, right=1, down=2, left=3)
    • x and y (each a DWRD, decimal word)
    • width and height (each a UBYT)
  • one-based count for list of objects, where each item has:
    • type (UBYT, unsigned decimal byte)
    • object (UBYT)
    • object x, y, width, height (each a DWRD, decimal word)
    • depth (UBYT)
    • sprite (UBYT)
  • one-based count for list of polygon points, where each item has:
    • point ("PNT ", 4-byte QuickDraw point; a pair of DWRDs?)

The shortest Rmdt resource is ID 1030, with the name "rmPrisonCell". It corresponds to ROOM30.ROM in Dark Seed for DOS.

000000020129013700BC000C000C002900BD01BE006C0038006E000000040140008200FD00AF00FD01B8014001E5

0000 one-based count of links
     (no links)

    0002 one-based count of objects

        01 object 1 type
          29 object 1 number (ITEM_TIN_CUP)
            0137 object 1 x
                00BC object 1 y
                    000C object 1 width
                        000C object 1 height
                            00 object 1 depth
                              29 object 1 sprite

                                00 object 2 type
                                  BD object 2 number (ITEM_CELL_BARS)
                                    01BE object 2 x
                                        006C object 2 y
                                            0038 object 2 width
                                                006E object 2 height
                                                    00 object 2 depth
                                                      00 object 2 sprite


                                                        0004 one-based count of polygon points

                                                            01400082 point 1 (320, 82)
                                                                    00FD00AF point 2 (253, 175)
                                                                            00FD01B8 point 3 (253, 440)
                                                                                    014001E5 point 4 (320, 485)

Object data

The resource templates tell us the structure to interpret "Objt" object data:

  • one-based count for list of objects, where each item has:
    • one-based count for list of frames, where each item has:
      • x vector and y vector (each a DWRD, decimal word)
      • sprite (DBYT, decimal byte)
      • ticks (DBYT)

One of the smaller "Objt" resources is ID 1001, named "ROOM01.OBT" and corresponding to the file ROOM01.OBT in Dark Seed for DOS. The Macintosh resource is smaller than the DOS file, but the actual values seem to be identical.

0002000200000000 41 05 0000 0000 42 05 0001 0000 0000 00 05

0002 count of objects

    0002 count of object 1's frames

        0000 x vector for object 1 frame 1
            0000 y vector
                41 sprite number
                  05 ticks

                    0000 x vector for object 1 frame 2
                        0000 y vector for object 1 frame 2
                            42 sprite number
                              05 ticks

                                0001 count of object 2's frames
                                    0000 x vector for object 2 frame 1
                                        0000 y vector for object 2 frame 1
                                            00 sprite number
                                              05 ticks

String lists

The game contains string lists as standard Macintosh "STR#" resources.

One list (resource ID 301, named "English item strings") contains the names of game objects in what seems to be the same order as code (crowbar=5, journal=6, scotch=7).

The credits mention separate teams for "IBM" and Macintosh. The game strings include some leftover DOS-specific values like mentioning "Soundblaster".

STR# content n
301 Item labels 199
302 Messages 001-200 200
303 Messages 201-400 200
304 Messages 401-600 200
305 Messages 601-800 200
306 Messages 801-1000 200
307 Messages 1001-1080 71
308 Combined messages 1-1080 1068
401 Credits 52

The (English) strings are encoded in MacRoman, a platform-standard superset of ASCII. For example, message 999 includes a 0xd5 byte to represent a curly apostrophe (what Unicode calls U+00219 RIGHT SINGLE QUOTATION MARK).

Credits

Credits are stored in string list ("STR#") 401. The strings form a kind of data format of their own.

The first entry (entry 0) is the string "13" and seems to be a (zero-based) count of how many pages/screens of credits there will be. The first page follows immediately in string entry 1.

Each page starts with a number-as-string like "4". This is a (one-based) count of how many lines of credits appear on this page.

Items

Item names are stored in string list ("STR#") 301. The format is quite straightforward: entry 0 in the string table is item 0 ("Nothing"), entry 1 is item 1, and so on.

id English label
0 "Nothing"
1 "Box"
2 "hand"
3 "eye"
4 "Ctrl"
5 "crowbar"
6 "journal"
7 "scotch"
... ...
196 "newspaper"
197 "table"
198 "bed bottom"

The item numbers seem to be the same as in Dark Seed for DOS and the other ports.

Messages

Dark Seed assigns a number to all kinds of game message. The vast bulk of them, from message 0 to message 978, have the same meaning and content as TOSTEXT in Dark Seed for DOS.

msgid English text
0 "You have dared to touch an Ancient! You die!"
1 "Fido takes a chunk of your head."
2 "The fleshy stalk of the guard knocks you senseless!"
... ...
975 "Enter name to save game as "
976 "Error saving game."
977 "File exists. Replace? Y or N"
978 "--temp sync--"

These messages are followed in sequence by some extended messages that did not have numbers in Dark Seed for DOS (TOSTEXT). Messages in this range have formatting placeholders for the name of the held object ("^0") and the interaction target ("^1").

msgid English text
979 "This sentry cannot be stopped with a ^0."
980 "The ^0 has no effect on the alien tubes."
... ...
1000 "The ^0 will do nothing to the ^1."
... ...
1050 "GAME TEXT"
1051 "DISTRIBUTED BY"
1052 "AFTER A HORRIFYING NIGHTMARE MIKE DAWSON AWAKENS TO THE FIRST DAY IN HIS NEW HOUSE..."
1053 "AFTER A HORRIFYING NIGHTMARE"
1054 "MIKE DAWSON AWAKENS TO THE"
1055 "FIRST DAY IN HIS NEW HOUSE..."
... ...
1062 "DEVELOPING NEW WAYS TO AMAZE"
1063 "CYBERDREAMS"
1064 "PRESENTS"
1065 "Please make sure the joystick is centered."
1066 "Press any key to continue . . ."
1067 "NOTE: Sound Blaster mode may not work on some computer systems."

The messages are stored twice. Once in a single big list with over 1000 items, and once in smaller pieces of at most 200 items.

The combined list is indexed by its message number (message 555 is entry 555). The smaller lists need some calculation to find the right string list and the right entry. Message 555 is in "STR#" resource 304 at entry 55.

TODO: Figure out why there are two sets. Development-time vs run-time? Initial import vs released product?

Movies

This section is a stub.

The resources with the ResType "Movi" are presumably the bigger animations.

They have somewhat descriptive names ("Nightmare 1a", "SpaceLetters d"), with only a few kinds of name:

  • Nightmare
  • SpaceLaunch
  • SpaceLetters
  • SpaceLand

In addition, one of the "Movi" resources (ID 131) seems to have been blanked out. It is named "-- Nightmare 2 --" and has a single byte (0xDD) as its entire content.

TODO: Research the actual format of Movi resources.

Sound and music

Speech and sound effects are stored as AIFF "snd " resources, as are the instrument samples that are arranged into music. Two codecs are used: raw unsigned 8-bit PCM (codec identifier "raw ", with the space) and the less-common Macintosh Audio Compression/Expansion 3:1 (codec identifier "MAC3").

The sequence and timing of notes to play is stored as standard MIDI data in "Midi" resources. The selection of instruments are stored in "Inst" resources.

The resource templates tell us the structure to interpret "Inst" instrument data:

  • one-based count for list of instrument definitions, where each item has:
    • 'snd ' resource (DWRD, decimal word) - presumably resource ID
    • Fixed pitch (0=none) (DWRD)
    • Loop enable (BOOL, boolean byte)
    • Voice enable (BOOL)

SEGA Saturn

Dark Seed was released in Japan for the SEGA Saturn around the same time as Dark Seed for PlayStation.

It seems to be based on the Macintosh version and uses some of the same file formats.

Same or similar to the Macintosh formats:

Pattern Purpose Format
MV000.MOV Movies Similar/same format as Macintosh "Movi" movies
OB000.OBJ Objects Same format as Macintosh "Objt" objects
SP000.SPR Sprites Same format as Macintosh "Sprt" sprites
ST000.STR Strings Same format as Macintosh "STR#" string lists
RM000.PIC Room pictures Same format as Macintosh "Room" graphics
RD000.RMD Room data Exactly the format of Macintosh "Rmdt"

Exactly the same data bytes as the PlayStation:

Pattern Purpose Format
MV000.MOV movie?
KANJI.FON font (kanji)
KANA.FON font (kana)
DS.MP ?

Saturn-specific formats:

Pattern Purpose Format
SQ000.SEQ music sequence Saturn SEQ format
TN???.TON music instrumentation Saturn TON format
0000.PCM sound raw signed 8-bit PCM at a fixed sample rate (11025 Hz?)

The TON data is also on the PlayStation release but may be unused - the PlayStation-standard format sound banks (VAB) are present in the PlayStation release.

Comparison count:

Saturn pattern PSX pattern similarity
1 ds.mp 1 ds.mp byte-identical
1 kana.fon 1 kana.fon byte-identical
1 kanji.fon 1 kanji.fon byte-identical
4 fr???.pic 4 fr???.pic byte-identical
9 st???.str 9 st???.str byte-identical
13 pd???.pic 13 pd???.pic byte-identical
17 tn???.ton 17 tn???.ton byte-identical
17 .seq 19 .seq totally different
19 .vab
22 mv???.mov 22 mv???.mov byte-identical
24 pl???.pic 24 pl???.pic byte-identical
42 se??.pcm
48 sp????.spr 48 sp????.spr byte-identical
49 ob????.obj 49 ob????.obj
52 ob???.obj 52 ob???.obj
54 sp???.spr 54 sp???.spr byte-identical
66 rd????.rmd 66 rd????.rmd byte-identical
66 rm????.pic 66 rm????.pic byte-identical
68 ???.pcm
616 ????.pcm 672 ???.pcm totally different

SONY PlayStation

Dark Seed was released in Japan for the original PlayStation.

It seems to be based on the Saturn version and even includes some instrumentation sounds in Saturn-format TON files as well as the PlayStation-format VAB files that it actually uses.

The data is stored as records in an "AFS" archive volume (.VOL) with an index (.IDX) of offsets and lengths.

Some files are the same or similar to the Macintosh formats:

Pattern Purpose Format
MV000.MOV Movies Similar/same format as Macintosh "Movi" movies
OB000.OBJ Objects Same format as Macintosh "Objt" objects
SP000.SPR Sprites Same format as Macintosh "Sprt" sprites
ST000.STR Strings Same format as Macintosh "STR#" string lists
RM000.PIC Room pictures Same format as Macintosh "Room" graphics
RD000.RMD Room data Exactly the format of Macintosh "Rmdt"

(Note that STR files here are strings, not the PlayStation "stored media" format.)

These files are specific to the PlayStation:

Pattern Purpose Format
.SEQ Music sequence PlayStation standard SEQ
.VAB Music instrumentation (sound banks) PlayStation standard VAB
.PCM Sound/speech PlayStation standard VAB (despite name)

Strings

The strings are in the same format as Macintosh "STR#" resources: a 16-bit count for the number of strings, followed by a length byte for the first string, followed by the first string's characters, then the length byte for the second string, then the second string's characters, and so on. The text is encoded with Shift-JIS, a widely-used standard for Japanese text at the time. The Japanese PlayStation resource ST301.STR corresponds with "STR#" resource number 301 (named "English Item Strings" in the English Macintosh release):

entry Mac "STR#" 301 ST301.STR
0 "nothing" "無" ('nothing')
1 "Box" "箱" ('box')
... ... ...
196 "newspaper" "新聞" ('newspaper')
197 "table" "テーブル" ('table')
198 "bed bottom" "ベッドの下" ('bottom of bed')

Likewise, the Japanese PlayStation resource ST308.STR corresponds with "STR#" resource number 308 in the English Macintosh release:

ST308.STR ST308.STR
855 "アクセスディスプレイの操作卓だ" ('access switch's control panel')
856 "アクセスディスプレイのスイッチを入れた" ('access switch'...)
857 "xxx"
858 "xxx"
859 "xxx"
860 "エイリアンの監獄のメインロビー 内装はひどいものだ" ('alien jail's main lobby'...)
861 "この世界の警察は訪問者に好意的ではない" (...'world's police'...)
Mac "STR#" 308 Mac "STR#" 308
855 That's probably the control panel for the access screen.
856 You turn on the access screen.
857 xxx
858 xxx
859 xxx
860 The main lobby of an alien jail. They could use a new decorator.
861 The police in this world don't like visitors.

The string numbers line up perfectly with the English Macintosh release. These two parts of the combined string list 308 are equivalent, and in the same order.

Some of the strings contain line breaks:

id ST308.STR
0 "古き神々に触れてしまった もう、終わりだ!"
1 "ダーク・ファイドーに頭から噛み砕かれる"
2 "血に飢えたドレッケス・ガードの攻撃で 意識が薄れてゆく"
3 "時間切れだ エイリアンの胚が孵化してしまう!"
4 "何百万ボルトもの電流が体をつらぬく あなたは死んでしまう!"

Some of the strings contain the same placeholders ("^0", "^1") used in Dark Seed for Macintosh:

id ST308.STR
979 "この見張り番は ^0では止められない"
980 "^0はエイリアンのチューブには何の影響も与えない"
981 "^0をエネルギーネクサスの中で焼却する"
982 "^0はこの異次元の建造物には何の影響も持たない"
983 "^0はケーブルを切るほど強力ではない ワイヤーカッターを持っていないか?"
984 "^0は保護された古き神々には何の影響も持たない"
985 "^0を枕の下に隠す"
986 "0を 1の上に置いてはいけない それを忘れてしまう"
987 "車は ^0では始動しない"
988 "^0をトランクに入れると そのままそれを忘れてしまう"
989 "^0はあなたの物だ あなたはそれをなくしていない"
990 "^0を隠すには適した場所ではない"
991 "^0を中に入れようとするがドアが開かない"
992 "キッチンは ^0を置いておく場所ではない"
993 "ここでは ^0を忘れてしまうだろう"
994 "^0を持っていた方がいい"
995 "^0は何の影響力もない"
996 "ここは ^0には適した場所ではない"
997 "^0に映してみる"
998 "^0をベッドの下に置いておきたくはない"
999 "0を 1に使うのは何の意味もない 頭痛の種になるだけだ!"
1000 "0は 1に何もしない"
1001 "0は 1に何の影響力も持たない"
1002 "0は 1とは何の関係もない"

It appears that the smaller component string lists like 401 (Credits) and 302 (messages 1-200) also exist:

id Mac "STR#" 302 ST302.STR
61 ""Friend of Delbert's, huh? Come with me, Dawson."" "「デルバートの友達だって? ドーソン、一緒に来いよ」" ('...Delbert's friend...Dawson...')