LOCOMOTION OBJECT DAT FILES

Back to RCT home

Last Updated September 19, 2004

The visual items in Locomotion are presumed stored in the g1x.dat files in the data directory and as individual dat files in the objdata directory.

The Locomotion dat files are similar in many respects to the dat files of RCT2. The dat files begin with a sixteen byte "DAT File Header". The first four bytes are flags. The next eight bytes are the ASCII characters of the file name (padded with trailing spaces as needed). The next four bytes are a checksum. The DAT File Header is followed by an encoded data chunk. It is the same type of encoding as described on the SV6/SC6 page. (The first byte specifies the type of encoding; the next four bytes are the size.) The remainder of the description here is based on the decoded file. This is a "work in progress"! I am using the following model for the Dat file structure:
DAT File Header
Object Header
String Table(s)
Group Info
Optional
Image Directory
Graphics Data

Presumably, every object has a DAT File Header, Object Header (different for each object type) and a String Table.

DAT File Header: The high two bits of the first byte of the Flags is used to determine if this is a standard (original="10",) or (possibly) custom object (bits ="00"). The lower six bits of the first byte determine the "Type" of the object as described below. The remainder of Flags can be ignored.The last byte of Flags is 0x11 for original Locomotion files.

Flags : longword
filename : 8 bytes
checksum : longword

The Checksum is calculated by starting with the value 0xF369A75B. Read one byte at a time from the decoded file. Start with the first byte of the file, then skip the next three bytes. Then read the eight bytes of the Filename. Skip the four bytes of the checksum (you're calculating it now!). Then process each byte of the remainder of the (decoded) file.

Each byte is processed by XOR'ing it with the low byte of CheckSum. Then CheckSum is rotated left by eleven bits.

Object
Type
Description Obj Header
Size
String Tables Group(s) "Optional" Images Example

0x00

interface (button images) 0x18 1 No No Yes INTERDEF.dat

0x01

sounds 0x0C 1 No ? No-has "sounds"? SNDTR1.dat

0x02

currency 0x0C 3 No No Yes CURRDOLL.dat

0x03

exhaust/spark/steam 0x28 1 No ? ? STEAM.dat

0x04

rocks (vertical faces) 0x06 1 No No Yes LSROCK.dat

0x05

water 0x0E 1 No ? ? WATER1.dat

0x06

grass/rock/sand 0x1E 1 Yes No Yes GRASS1.dat

0x07

town names 0x1A 1 No ? ? ATOWNNAM.dat

0x08

resources (eg grain, coal) 0x1F 4 No No Yes COAL.dat

0x09

fence/wall 0x0A 1 No No Yes FENCE1.dat

0x0A

train signals 0x1E 2 No No Yes SIGS.dat

0x0B

level crossing signals 0x12 1 No No Yes LCROSS1.dat

0x0C

street lights 0x0C 1 No No Yes SLIGHT1.dat

0x0D

tunnel 0x06 1 No No Yes TUNNEL1.dat

0x0E

bridge 0x2C 1 No No Yes BRDGGIRD.dat

0x0F

train station 0AE 1 No Yes Yes TRSTAT1.dat

0x10

track extras(3rd rail, electric) 0x12 1 No No Yes TREX3RL.dat

0x11

track (narrow/standard) 0x36 1 Yes No Yes trackst.dat

0x12

road station 0x6E 1 Yes Yes Yes RDSTAT1.dat

0x13

road extras (overhead electric) 0x12 1 No No Yes RDEXCAT1.dat

0x14

road 0x30 1 Yes No Yes ROADONE.dat

0x15

airport 0xBA 1 No Yes Yes AIRPORT1.dat

0x16

dock 0x28 1 No Yes Yes SHIPST1.dat

0x17

vehicles 0x15E 1 Yes-after addtl data No Yes BALDWIN1.dat

0x18

trees 0x4C 1 No No Yes BEECH.dat

0x19

snow 0x06 1 No No Yes SNOW.dat

0x1A

climate 0x0A 1 No No No CLIM1.dat

0x1B

hill shapes 0x0E 1 No ? ? HS1.dat

0x1C

buildings 0xBE 1 Yes-after addtl data No Yes BLDALP1.dat

0x1D

scaffolding 0x12 1 No No Yes SCAFDEF.dat

0x1E

industry(factory/farm, etc) 0xF4 8 Yes-after addtl data ? ? FARM.dat

0x1F

region (US/UK/ALP) 0x12 1 Yes, and "0xFF" at end of group data No Yes REGUS.dat

0x20

competitors 0x39 2 No No Yes COMP1.dat

0x21

Scenario text 0x06 2 No No No STEX000.dat

Object Header: Following the DAT File Header is a "Object Header" which is a different structure (and size) for each object type. None of the Locomotion object headers have been determined yet.

 


String Table(s): Folowing the Object Header is a string table containing text in different languages.Each string begins with a byte to specify the language. The following table is the definitions used in RCT2
Code Language Used in Locomotion
0 British English Yes
1 American English Yes
2 French Yes
3 German Yes
4 Spanish Yes
5 Italian Yes
6 Dutch No
7 Swedish No
9 Korean? Yes
10 Chinese No
11 Chinese Yes
13 Portugese No

The string immediately follows that byte and is null terminated. An 0xFF for the Language code indicates the end of the strings.

Group Info: a sixteen byte structure. There is a four byte value. This is followed by an eight byte string indicating which scenery group file this item belongs to (if any). That is followed by a 4-byte value. There are often several of these groups. Read the next long word in the file - if it is less than 0x22 then it is another group structure, otherwise, it is part of the image directory.

Flag : longword
FileName : 8 bytes
Checksum: longword = 0

Image directory: First is a 4-byte value which specifies how many images are in the file. Then a 4-byte value which specifies the length of the scan line graphic data (starting after the image directory). Then there is a sixteen byte entry for each image. It uses the same format as the csg1i.dat file of RCT1.

TGraphicRecord = record
StartAddress : longword;
Width, Height, Xoffset, Yoffset : smallint; // signed two byte variables
Flags : word;
unused : word // to pad the structure to 16 bytes
end;

StartAddress points to the start of the scan line index in the file. It is an offset rather than an absolute address - the first scan line index has a StartAddress of 00000000.