A non-gob-y Squidmas

Just on time for this blog’s first anniversary (quite scary, especially considering that there weren’t that many posts ^^) and ChristSquidmas, I come to you with a status update.

So, what have I been doing the past months? Apart from some RL stuff I’d rather not talk about, and playing Dominion (seriously, check that out, it’s really great), I didn’t do much concerning gob. Sorry. Instead, I started a new ScummVM engine, for Dark Seed II.

For those of you not familiar with Dark Seed II, it’s a fun (in my eyes, at least :P) little horror-ish adventure game, using graphics by the great H. R. Giger. In fact, it’s been one of my favourite adventures, despite some flaws, and I always wanted ScummVM to run it :).

So, one day, 1.5 months ago, I, just for the heck of it, looked at the files on my Dark Seed II CD: The videos were immediately apparent to be standard AVIs, using MSVideo1, MSRLE and Indeo3 codecs, the music standard MIDIs. No problems on that front. There were some other files, following the name convention “gl00*.000” that looked suspiciously like resource archives. So I checked gl00__da.000 with an hexeditor:

Now, that looked rather simple. This looks like a file name:

This number, read as a little-endian 16bit value, correspondents with the number of visible file names at the start of the file:

Since the files in this archives are apparently WAVs, I expected to find fitting magic bytes:

And the offset within the file fits with one of the numbers at the beginning of the file:

A quick calculation showed that the other number is apparently the size of the resource file within the archive.
It seems that I managed to guess the archive format in a few minutes. Nice :). I hacked together an extractor and it actually worked, giving me loads of standard WAV files, the dialog lines.

Extracting gl00_sys.000 yielded a file OBJ_9999.DAT, which looked like a game script for the inventory objects in plain text. That came as quite a surprise. However, it would make a possible reimplementation a lot easier.

One problem crept up, though: Some archives files didn’t fit with my guessed format. For example, gl00_001.000:

A sole file name was readable, then some garbage. Might be a compression. Some digging in the disassembled executable and I had that down too. And what I saw made me hopeful: Script and conversations are really plain text, images BMPs (+ WAVs, MIDs and AVIs for sound, music and videos).
After thinking about it for a bit, I decided to implement a ScummVM engine :).

As I went along, the engine began taking form:

In the current state, the game is already basically playable, with the following caveats:

  • No pathfinding
  • No walking, Mike teleports
  • Several unimplemented special variables, like SysRandom
  • Some script lock-ups in the carnival
  • Siamese twins conversation doesn’t start (some unknown command)
  • No saving/loading yet
  • Graphical glitches:
    • Wrong drawing order
    • Sprite clear/stay
    • Animation speed
    • Unimplemented scaling

Also, there’s still an inconvenience with the cursor, but that’ll have to wait for another post.

Next up, I’ll probably tackle walking and pathfinding (I’m thinking of implementing IDA*), then I’ll look into the drawing order stuff (I have an idea there, which needs another rewrite of the rendering queue), and then appears to me the right time for saving/loading. I might have Dark Seed II working completely relatively soon :).

10 comments

  1. nice work,
    hopefully you will finish the reveng. bacause I would really love to replay this game classic 🙂