RollerCoaster Tycoon 3 OVL
Choose archive extension:
OVL
- Format Type : Archive
- Endian Order : Little Endian
Format Specifications
// .COMMON.OVL Files
// Header
- char {4} - Header (FGRK)
- uint32 {4} - null
- uint32 {4} - Version (1)
- uint64 {8} - null
- uint32 {4} - Number Of Directories (maximum of 4 directories)
- // for each directory
- uint16 {2} - Format Header Length
- char {X} - Format Header (FGDK,RCT3)
- uint16 {2} - Directory Name Length
- char {X} - Directory Name
- uint32 {4} - Directory Format? (1=RCT3, 2=FGDK)
- uint16 {2} - Extension Name Length
- char {X} - Extension Name
- uint16 {2} - Format Header Length
- uint64 {8} - Number Of Files Of Type 0
- uint64 {8} - Number Of Files Of Type 1
- uint64 {8} - Number Of Files Of Type 2
- uint64 {8} - Number Of Files Of Type 3
- uint32 {4} - null
// The way I think this works is that there are a fixed number of directories
// allowed in an archive (4). The directories each list their number of files
// under the directory loop, as shown by "Number Of Files Of Type #" above.
// So to read the archive, you would read the filename directory file, then all
// files of type 0, then all files of type 1, etc.
// Filename Directory
- // for each filename directory
- uint32 {4} - Length of Directory
- uint32 {4} - Length of Directory
- // for each file in the directory
- char {X} - Filename (replace the : character with a . character)
- byte {1} - null Filename Terminator
- char {X} - Filename (replace the : character with a . character)
- // for each file in the directory
// File Data
- // for each file
- uint32 {4} - File Length
- byte {X} - File Data
- uint32 {4} - File Length
// Offset Directory
- uint32 {4} - Number Of Entries
- // for each entry
- uint32 {4} - Offset to something [+185]
- uint32 {4} - Offset to something [+185]
// ID Directory
- // If the first 4 bytes are not null, then the ID directory exists
- // If null, it is the start of the source file directory as indicated below
- // There are 4 bytes for every 2 entries in the offset directory above
- // for each numEntries/2
- uint32 {4} - Unknown (1/4)
- uint32 {4} - Unknown (1/4)
// Source File Directory
- // Sometimes this section does not exist
- // NOTE: THIS SECTION HAS NOT BEEN RESEARCHED FULLY - IT WILL BE BUGGY!
- uint32 {4} - null (start of source file directory marker?)
- // for each group
- uint32 {4} - Unknown
- uint32 {4} - Group Data Length
- uint16 {2} - Description Length
- char {X} - Description
- uint32 {4} - Unknown
- // for each file in this group
- uint32 {4} - A Relative Offset?
- uint32 {4} - Unknown (1)
- byte {1} - Unknown
- uint16 {2} - Filename Length
- char {X} - Filename
- byte {1} - Unknown
- byte {1} - Unknown
- uint32 {4} - A Relative Offset?
- // for each file in this group
- uint32 {4} - Group End Marker (all 255s)
- uint32 {4} - Group End Marker (all 255s)
// .UNIQUE.OVL Files
char {4} - Header (FGRK)
uint32 {4} - null
uint32 {4} - Version (1)
uint64 {8} - null
uint32 {4} - Number Of Directories
// for each directory
- uint16 {2} - Format Header Length
- char {X} - Format Header (FGDK,RCT3)
- uint16 {2} - Directory Name Length
- char {X} - Directory Name
- uint32 {4} - Unknown (1,2)
- uint16 {2} - Extension Name Length
- char {X} - Extension Name
uint64 {8} - Number Of Files Of Type 0
uint64 {8} - Number Of Files Of Type 1
uint64 {8} - Number Of Files Of Type 2
uint64 {8} - Number Of Files Of Type 3
uint32 {4} - null
uint32 {4} - Directory Length
// for each file
- uint32 {4} - Filename Offset (relative to the start of the filename directory)
- uint32 {4} - Unknown
- uint32 {4} - File Type ID? (1)
uint32 {4} - Directory Length
// for each file
- uint32 {4} - File Type ID? (0-6)
- uint32 {4} - Unknown
- uint32 {4} - null
- uint32 {4} - Unknown
- uint32 {4} - Unknown (1-2)
uint32 {4} - Directory Length
// for each file
- uint32 {4} - Unknown
- uint32 {4} - Unknown
- uint32 {4} - Unknown (increments by 20 every X files, where X is variable)
uint32 {4} - Directory Length
// for each file
- byte {22} - null
- uint32 {4} - Unknown
- uint16 {2} - null
- uint32 {4} - Unknown
- uint64 {8} - Unknown
- uint32 {4} - null
- uint32 {4} - Unknown
- uint32 {4} - Unknown
- uint32 {4} - Unknown (repeat)
- uint32 {4} - Unknown (repeat)
- uint32 {4} - null
- uint32 {4} - Padding (all 255's)
- uint32 {4} - null
- uint32 {4} - Unknown
- uint32 {4} - Unknown (2)
- byte {12} - null
- uint32 {4} - Unknown (1)
- uint32 {4} - null
- uint32 {4} - Offset? (big)
- uint32 {4} - Offset? (big)(repeat)
- uint64 {8} - null
uint32 {4} - Directory Length
// for each file
- byte {28} - null
- uint32 {4} - Unknown
- byte {28} - null
- uint32 {4} - Unknown
- uint32 {4} - Unknown (2)
- byte {28} - null
- uint32 {4} - Unknown (1)
- uint32 {4} - null
- uint32 {4} - Offset? (big)
- uint32 {4} - Offset? (big)(repeat)
uint32 {4} - Directory Length [*4]
// for each file
- uint32 {4} - Unknown
// The source file directory comes here, same as in the .common.ovl files
MultiEx BMS Script
Not written yet