Hi Octane
Hi Octane is hover-car racing game. According to Sean Cooper it was made in 6.5 weeks using engine code from Syndicate and Magic Carpet. There are at least two releases of the game, the initial release (executable contains string Jun 10 1995 17:45:48) with 6 levels, and a later extended version (Oct 23 1995 15:57:32) with 9 levels, additional game modes, and slightly reworked levels. In certain file format details the used version makes a difference.
Tools
Level inspector and incomplete editor by movAX13h (contains all assets of the original game extracted/converted by srtuss): https://github.com/movAX13h/HiOctaneTools
File formats
The following file formats are used by this game.
Filename | Format | Details |
---|---|---|
sounds/music.dat | see below | Archive containing music files in different formats: XMI Format, GEN Format, ROL Format, WTB Format. There are five files per format : TGAME1, TGAME2, TGAME3, TGAME4, TINTRO2. |
MUSIC.DAT
- read the INT32LE at EOF and seek to returned position
- count the N number of INT16LE that equals
0x0001
, then read N of the following struct:
Data type | Name | Description |
---|---|---|
INT32LE | offTunes | Offset to the list of tunes |
INT32LE | offTune1 | Offset to the first tune |
INT32LE | unknown | Unknown (always 0xC0000000 , or 192 )
|
INT32LE | lenTunes | Length of all tunes together, bytes |
- for each of the former struct
- seek to
offTunes
- read one of the following struct, its
lenTune
indicates the byte sum of tunes following - read as many of the following struct until their
lenTune
sum equals the one in previous step
- seek to
Data type | Name | Description |
---|---|---|
CHAR | name[12] | File name of the tune, \0 padded
|
CHAR | padding[6] | Padding bytes |
INT32LE | offTune | Tune relative offset |
CHAR | padding[4] | Padding bytes |
INT32LE | lenTune | Tune length, bytes |
INT16LE | unknown | Unknown (always 0x5A00 , or 90 )
|
- you now have a catalog of a collection of tunes, e.g. five ROL songs, five WTB songs etc
- to extract a song, copy
lenTune
bytes starting atoffTune1 + offTune
, file name isname
RNC-compressed files
Many of the game's files are compressed using the Rob Northern Compression format; some of them such as SOUND\SOUND.DAT are a concatenation of many RNC archives simply glued together.
A command-line unpacker can be found here : Bullfrog games RNC Utilities (from Unpacking RNC files)
DAT/TAB pairs
Can be decompressed using Bullfrog games DAT/TAB Graphics extractor (they first must be decompressed if they are RNC-compressed).
DAT format:
Without a TAB file, it's raw pixels; with a TAB file it's a form of line by line RLE compression where only transparent pixels are compressed.
TAB format:
Data type | Name | Description |
---|---|---|
INT32LE | position | Image position in .DAT |
INT16LE | width | Image width |
INT16LE | height | Image height |
TMAPS:
Contains powerups and some HUD elements but TAB format is different:
Data type | Name | Description |
---|---|---|
INT32LE | flat | Size of RNC stream unpacked, useless as it's contained in stream header already |
INT32LE | pos | Position in DAT |
INT16LE | index | Some index but can be duplicate, so likely a type or category instead |
There are N+1 entries to be able to compute last item size in DAT.
Each image has the following format:
Data type | Name | Description |
---|---|---|
INT16 | unknown | Unknown |
INT8 | width | Image width |
INT8 | height | Image height |
INT8[] | pixels | Image pixels, 8-bit paletted |
Game's files
Name | Format | RNC compressed | Notes |
---|---|---|---|
data\hfont0-0.dat data\hfont0-0.tab |
Unknown format | Yes | Thin white font (SVGA) |
data\hspr0-0.dat data\hspr0-0.tab |
Unknown format | Yes | Editor icons (large) |
data\intro.dat | Autodesk FLI animation | No | Game introduction |
data\logo0-0.dat data\logo0-0.tab |
Unknown format | Yes | Game logo (VGA) |
data\logo0-1.dat data\logo0-1.tab |
Unknown format | Yes | Game logo (SVGA) |
data\mfont0-0.dat data\mfont0-0.tab |
Unknown format | Yes | Thin white font (VGA) |
data\mspr0-0.dat data\mspr0-0.tab |
Unknown format | Yes | Editor icons (small) |
data\olfnt0-0.dat data\olfnt0-0.tab |
Unknown format | Yes | Large white font (VGA) |
data\olfnt0-1.dat data\olfnt0-1.tab |
Unknown format | Yes | Large white font (SVGA) |
data\onet0-*.dat data\oscr0-*.dat |
Raw VGA image, 320×200 and 640×480 | Yes | Loading and selection screens |
data\osfnt0-0.dat data\osfnt0-0.tab |
Unknown format | Yes | Small white font (VGA) |
data\osfnt0-1.dat data\osfnt0-1.tab |
Unknown format | Yes | Small white font (VGA) |
data\palet0-0.dat | VGA Palette | No | The palette of every asset of the game, unless specified |
data\panel0-0.dat data\panel0-0.tab |
Unknown format | No | HUD 2-players (SVGA) |
data\panel0-1.dat data\panel0-1.tab |
Unknown format | No | HUD 1-player (SVGA) |
data\panel9-0.dat data\panel9-0.tab |
Unknown format | No | HUD 2-players (VGA) |
data\panel9-1.dat data\panel9-1.tab |
Unknown format | No | HUD 1-player (VGA) |
data\pfont0-0.dat data\pfont0-0.tab |
Unknown format | No | Large green font (VGA) |
data\pfont0-1.dat data\pfont0-1.tab |
Unknown format | No | Large green font (SVGA) |
data\point0-0.dat data\point0-0.tab |
Unknown format | Yes | Editor cursors |
data\puzzle.dat | Raw VGA image, 112×96 | No | The cheat puzzle activated with CTRL-Tab in-game |
data\sky0-*.dat | Raw VGA Image, 256×256 | Yes | Horizon of each track |
data\srch0-0.dat | Raw VGA Image, 32×32 | Yes | Looks like a radar but seems to be unused |
data\table0-*.dat | Unknown format | Yes |
These files differ by at most a few bytes, their name suggests a sine table but this is pure speculation. The following pattern appears when they are interpreted as a 256 pixels wide image: |
data\textu0-*.dat | Raw VGA image, 64×16384 | Yes | 64×64 terrain textures |
data\title.dat | Raw VGA image, 320×200 | Yes | The introductory screen |
data\tmaps.dat | Yes | see above | |
data\tmaps.tab | No | see above | |
data\track0-0.dat data\track0-0.tab data\track0-1.dat data\track0-1.tab |
Unknown format | No/Yes | Contain the images of the level minimaps that are shown in the HUD. The game does work without them,
but then the minimap is not shown. Initial game version does not use RNC compression, extended version does. |
objects/data/tex0-0.dat objects/data/tex0-0.tab |
Hi-Octane Texture Atlas, 256×768 | No | In-game textures |
objects/data/tex0-1.dat objects/data/tex0-1.tab |
Hi-Octane Texture Atlas, 256×88 | No | In-game textures |
Note: none of the TAB files are RNC-compressed.
Notes
General
The image formats above are partially decoded, they are still missing palette information.
All the images are paletted, 8 bits per pixels.
INTRO.DAT
Header can be fixed using Autodesk Animator FLI files fixer but since format is pretty old and that Autodesk Animation Player 1.10 is a legacy Win16 executable, it is not very convenient to use as of today.
Instead, the file can be converted by FFMPEG to either BMP or AVI,
Convert the animation to individual images, handle last invalid frame:
<syntaxhighlight lang="text"> ffmpeg -i INTRO.DAT -vframes 548 -pix_fmt bgr24 intro%03d.bmp </syntaxhightlight>
Convert the sequence of images to a raw AVI and respect the original frame rate:
<syntaxhighlight lang="text"> ffmpeg -r 14 -i intro%03d.bmp -vcodec rawvideo intro.avi </syntaxhightlight>
Note that since the underlying format does not handle audio, there won't be any.
CONFIG.DAT
Contains the configuration of the game, current state of game logic relevant variables (for example next selected race track), and the Highscore table. Obvious settings like graphics mode (VGA vs. SVGA) or if computer players are enabled are not stored in the configuration file, and are reset to the default value during each start of the game. The save game files reuse the same file format, but I believe for save game files some data fields will most likely be ignored or not used.
The advantage is that the users game settings are restored for each save game independently. The initial game release config file always has a size of 11449 bytes, the extended game release config file 137833 bytes.
Offset | Data type | only ext Version | Description |
---|---|---|---|
0x0000 | Null terminated string | No | Current championship name (max 12 characters) |
0x034D | UINT8 | Yes | Current value for Death match lives (0 min up to 4 max) |
0x034E | UINT8 | Yes | Current value for Hot seat players (2 min up to 8 max) |
0x034F | UINT8 | Yes | Current value for Hot seat racing time (1 min up to 5 max) |
0x0350 | Null terminated string | Yes | Player 2 name (max 8 characters), If empty string Player 2 name not set |
0x0370 | Null terminated string | Yes | Player 3 name (max 8 characters), If empty string Player 3 name not set |
0x0390 | Null terminated string | Yes | Player 4 name (max 8 characters), If empty string Player 4 name not set |
0x03B0 | Null terminated string | Yes | Player 5 name (max 8 characters), If empty string Player 5 name not set |
0x03D0 | Null terminated string | Yes | Player 6 name (max 8 characters), If empty string Player 6 name not set |
0x03F0 | Null terminated string | Yes | Player 7 name (max 8 characters), If empty string Player 7 name not set |
0x0410 | Null terminated string | Yes | Player 8 name (max 8 characters), If empty string Player 8 name not set |
0x094B | UINT8 | No | Current selected player craft color scheme (0 = Madmedicine, 1 = Assassins, 2 = Gorehounds, 3 = Foofighters, 4 = Dethfest, 5 = Firephreaks, 6 = Stormriders, 7 = Bullfrog) |
0x094C | UINT8 | No | Current selected player craft (0 = KD1 Speeder, 1 = Berserker, 2 = Jugga, 3 = Vampyr, 4 = Outrider, 5 = Flexiwing) |
0x094F | Null terminated string | No | Player 1 name (max 8 characters) |
0x0977 | UINT8 | No | Current game difficulty setting (0 = easy up to 3 = highest difficulty) |
0x097D | UINT8 | No | Music volume (0 = Off up to 200 = max volume) |
0x0981 | UINT8 | No | Sound volume (0 = Off up to 200 = max volume) |
0x0994 | STRUCT | No | Pos1 Highscore Entry (each entry 39 bytes, detail please see below) |
0x09BB | STRUCT | No | Pos2 Highscore Entry |
... | |||
0x0C79 | STRUCT | No | Pos20 Highscore Entry (last one shown in game table, but there are many more in file afterwards) |
... | |||
0x2996 | UINT8 | No | Shading Off = 0, Shading On = 1 (Default On) |
0x299A | UINT8 | No | Sky Off = 0, Sky On = 1 (Default On) |
0x299E | UINT8 | No | Renderer Setting 1 (TextureMapping lowest setting: 0x299E = 0, 0x29A2 = 0, 0x29A6 = 0; TextureMapping 2nd lowest setting: 0x299E = 0, 0x29A2 = 0, 0x29A6 = 1) |
0x29A2 | UINT8 | No | Renderer Setting 2 (TextureMapping 3nd lowest setting: 0x299E = 1, 0x29A2 = 1, 0x29A6 = 1; TextureMapping 4th lowest setting: 0x299E = 2, 0x29A2 = 2, 0x29A6 = 1) |
0x29A6 | UINT8 | No | Renderer Setting 3 (TextureMapping 5th lowest setting: 0x299E = 3, 0x29A2 = 3, 0x29A6 = 1 (default value); TextureMapping highest setting: 0x299E = 3, 0x29A2 = 4, 0x29A6 = 1) |
0x2C76 | UINT8 | No | Current selected race track (0 = level 1, 1 = level 2, and so on) |
0x2C7A | UINT8 | No | Current selected game language (0 = English, 1 = German, 2 = French, 3 = Spanish, 4 = Italian) |
Highscore Table Entry Struct Detail
- 1 byte for highscore value
- 3 bytes of unknown data
- 1 bytes for player assessement string table index
- 9 bytes for player name best lap, 9th byte = string termination char
- 25 bytes of unknown data
The player assessement string table (inside the executable) has the following order:
- Immortal
- Hardwired
- Outta Control
- Demon
- Deadly
- Wrecker
- Dangerous
- Tailgater
- Antisocial
- Dust Devil
- Upwardly Mobile
- Mediocre
- Too Slow
- Endangered Species
- Target Practice
- Back Marker
- Canyon Kisser
- Victim
- Scrap
- Smear
- Cheating Sucks (this is actually an additional entry, which is not possible according to the 20 different assessement point range)
Level file format
Many details about the Hi Octane level file format were found out in the past already, and are for example documented under the HiOctaneTools link mentioned above. One specific information that was missing until now is where to find the starting location for the race and type/location of chargers in the level file. The source code of the HiOctaneTools already contained the readout of a POI (point of interest) value from the map data which already pointed to the area of important locations, but was still lacking the information what type of location this exactly is, and what size it has in terrain cells. I found that the POI value points to certain file offsets in the level file.
POI value | Level file offset |
---|---|
992 | 246924 |
993 | 247009 |
994 | 247094 |
995 | 247179 |
996 | 247264 |
997 | 247349 |
998 | 247434 |
999 | 247519 |
Each entry at this specific file locations is 85 bytes long. This bytes have the following format:
Byte Nr | Data type | Name | Description |
---|---|---|---|
0 | UINT8 | Region type | 1 = Shield charger, 2 = Fuel charger, 3 = Ammo charger, 4 = Race start location |
25 | INT16 | X coordinate | X coordinate of cell right in the middle of the defined location |
27 | INT16 | Y coordinate | Y coordinate of cell right in the middle of the defined location |
46 | UINT8 | Region size in Cells in X direction | Counted from the middle cell to the outer edge of the region |
48 | UINT8 | Region size in Cells in Y direction | Counted from the middle cell to the outer edge of the region |
Credits (in alphabetical order)
Aybe
Malvineous
movAX13h
srtuss
Syndicate series unofficial fan site for the various utilities.
woalexan