Monthly Archives: September 2008

Psychotron Story Arc

I’m still on this game hacking kick. Today’s target is The Psychotron, perhaps the most painful interactive movie game I have ever seen. Thing is, I have to admit that I have never actually played this game; I am judging the game purely on the plain Cinepak/PCM AVI files that comprise the key feature of the game. I don’t even own the full game, only a demo. Granted, I have tried to play the Psychotron demo but could never make it work. These 1994 multimedia-heavy games…

Psychotron gangsters

Whereas the conversations in Flash Traffic: City of Angels were packed in a quasi-compressed binary format, the conversation tree in Psychotron is stored in a series of .SEG files that look like the file S5H1PD1.SEG here:

\scene5\s5h1Pd1.avi*from 23 to 283*3*Fold.*10*S5h1r1.seg*Bet a large amount.*1000*s5h1r2.seg*Bet a small amount.*500*s5h1r3.seg*

Pretty straightforward to figure out. It also helps me understand a technical matter about the game that irritated me so much when I viewed the FMV files standalone– when you view the game’s files in a standalone player, you will see that they invariably start paused with tracking lines (apparently digitized from a VCR). I am guessing that the game uses the field “from 23 to 283” to describe which frames of the file are meant for human consumption.

Anyway, I wrote a Python script to print out a Graphviz-compatible spec to map out the game demo’s dialog tree. Warning! There might be spoilers in the tree!

Pyschotron demo flowchart
Click for full image

Click for Graphviz source

Ah, who am I kidding? No one cares about spoilers in this alleged story. It is interesting to note that 2 of those trees don’t correlate to any of the scenes on the disc.

The Python source code for generating the graph is below. I finally ordered the full game from an eBay seller the other day so I am wondering if the graphing utility will be applicable to the full game.

Continue reading

Interplay Conversion Again

I haven’t forgotten about that goal of converting Interplay MVE files to a more modern format. In fact, I have been periodically updating my FFmpeg and libx264 snapshots in order to take another stab at the problem. The crashing issue I experienced before turned out to be a known FFmpeg-x264 interaction issue that was being actively discussed on the ffmpeg-devel mailing list at the time I was experiencing the problem. Robert’s guides helped, too, at least in the not-crashing department.

But… I don’t know… sometimes I can’t shake the feeling that x264 is an elaborate hoax perpetrated by a number of my open source multimedia colleagues.

Baldur's Gate -- the blocky version

I think the foregoing movie was generated using the default FFmpeg preset, but I got similarly awful results for all the profiles. I guess libx264 is working, and achieving miraculous compression rates to boot. Maybe a little too much for my goals, though. The resulting files decode better in Apple’s QuickTime Player than they do with FFmpeg’s decoder– makes me wonder what those 119 H.264 decoder tests in the FATE suite are even useful for.

Metal Gear VP3

Reimar and I were poking at Metal Gear Solid: The Twin Snakes again. You may recall my post about MGS using Ogg Vorbis for audio. In addition to the vox.dat file, there is another resource file called movie.dat. I don’t know why I wasn’t too interested in this file before; maybe because I didn’t remember any pre-rendered FMV in MGS (it is primarily real-time rendered). But when I really think about it, I remember there was a small number of ponderous cut scenes that used some regular film-type material.

Reimar’s Extractor-GTK tool makes short work of both the vox.dat and movie.dat resource archives. Guess what Reimar noticed in certain files living inside movie.dat? The signature ’13PV’, or VP31 backwards. So you know the drill: Wiki page and samples.

The data at the start of the file definitely looks like VP31 (e.g., the bytes starting with hex 32 00 08 in mgs1-40.bin). The files are probably pure video (audio and subtitles are stored elsewhere). It is currently unknown how frames are split up in the file.

Flash Traffic Coding Puzzle

I am studying the data files for an old interactive movie named Flash Traffic: City of Angels. It is the purest I-movie I have encountered to date (and I’ve been exposed to more than the ordinary gamer due to my unhealthy interest in multimedia technology): It plays a movie and then presents the user with 3 clickable options. There aren’t even any extra side puzzles.

Flash Traffic: City of Angels -- screenshot

This game seems to consist of BFI multimedia files along with CVN files (ConVersatioN?). We know the BFI format. I am trying to sort out the CVN format. It seems straightforward at first with text strings paired with numbers that lead to BFI files with the same number. However, there is something unique about the text coding format. Observe:

   20 6C 61 62  20 64 6F 77  6E 74 6F 77  6E 20 61 74   lab downtown at
   20 6D 69 64  41 91 09 74  2C 20 74 68  65 79 20 67   midA..t, they g
   41 56 13 6E  74 6F 20 61  20 73 65 72  69 6F 75 73  AV.nto a serious

The start of the second line should have “midnight”. Somehow, the 4 letters n, i, g, and h get replaced with only 3 bytes 0x41, 0x91, and 0x09. Similarly, on the third line, the characters o, t, space, and i are substituted by 3 apparently unrelated bytes. One theory I have is that perhaps this forms an index into a dictionary in the header of the CVN file, except that I can’t find any of the characters in question at the start of the file either. And that would be a fairly useless compression algorithm. These substitutions often begin with ‘A’.

If you are interested in studying the format and solving the puzzle (and I know you are), here’s a sample file: 4001.CVN, which is where the snippet above comes from.