OpenMoHAA - RetroBIOS¶
Technical notes
Reimplementation of the id Tech 3-derived engine that powers Medal of Honor: Allied Assault (2002) and its expansions Spearhead and Breakthrough. BASEGAME = "main" (code/qcommon/q_shared.h:35); the target game is selected at startup via the com_target_game cvar (0 = Allied Assault / TG_MOH, 1 = Spearhead / TG_MOHTA, 2 = Breakthrough / TG_MOHTT, code/qcommon/common.c:3164-3237).
FS_AddGameDirectory (code/qcommon/files.cpp:3106) scans the game folder for every "*.pk3" via Sys_ListFiles(curpath, ".pk3", ...) at line 3136, sorts them with paksort and mounts each one. It does not look up individual retail names and does not refuse an unknown pak. FS_Startup (code/qcommon/files.cpp:3640-3650) always loads com_basegame = "main"; Spearhead additionally sets fs_basegame = "mainta" (common.c:3200) and Breakthrough sets fs_basegame = "maintt" (common.c:3227), which triggers a second FS_AddGameDirectories call for that folder.
The only hard failure during init is "Couldn't load default.cfg" (code/qcommon/files.cpp:4108), i.e. no pak in the active search path provides default.cfg. Retail Pak0.pk3 (main/) carries it; Spearhead and Breakthrough ship a default.cfg inside their own pak1.pk3 so they can run with or without a main/ install under openmohaa.
The retail pak names are documented in-source as reference arrays fs_originalPaks_main / fs_originalPaks_mainta / fs_originalPaks_maintt (code/qcommon/files.cpp:324-350). They are declared but not currently consulted by the loader; they encode the files the engine was authored against. Capitalisation ("Pak0.pk3" under main/, "pak1.pk3" under mainta/ and maintt/) matches the retail ISO filenames and is preserved below for case-sensitive filesystems. FS_FilenameCompare and Sys_ListFiles are case-insensitive, so Windows installs match either casing.
FS_CheckPak0 (code/qcommon/files.cpp:3707) is a documented stub: the comment at 3710-3712 notes that MOHAA ships in too many localised pak versions to pin a checksum, so no CRC / MD5 is enforced on the paks.
com_target_demo 1 selects the demo protocol. The Allied Assault demo is read from main/ like the full game; the Spearhead and Breakthrough demos are read from demota/ and demott/ (code/qcommon/common.c:3168-3182, 3203, 3230, 3249).
16 files | 3 required, 13 optional | 5 in repo, 0 missing, 11 unsourceable Categories: 16 game data
Pak0.pk3 required unsourceable game_data
- Path:
main/Pak0.pk3 - System: mohaa
- Source:
code/qcommon/files.cpp:326,code/qcommon/files.cpp:4108 - Carries default.cfg; without it FS_Startup aborts with ERR_FATAL.
Pak1.pk3 optional unsourceable game_data
- Path:
main/Pak1.pk3 - System: mohaa
- Source:
code/qcommon/files.cpp:327
Pak2.pk3 optional unsourceable game_data
- Path:
main/Pak2.pk3 - System: mohaa
- Source:
code/qcommon/files.cpp:328
Pak3.pk3 optional unsourceable game_data
- Path:
main/Pak3.pk3 - System: mohaa
- Source:
code/qcommon/files.cpp:329
Pak4.pk3 optional unsourceable game_data
- Path:
main/Pak4.pk3 - System: mohaa
- Source:
code/qcommon/files.cpp:330
Pak5.pk3 optional unsourceable game_data
- Path:
main/Pak5.pk3 - System: mohaa
- Source:
code/qcommon/files.cpp:331
Pak6.pk3 optional in repo game_data
- Path:
main/Pak6.pk3 - System: mohaa
- Source:
code/qcommon/files.cpp:332 - Added by the 1.11 patch.
pak1.pk3 required unsourceable game_data
- Path:
mainta/pak1.pk3 - System: mohaa-spearhead
- Source:
code/qcommon/files.cpp:337,code/qcommon/files.cpp:3200,code/qcommon/files.cpp:4108 - Spearhead default.cfg lives here; required when com_target_game=1.
pak2.pk3 optional unsourceable game_data
- Path:
mainta/pak2.pk3 - System: mohaa-spearhead
- Source:
code/qcommon/files.cpp:338
pak3.pk3 optional unsourceable game_data
- Path:
mainta/pak3.pk3 - System: mohaa-spearhead
- Source:
code/qcommon/files.cpp:339 - Added by the 2.11 patch.
pak4.pk3 optional in repo game_data
- Path:
mainta/pak4.pk3 - System: mohaa-spearhead
- Source:
code/qcommon/files.cpp:340 - Added by the 2.15 patch.
pak5.pk3 optional in repo game_data
- Path:
mainta/pak5.pk3 - System: mohaa-spearhead
- Source:
code/qcommon/files.cpp:341 - Added by the 2.15 patch, one build per language.
pak1.pk3 required unsourceable game_data
- Path:
maintt/pak1.pk3 - System: mohaa-breakthrough
- Source:
code/qcommon/files.cpp:346,code/qcommon/files.cpp:3227,code/qcommon/files.cpp:4108 - Breakthrough default.cfg lives here; required when com_target_game=2.
pak2.pk3 optional unsourceable game_data
- Path:
maintt/pak2.pk3 - System: mohaa-breakthrough
- Source:
code/qcommon/files.cpp:347
pak3.pk3 optional in repo game_data
- Path:
maintt/pak3.pk3 - System: mohaa-breakthrough
- Source:
code/qcommon/files.cpp:348 - Added by the 2.40b patch.
pak4.pk3 optional in repo game_data
- Path:
maintt/pak4.pk3 - System: mohaa-breakthrough
- Source:
code/qcommon/files.cpp:349 - Added by the 2.40b patch, one build per language.
Generated on 2026-10-10T11:26:01Z