The volumes are a data container for the game, similar to an archive format like Tarball. At least in Outpost 2 the format only knows files - no folders.
Probably these could be simulated however by appropriate file names.
A volume consists of the volume header and several volume blocks that correspond to the specific files.
"Volumes" are the files with the extension 'vol' in the game directory.
The volume header does not contain any user data. It only serves as a container.
The first date in the volume header should be the volume strings, followed by the volume information.
|payload length||Data type: uint32
Specifies how many bytes of the following data are actually user data.
The remaining data in the volume string list is obviously garbage.
In files with later dates, this 'remaining data' is 0x00, which could indicate shortcomings with the toolchain during game development, i.e. that a developer took care of the correct initialization of the buffers very late, since it has no influence on the game whether the data is initialized or not.
|filenames||Data type: uint8
This is a 0-byte terminated list of file names which - at least in the present data component - only allows ASCII characters to be expected.
It is not necessary to evaluate this data block more precisely when parsing the data, since the offsets of the file names are directly referenced in the volume information anyway.
The volume strings are a list of file names contained within the volume.
The volume information contains more detailed information about the files. In a way, it is a kind of FAT directory entry (FAT = File Allocation Table).
The number of files results from the block size divided by the length of the directory entries - 14 bytes.
The directory entries have the following structure:
|File name offset||Data type: uint32
Specifies the offset (!) within the file name list (volume strings) at which the file name of the file is found.
Refers to the beginning of the user data block.
|file offset||Data type: uint32
Specifies the offset within the entire volume file at which the file is located.
|file size||Data type: uint32
Specifies how large the file is in bytes.
|Flags?||Data type: uint16
Apparently provides additional information about the file encoding.
A volume block is a container that holds files. Due to the block format, it only contains the file size redundantly once more and then the user data directly follows.