Hi Octane

From ModdingWiki
Jump to navigation Jump to search
Hi Octane
Hi Octane.png
There is no image of a modified version of this game — upload one!
Levels?X mark.svg Not editable
Tiles?X mark.svg Not editable
Sprites?X mark.svg Not editable
Fullscreen?X mark.svg Not editable
Sound?X mark.svg Not editable
Music?X mark.svg Not editable
Text?X mark.svg Not editable
Story/cutscenes?X mark.svg Not editable
UI/menus?X mark.svg Not editable
Demos?Unknown

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
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 at offTune1 + offTune, file name is name

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:

HiOctaneTable.png

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

Links

Game demo, Network and MPU-401 patches

Hi-Octane + General MIDI = crash?