To create graphics that do not belong to the landscape, Outpost 2 uses many small image elements. These elements are stored in the op2_art.BMP file.
|aligned width||Data type: uint32
Specifies the width of the pixel data lines in bytes - since these are aligned to the 4-byte boundaries.
So it is quickly possible to jump to a certain image line.
Why this value is stored separately, although it could be calculated, is unclear.
|offset||Data type: uint32
Specifies the offset of the first line in the bitmap.
|height||Data type: uint32
Specifies the height of the image in pixels.
|width||Data type: uint32
Specifies the width of the image in pixels.
|image type||Data type: uint16
Specifies the type of image. This seems to be a bitmask:
|palette||Data type: uint16
Defines which palette should be used from the PRT file.
This data structure of the PRT file specifies how the bitmaps used for the sprites are structured. These bitmaps serve as a single component, several of which are assembled into an animation frame of a sprite.
The concrete image data is hidden in the op2_art.BMP in the game directory.
Why this bitmap file has a (mostly correct) RIFF bitmap header is unclear. Outpost probably uses 2 system APIs to load the graphics by temporarily taking over this header and overwriting the corresponding varying fields.
The pixel data can be found in the BMP file at the position offset + the uint32 offset, which can be found in the BMP file at address 0x000A (RIFF bitmap data offset) - and again correspond to the line by line arrangement from top left to bottom right.
Monochrome 1bpp graphics can be drawn in such a way that color 0 is full transparency, and color 1 is a semi-transparent black/grey, since the monochrome graphics are usually used for vehicle and building shadows in the animations.
With it you can already put together many graphics: