Files
libretro/emulators/openmohaa.yml
T
Abdessamad Derraz 96c31d7f44 fix: name the Allied Assault demo paks
The seven pk3 files under main/.variants/ are the Medal of Honor:
Allied Assault single-player demo 0.05, extracted from the December
2001 demo disc (archive.org ea-mohaa-sp-demo, EA_MOHAA_SP_Demo.iso,
sha1 4cba6697): Pak0 to Pak5, and Pak6 and Pak7, two identical empty
placeholders. OpenMoHAA reads the demo from main/ like the full game
(common.c:3168-3182) and mounts every .pk3 there (files.cpp:3136).

Each demo pak is now an entry with its hashes, listed before the
retail entry of its slot, so Pak0 to Pak5 resolve. The 1.11 patch
Pak6.pk3 keeps its slot. The retail entries keep unsourceable, now
naming the retail release as what the collection lacks.
2026-11-10 02:49:02 +01:00

302 lines
12 KiB
YAML

emulator: OpenMoHAA
type: standalone
core_classification: game_engine
source: "https://github.com/openmoh/openmohaa"
upstream: "https://github.com/openmoh/openmohaa"
profiled_date: "2026-10-04"
source_commit: "a2f340195975f4f042e28a60b62561dd9a0b2700"
upstream_commit: "a2f340195975f4f042e28a60b62561dd9a0b2700"
core_version: "0.83.0"
version_basis:
kind: file
path: "cmake/identity.cmake"
pattern: 'set\(PROJECT_VERSION\s+([0-9][^)\s]*)\)'
display_name: "OpenMoHAA"
cores: []
systems: [mohaa, mohaa-spearhead, mohaa-breakthrough]
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), and 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, while the Spearhead and Breakthrough
demos are read from demota/ and demott/
(code/qcommon/common.c:3168-3182, 3203, 3230, 3249).
files:
# ================================================================
# Allied Assault single-player demo 0.05 (December 2001), read from
# main/ like the full game with com_target_demo 1. Same names as the
# retail paks, other content: each is an alternative for its slot, listed
# first where the collection holds it and not the retail file.
# ================================================================
- name: "Pak0.pk3"
category: game_data
system: mohaa
path: "main/Pak0.pk3"
required: true
size: 16264817
sha1: "528eccd0f55a51030bfd2de856d53261574485d4"
md5: "4ce697656c5f1967764fb5a3c2f9b2ec"
source_ref: "code/qcommon/files.cpp:326 (fs_originalPaks_main[0]), code/qcommon/common.c:3168-3182 (TG_MOH demo reads main/), code/qcommon/files.cpp:4108 (Couldn't load default.cfg)"
note: "Carries default.cfg."
- name: "Pak1.pk3"
category: game_data
system: mohaa
path: "main/Pak1.pk3"
required: false
size: 18798683
sha1: "56d659e387f279a98e617f497c2dd12b2bae4959"
md5: "cebf628aa0be4a0b96f04c4eba1f0422"
source_ref: "code/qcommon/files.cpp:327 (fs_originalPaks_main[1]), code/qcommon/common.c:3168-3182 (TG_MOH demo reads main/)"
- name: "Pak2.pk3"
category: game_data
system: mohaa
path: "main/Pak2.pk3"
required: false
size: 31038822
sha1: "ed00c36523d934cc76b7ccecaa0dd8ebf4378b5d"
md5: "f4ccd60285289135e10e8e119b2b5cfb"
source_ref: "code/qcommon/files.cpp:328 (fs_originalPaks_main[2]), code/qcommon/common.c:3168-3182 (TG_MOH demo reads main/)"
- name: "Pak3.pk3"
category: game_data
system: mohaa
path: "main/Pak3.pk3"
required: false
size: 34737631
sha1: "e6bae955ce243980964df649ec716baea2b8c97b"
md5: "b15e06909965e7946d235517cc57280d"
source_ref: "code/qcommon/files.cpp:329 (fs_originalPaks_main[3]), code/qcommon/common.c:3168-3182 (TG_MOH demo reads main/)"
- name: "Pak4.pk3"
category: game_data
system: mohaa
path: "main/Pak4.pk3"
required: false
size: 9576
sha1: "7a610452d040402483f1b4c5334b1695b41375a3"
md5: "0d4c501f8d5c33d2a567a22fbc46d4c8"
source_ref: "code/qcommon/files.cpp:330 (fs_originalPaks_main[4]), code/qcommon/common.c:3168-3182 (TG_MOH demo reads main/)"
- name: "Pak5.pk3"
category: game_data
system: mohaa
path: "main/Pak5.pk3"
required: false
size: 2739284
sha1: "e8a18e62ecafa7d9aee46ecbac95be03d9eecaa2"
md5: "a8a9113bf71c08f0460c9f4d6635baf5"
source_ref: "code/qcommon/files.cpp:331 (fs_originalPaks_main[5]), code/qcommon/common.c:3168-3182 (TG_MOH demo reads main/)"
note: "Holds Mission 3 Level 3, the demo's one level."
# ================================================================
# Medal of Honor: Allied Assault retail (BASEGAME = "main")
# Reference list: fs_originalPaks_main[] at code/qcommon/files.cpp:324
# ================================================================
- name: "Pak0.pk3"
category: game_data
system: mohaa
path: "main/Pak0.pk3"
required: true
source_ref: "code/qcommon/files.cpp:326 (fs_originalPaks_main[0]), 4108 (Couldn't load default.cfg)"
note: "Carries default.cfg. Without it FS_Startup aborts with ERR_FATAL."
unsourceable: "retail release data the collection does not hold, and a same-named file of another game must not stand in"
- name: "Pak1.pk3"
category: game_data
system: mohaa
path: "main/Pak1.pk3"
required: false
source_ref: "code/qcommon/files.cpp:327 (fs_originalPaks_main[1])"
unsourceable: "retail release data the collection does not hold, and a same-named file of another game must not stand in"
- name: "Pak2.pk3"
category: game_data
system: mohaa
path: "main/Pak2.pk3"
required: false
source_ref: "code/qcommon/files.cpp:328 (fs_originalPaks_main[2])"
unsourceable: "retail release data the collection does not hold, and a same-named file of another game must not stand in"
- name: "Pak3.pk3"
category: game_data
system: mohaa
path: "main/Pak3.pk3"
required: false
source_ref: "code/qcommon/files.cpp:329 (fs_originalPaks_main[3])"
unsourceable: "retail release data the collection does not hold, and a same-named file of another game must not stand in"
- name: "Pak4.pk3"
category: game_data
system: mohaa
path: "main/Pak4.pk3"
required: false
source_ref: "code/qcommon/files.cpp:330 (fs_originalPaks_main[4])"
unsourceable: "retail release data the collection does not hold, and a same-named file of another game must not stand in"
- name: "Pak5.pk3"
category: game_data
system: mohaa
path: "main/Pak5.pk3"
required: false
source_ref: "code/qcommon/files.cpp:331 (fs_originalPaks_main[5])"
unsourceable: "retail release data the collection does not hold, and a same-named file of another game must not stand in"
- name: "Pak6.pk3"
category: game_data
system: mohaa
path: "main/Pak6.pk3"
required: false
source_ref: "code/qcommon/files.cpp:332 (fs_originalPaks_main[6])"
note: "Added by the 1.11 patch."
# The demo's own Pak6.pk3 and Pak7.pk3. The 1.11 Pak6.pk3 above takes
# the slot where the collection holds both.
- name: "Pak6.pk3"
category: game_data
system: mohaa
path: "main/Pak6.pk3"
required: false
size: 108
sha1: "492ab480a8dbefb888acbf6f3ee5bc1277945e28"
md5: "71f32f3ff6814b28531a70cf91689c8f"
source_ref: "code/qcommon/files.cpp:332 (fs_originalPaks_main[6]), code/qcommon/common.c:3168-3182 (TG_MOH demo reads main/)"
note: "An empty placeholder holding one folder entry."
- name: "Pak7.pk3"
category: game_data
system: mohaa
path: "main/Pak7.pk3"
required: false
size: 108
sha1: "492ab480a8dbefb888acbf6f3ee5bc1277945e28"
md5: "71f32f3ff6814b28531a70cf91689c8f"
source_ref: "code/qcommon/files.cpp:3136 (every .pk3 of the folder), code/qcommon/common.c:3168-3182 (TG_MOH demo reads main/)"
note: "An empty placeholder holding one folder entry, mounted like any pak of the folder."
# ================================================================
# Spearhead expansion (fs_basegame = "mainta", TG_MOHTA)
# Reference list: fs_originalPaks_mainta[] at code/qcommon/files.cpp:335
# Set com_target_game 1 to load this branch.
# ================================================================
- name: "pak1.pk3"
category: game_data
system: mohaa-spearhead
path: "mainta/pak1.pk3"
required: true
source_ref: "code/qcommon/files.cpp:337 (fs_originalPaks_mainta[0]), 3200 (fs_basegame=mainta), 4108"
note: "Spearhead default.cfg lives here, so the file is required when com_target_game=1."
unsourceable: "retail data the collection does not hold, and a same-named file of another game must not stand in"
- name: "pak2.pk3"
category: game_data
system: mohaa-spearhead
path: "mainta/pak2.pk3"
required: false
source_ref: "code/qcommon/files.cpp:338 (fs_originalPaks_mainta[1])"
unsourceable: "retail data the collection does not hold, and a same-named file of another game must not stand in"
- name: "pak3.pk3"
category: game_data
system: mohaa-spearhead
path: "mainta/pak3.pk3"
required: false
source_ref: "code/qcommon/files.cpp:339 (fs_originalPaks_mainta[2])"
note: "Added by the 2.11 patch."
- name: "pak4.pk3"
category: game_data
system: mohaa-spearhead
path: "mainta/pak4.pk3"
required: false
source_ref: "code/qcommon/files.cpp:340 (fs_originalPaks_mainta[3])"
note: "Added by the 2.15 patch."
- name: "pak5.pk3"
category: game_data
system: mohaa-spearhead
path: "mainta/pak5.pk3"
required: false
source_ref: "code/qcommon/files.cpp:341 (fs_originalPaks_mainta[4])"
note: "Added by the 2.15 patch, one build per language."
# ================================================================
# Breakthrough expansion (fs_basegame = "maintt", TG_MOHTT)
# Reference list: fs_originalPaks_maintt[] at code/qcommon/files.cpp:344
# Set com_target_game 2 to load this branch.
# ================================================================
- name: "pak1.pk3"
category: game_data
system: mohaa-breakthrough
path: "maintt/pak1.pk3"
required: true
source_ref: "code/qcommon/files.cpp:346 (fs_originalPaks_maintt[0]), 3227 (fs_basegame=maintt), 4108"
note: "Breakthrough default.cfg lives here, so the file is required when com_target_game=2."
unsourceable: "retail data the collection does not hold, and a same-named file of another game must not stand in"
- name: "pak2.pk3"
category: game_data
system: mohaa-breakthrough
path: "maintt/pak2.pk3"
required: false
source_ref: "code/qcommon/files.cpp:347 (fs_originalPaks_maintt[1])"
unsourceable: "retail data the collection does not hold, and a same-named file of another game must not stand in"
- name: "pak3.pk3"
category: game_data
system: mohaa-breakthrough
path: "maintt/pak3.pk3"
required: false
source_ref: "code/qcommon/files.cpp:348 (fs_originalPaks_maintt[2])"
note: "Added by the 2.40b patch."
- name: "pak4.pk3"
category: game_data
system: mohaa-breakthrough
path: "maintt/pak4.pk3"
required: false
source_ref: "code/qcommon/files.cpp:349 (fs_originalPaks_maintt[3])"
note: "Added by the 2.40b patch, one build per language."