This is the specifications for the archive file which is handled by the Game Extractor plugin Archive_BMOD_OMOD.

Endian Order:Little Endian
Compression:none
Encryption:None


This format is used by the following Games:
Platoon *.bmod


This is the format specification information:
 
// HEADER
  4 - Header (OMOD)
  4 - File Length [+32]
  2 - Unknown (13)
  2 - Unknown (1)
  
// BLOCKS
  // for each block
    4 - Block Name
    4 - Block Length (including these 2 header fields)
    
    if (BlockName = DUMY){
      // Dummy, can contain objects in it
      4 - Object Number (incremental from 0)
      4 - Name Length
      X - Name
      68 - Unknown
      }
    else if (BlockName == OBST){
      // Object
      4 - Object Number (incremental from 0)
      4 - Name Length
      X - Name
      68 - Unknown
      }
    else if (BlockName == MESH){
      // Mesh
      4 - Unknown
      4 - Unknown
      4 - Number of Vertex Points
      }
    else if (BlockName == VERT){
      // Vertex block, contained within a MESH
      4 - Number of Vertex Points
      4 - Unknown
      4 - null
      
      // for each vertex (32 bytes per entry)
        4 - Vertex X
        4 - Vertex Y
        4 - Vertex Z
        4 - Normal X
        4 - Normal Y
        4 - Normal Z
        4 - UV X
        4 - UV Y
        
      4 - Number of Entries? (1)
      
      // for each entry
        4 - Unknown
      }
    else if (BlockName == ISTR){
      // Face Indexs block, contained within a MESH
      4 - Number of Face Indexes
      
      // for each Face Index
        2 - Face Index
      }
    else if (BlockName == FACE){
      // Faces block, contained within a MESH
      4 - Number of Faces
      
      // for each Face
        // LODP entry
      }
    else if (BlockName == LODP){
      // Unknown block, contained within a FACE
      4 - Unknown
      4 - Number of FSEC Entries? (1)
      
      // for each FSEC entry
        // FSEC entry
      }
    else if (BlockName == FSEC){
      // Face Sequence? block, contained within a LODP
      2 - null
      4 - Unknown (0)
      4 - Unknown
      4 - Number of Face Indexes
      4 - Unknown (101)
      4 - First Face Index Number
      4 - Last Face Index Number
      }
    else if (BlockName == OBOX){
      // Object Center Point
        4 - Center Vertex X
        4 - Center Vertex Y
        4 - Center Vertex Z
        4 - Center Normal X
        4 - Center Normal Y
        4 - Center Normal Z
      }
    else if (BlockName == MBOX){
      // Unknown block
      24 - Unknown
      }
    else if (BlockName == TEXT){
      // Unknown block
      4 - null
      4 - String Length
      X - String
      }
    else if (BlockName == MATE){
      // Material block
      4 - Material Number? (0/1)
      4 - Texture Filename Length
      X - Texture Filename
      
      4 - Number of Entries
      96 - Unknown
      
      // for each entry
        20 - Unknown
      }
    else if (BlockName == BLST){
      // Unknown block
      4 - null
      }
    else if (BlockName == ASEL){
      // Unknown block
      4 - Number of Strings
      
      // for each string
        4 - String ID
        4 - Unknown
        4 - String Length
        X - String
      }
    else if (BlockName == ASEC){
      // Unknown block
      4 - null
      }
    else if (BlockName == TIME){
      // Timestamp Block
      24 - Timestamp String
      }


These are the accompanying notes and further information:
 
Model
The Object Numbers are shared between blocks. For example, if the first block is DUMY, it'll have Object Number 0.
It doesn't matter what the next block is (eg DUMY, OBST, ...), it will have Object Number 1, etc.


Game Extractor is able to read files of this type, as well as files from thousands of other games. To give it a try, download Game Extractor (Basic Version) for free, and see what it can do.

For further information on this format, refer to the source code on our GitHub repository.