In my recent post about video in Russian quests I said that the Russian adventure games I looked at used standard video formats (except for one game employing custom-modified FLIC). Well, now I can say there’s one game with an original format.
Escape from the Haunted House as its English version is known (unlike the original Russian title which translates to Spectre of the Old Park—because the goal of the game is to escape haunted house naturally) is a Myst or 7th Guest clone which means it should use animations for scene transitions and it has lots of them.
Almost all game resources are stored in a single 600 MB file in a peculiar format: unlike the usual fixed-size record pointing at actual resources, here you have 16-bit tag followed by the tag-speficic data (may be none, may be 1-128 bytes, may be some arbitrary size declared in fixed-size header). And 90% of the data are animations.
Animations by themselves are rather peculiar. First you have a header starting with " AN 0.90"
(or some other floating point number), then you have a palette, chunk table and actual chunks. Audio is 5-bit DPCM (one bit for difference sign and four bits to update step index) which actually codes sample as x[i] = x[i - 1] * 2 - x[i - 2] + delta
, I don’t remember seeing audio coding like this even if it’s rather simple.
Video coding employs RLE and static codebooks (depending on coding method) and some second pass to output image data in specific form. Nothing really complicated but quite original.
The problem with binary specification was the way it’s written (it’s fun to force Ghidra
to decompile a function which it turns back into data because the code is self-modifying), particularly first I managed to locate a function to create those IMV data archives and only then its counterpart for loading data from archive. And after extracting data I found which type corresponds to animations and which functions handle it.
At least this all turned out to be even more original than I was asking for.
Could you use radare2 to disassemble self modifying code?
I can probably even use
objdump
but since that function is the heart of engine that handles opcodes and events I simply decided to ignore it, the bits of code that interested me can be studied without it.[…] Kostya's Rants around Multimedia « Some words on yet another game format […]