emulator: corsixth type: standalone core_classification: game_engine source: "https://github.com/CorsixTH/CorsixTH" upstream: ~ profiled_date: "2026-10-04" source_commit: "2d4671e267cae25847432a2e7d4f814b44f91e35" core_version: "0.70.1" display_name: "Theme Hospital (CorsixTH)" cores: [corsixth] systems: [theme-hospital] verification: existence notes: | CorsixTH is a Lua + C++ reimplementation of Bullfrog's Theme Hospital engine. It reads graphics, sprites, levels and sounds from an untouched Theme Hospital install (full retail/GOG or the shareware demo). App:checkInstallFolder() in CorsixTH/Lua/app.lua:1450 drives the install discovery: 1. config.theme_hospital_install (user override) is tried first (:1453). If unset or wrong, the loader scans a list of common paths (:1471-1489) looking for a folder that passes App:isThemeHospitalPath, which demands three subdirectories named data, levels and qdata (:1435-1447). 2. Once a candidate is accepted, three sentinel files MUST exist (:1521-1523): DATA/VBlk-0.tab LEVELS/Level.L1 QDATA/SPointer.dat Any missing file aborts init with "Invalid Theme Hospital folder specified in config file..." (:1526). 3. DataM/Demo.dat (:1535) marks the shareware demo install; its presence switches a different corruption-size check on ANIMS/WINLEVEL.SMK (243188), LEVELS/LEVEL.L1 (163948) and DATA/BUTTON01.DAT (252811) at :1559-1561. Full installs instead get soft size checks on ANIMS/AREA01V.SMK, WINGAME.SMK, WINLEVEL.SMK, LOSE1.SMK and INTRO/INTRO.SM4 (:1563-1567). 4. QData/Font00V.dat is read unconditionally (:1576) and its CRC32 picks the charset (mik vs cp437). The install root is read as a tree. FileSystem:setRoot() lists the root, each subdirectory is listed the first time a path crosses it, and every name is matched after normalise() upper-cases it (CorsixTH/Lua/filesystem.lua:59-76, 93-117, 243-272). Graphics, sprites, levels, sounds and movies are opened from that tree on demand, so the install is declared as one directory. The files the loader names at startup keep their own entries, written with the upper-case names the DOS release ships and the lookup normalises to. The sound/music path uses the game's XMI tracks when a SoundFont is available (App:findSoundFont at :1589 probes GeneralUser-GS.sf2, FluidR3_GM.sf2, FluidR3.sf3 and three Linux system paths); the SoundFont is a user preference, not game data. files: - name: "corsixth/" path: "corsixth/" type: directory system: theme-hospital category: game_data required: true description: "Theme Hospital install directory (full game or demo)" source_ref: "CorsixTH/Lua/filesystem.lua:64-76, CorsixTH/Lua/app.lua:1435-1447, 1454, 1499" note: "Accepted as an install when it holds data, levels and qdata subdirectories; the rest of the tree is opened by name on demand." - name: "VBLK-0.TAB" path: "corsixth/DATA/VBLK-0.TAB" system: theme-hospital category: game_data required: true description: "Theme Hospital core sprite index; sentinel checked at startup" source_ref: "CorsixTH/Lua/app.lua:1521" note: "Looked up as Data/VBlk-0.tab." - name: "LEVEL.L1" path: "corsixth/LEVELS/LEVEL.L1" system: theme-hospital category: game_data required: true description: "First Theme Hospital level file; sentinel checked at startup" source_ref: "CorsixTH/Lua/app.lua:1522, 1560" note: "Looked up as Levels/Level.L1. With the demo marker present, a size more than 1024 bytes away from 163948 is reported as corrupt and the game still starts." - name: "SPOINTER.DAT" path: "corsixth/QDATA/SPOINTER.DAT" system: theme-hospital category: game_data required: true description: "Sprite pointer table; sentinel checked at startup" source_ref: "CorsixTH/Lua/app.lua:1523" note: "Looked up as QData/SPointer.dat." - name: "FONT00V.DAT" path: "corsixth/QDATA/FONT00V.DAT" system: theme-hospital category: game_data required: true description: "Theme Hospital font; CRC32 selects charset (mik vs cp437)" source_ref: "CorsixTH/Lua/app.lua:1576-1584" note: "Looked up as QData/Font00V.dat." - name: "DEMO.DAT" path: "corsixth/DATAM/DEMO.DAT" system: theme-hospital category: game_data required: false description: "Demo marker; its presence selects the demo graphics set and the demo size checks" source_ref: "CorsixTH/Lua/app.lua:1535-1539, 1558-1561" note: "Looked up as DataM/Demo.dat. Absent from a full install."