emulator: TR2X display_name: "TR2X" type: standalone core_classification: game_engine source: "https://github.com/LostArtefacts/TRX" upstream: "https://github.com/LostArtefacts/TRX" source_commit: "c43c1cc875277324dff44a9e57e4fdd58fd3fb4c" upstream_commit: "c43c1cc875277324dff44a9e57e4fdd58fd3fb4c" profiled_date: "2026-10-04" cores: [] systems: - tomb-raider-2 notes: | Enhanced engine for Tomb Raider 2 (1997), part of the TRX monorepo that also hosts TR1X and TR3X. Loads retail .tr2 level files, the main.sfx soundbank, music tracks and FMV cutscenes from a Steam, GOG or disc install of TR2. Path resolution (src/trx/game/paths.c): levels %mod_dir%/levels/ GAME_DYNAMIC_PATH_LEVEL_FILE sfx %mod_dir%/ GAME_DYNAMIC_PATH_SFX_FILE fmv %mod_dir%/fmv/ GAME_DYNAMIC_PATH_FMV_FILE music %mod_dir%/music/ GAME_DYNAMIC_PATH_MUSIC_DIR with %mod_dir% = games/tr2 under the TRX root. The gameflow.json5, the catalog_*.csv tables, string tables, injections, images and shaders ship inside the TRX zip (data/trx/ship/) and are not user files. main.sfx is TR2's sample bank. The gameflow sets sfx_path to it (data/trx/ship/games/tr2/gameflow.json5:33) and the level pipeline reads it per level (src/trx/game/level/pipeline.c:179). FMV extension probing (src/trx/game/paths.c:76-79): .mp4 .mkv .mpeg .avi .webm .ogv .rpl .fmv .bik The retail Core/Eidos cutscenes are .rpl; the gameflow still names them .AVI, resolution picks whichever extension exists. Music backend (src/trx/game/music/backend_files.c:25-49): extensions .flac .ogg .mp3 .wav .wma file name trackNN. (two-digit) or N. Retail TR2 CD rips yield 2.mp3 through 61.mp3 (bare-number form, per docs/trx/INSTALLING.md ship tree). files: # Soundbank - name: "main.sfx" path: "games/tr2/main.sfx" required: true category: game_data source_ref: "data/trx/ship/games/tr2/gameflow.json5:33" note: "Shared sample bank, loaded for every level." # Levels # Enumerated by data/trx/ship/games/tr2/gameflow.json5 "levels" array. - name: "title.tr2" path: "games/tr2/levels/title.tr2" required: true category: game_data source_ref: "data/trx/ship/games/tr2/gameflow.json5:15" - name: "assault.tr2" path: "games/tr2/levels/assault.tr2" required: true category: game_data source_ref: "data/trx/ship/games/tr2/gameflow.json5:54" note: "Lara's Home / assault course." - name: "wall.tr2" path: "games/tr2/levels/wall.tr2" required: true category: game_data source_ref: "data/trx/ship/games/tr2/gameflow.json5:84" note: "The Great Wall" - name: "boat.tr2" path: "games/tr2/levels/boat.tr2" required: true category: game_data source_ref: "data/trx/ship/games/tr2/gameflow.json5:119" note: "Venice" - name: "venice.tr2" path: "games/tr2/levels/venice.tr2" required: true category: game_data source_ref: "data/trx/ship/games/tr2/gameflow.json5:144" note: "Bartoli's Hideout" - name: "opera.tr2" path: "games/tr2/levels/opera.tr2" required: true category: game_data source_ref: "data/trx/ship/games/tr2/gameflow.json5:171" note: "Opera House" - name: "rig.tr2" path: "games/tr2/levels/rig.tr2" required: true category: game_data source_ref: "data/trx/ship/games/tr2/gameflow.json5:202" note: "Offshore Rig" - name: "platform.tr2" path: "games/tr2/levels/platform.tr2" required: true category: game_data source_ref: "data/trx/ship/games/tr2/gameflow.json5:231" note: "Diving Area" - name: "unwater.tr2" path: "games/tr2/levels/unwater.tr2" required: true category: game_data source_ref: "data/trx/ship/games/tr2/gameflow.json5:260" note: "40 Fathoms" - name: "keel.tr2" path: "games/tr2/levels/keel.tr2" required: true category: game_data source_ref: "data/trx/ship/games/tr2/gameflow.json5:289" note: "Wreck of the Maria Doria" - name: "living.tr2" path: "games/tr2/levels/living.tr2" required: true category: game_data source_ref: "data/trx/ship/games/tr2/gameflow.json5:321" note: "Living Quarters" - name: "deck.tr2" path: "games/tr2/levels/deck.tr2" required: true category: game_data source_ref: "data/trx/ship/games/tr2/gameflow.json5:351" note: "The Deck" - name: "skidoo.tr2" path: "games/tr2/levels/skidoo.tr2" required: true category: game_data source_ref: "data/trx/ship/games/tr2/gameflow.json5:383" note: "Tibetan Foothills" - name: "monastry.tr2" path: "games/tr2/levels/monastry.tr2" required: true category: game_data source_ref: "data/trx/ship/games/tr2/gameflow.json5:411" note: "Barkhang Monastery" - name: "catacomb.tr2" path: "games/tr2/levels/catacomb.tr2" required: true category: game_data source_ref: "data/trx/ship/games/tr2/gameflow.json5:440" note: "Catacombs of the Talion" - name: "icecave.tr2" path: "games/tr2/levels/icecave.tr2" required: true category: game_data source_ref: "data/trx/ship/games/tr2/gameflow.json5:468" note: "Ice Palace" - name: "emprtomb.tr2" path: "games/tr2/levels/emprtomb.tr2" required: true category: game_data source_ref: "data/trx/ship/games/tr2/gameflow.json5:496" note: "Temple of Xian" - name: "floating.tr2" path: "games/tr2/levels/floating.tr2" required: true category: game_data source_ref: "data/trx/ship/games/tr2/gameflow.json5:526" note: "Floating Islands" - name: "xian.tr2" path: "games/tr2/levels/xian.tr2" required: true category: game_data source_ref: "data/trx/ship/games/tr2/gameflow.json5:552" note: "The Dragon's Lair" - name: "house.tr2" path: "games/tr2/levels/house.tr2" required: true category: game_data source_ref: "data/trx/ship/games/tr2/gameflow.json5:578" note: "Home Sweet Home" - name: "cut1.tr2" path: "games/tr2/levels/cut1.tr2" required: true category: game_data source_ref: "data/trx/ship/games/tr2/gameflow.json5:691" note: "Cutscene level 1" - name: "cut2.tr2" path: "games/tr2/levels/cut2.tr2" required: true category: game_data source_ref: "data/trx/ship/games/tr2/gameflow.json5:706" note: "Cutscene level 2" - name: "cut3.tr2" path: "games/tr2/levels/cut3.tr2" required: true category: game_data source_ref: "data/trx/ship/games/tr2/gameflow.json5:721" note: "Cutscene level 3" - name: "cut4.tr2" path: "games/tr2/levels/cut4.tr2" required: true category: game_data source_ref: "data/trx/ship/games/tr2/gameflow.json5:737" note: "Cutscene level 4" # FMV cutscenes # Enumerated by data/trx/ship/games/tr2/gameflow.json5 "fmvs" array. # The retail files on disc carry a .rpl extension; the gameflow still # lists .AVI, resolution picks whichever extension is present. - name: "LOGO.AVI" aliases: [logo.rpl] path: "games/tr2/fmv/logo.rpl" required: false category: game_data source_ref: "data/trx/ship/games/tr2/gameflow.json5:756" note: "Eidos legal screen." - name: "ANCIENT.AVI" aliases: [ancient.rpl] path: "games/tr2/fmv/ancient.rpl" required: false category: game_data source_ref: "data/trx/ship/games/tr2/gameflow.json5:757" note: "Intro cutscene." - name: "MODERN.AVI" aliases: [modern.rpl] path: "games/tr2/fmv/modern.rpl" required: false category: game_data source_ref: "data/trx/ship/games/tr2/gameflow.json5:758" - name: "LANDING.AVI" aliases: [landing.rpl] path: "games/tr2/fmv/landing.rpl" required: false category: game_data source_ref: "data/trx/ship/games/tr2/gameflow.json5:759" - name: "MS.AVI" aliases: [ms.rpl] path: "games/tr2/fmv/ms.rpl" required: false category: game_data source_ref: "data/trx/ship/games/tr2/gameflow.json5:760" - name: "CRASH.AVI" aliases: [crash.rpl] path: "games/tr2/fmv/crash.rpl" required: false category: game_data source_ref: "data/trx/ship/games/tr2/gameflow.json5:761" - name: "JEEP.AVI" aliases: [jeep.rpl] path: "games/tr2/fmv/jeep.rpl" required: false category: game_data source_ref: "data/trx/ship/games/tr2/gameflow.json5:762" - name: "END.AVI" aliases: [end.rpl] path: "games/tr2/fmv/end.rpl" required: false category: game_data source_ref: "data/trx/ship/games/tr2/gameflow.json5:763" # Music tracks (retail CD audio, ripped as N.). # Enumerated by the ship tree in docs/trx/INSTALLING.md (TR2 uses the # bare-number form, not the trackNN form; the loader accepts either). - name: "2.mp3" path: "games/tr2/music/2.mp3" required: false category: game_data source_ref: "src/trx/game/music/backend_files.c:48" - name: "3.mp3" path: "games/tr2/music/3.mp3" required: false category: game_data source_ref: "src/trx/game/music/backend_files.c:48" - name: "4.mp3" path: "games/tr2/music/4.mp3" required: false category: game_data source_ref: "src/trx/game/music/backend_files.c:48" - name: "5.mp3" path: "games/tr2/music/5.mp3" required: false category: game_data source_ref: "src/trx/game/music/backend_files.c:48" - name: "6.mp3" path: "games/tr2/music/6.mp3" required: false category: game_data source_ref: "src/trx/game/music/backend_files.c:48" - name: "7.mp3" path: "games/tr2/music/7.mp3" required: false category: game_data source_ref: "src/trx/game/music/backend_files.c:48" - name: "8.mp3" path: "games/tr2/music/8.mp3" required: false category: game_data source_ref: "src/trx/game/music/backend_files.c:48" - name: "9.mp3" path: "games/tr2/music/9.mp3" required: false category: game_data source_ref: "src/trx/game/music/backend_files.c:48" - name: "10.mp3" path: "games/tr2/music/10.mp3" required: false category: game_data source_ref: "src/trx/game/music/backend_files.c:48" - name: "11.mp3" path: "games/tr2/music/11.mp3" required: false category: game_data source_ref: "src/trx/game/music/backend_files.c:48" - name: "12.mp3" path: "games/tr2/music/12.mp3" required: false category: game_data source_ref: "src/trx/game/music/backend_files.c:48" - name: "13.mp3" path: "games/tr2/music/13.mp3" required: false category: game_data source_ref: "src/trx/game/music/backend_files.c:48" - name: "14.mp3" path: "games/tr2/music/14.mp3" required: false category: game_data source_ref: "src/trx/game/music/backend_files.c:48" - name: "15.mp3" path: "games/tr2/music/15.mp3" required: false category: game_data source_ref: "src/trx/game/music/backend_files.c:48" - name: "16.mp3" path: "games/tr2/music/16.mp3" required: false category: game_data source_ref: "src/trx/game/music/backend_files.c:48" - name: "17.mp3" path: "games/tr2/music/17.mp3" required: false category: game_data source_ref: "src/trx/game/music/backend_files.c:48" - name: "18.mp3" path: "games/tr2/music/18.mp3" required: false category: game_data source_ref: "src/trx/game/music/backend_files.c:48" - name: "19.mp3" path: "games/tr2/music/19.mp3" required: false category: game_data source_ref: "src/trx/game/music/backend_files.c:48" - name: "20.mp3" path: "games/tr2/music/20.mp3" required: false category: game_data source_ref: "src/trx/game/music/backend_files.c:48" - name: "21.mp3" path: "games/tr2/music/21.mp3" required: false category: game_data source_ref: "src/trx/game/music/backend_files.c:48" - name: "22.mp3" path: "games/tr2/music/22.mp3" required: false category: game_data source_ref: "src/trx/game/music/backend_files.c:48" - name: "23.mp3" path: "games/tr2/music/23.mp3" required: false category: game_data source_ref: "src/trx/game/music/backend_files.c:48" - name: "24.mp3" path: "games/tr2/music/24.mp3" required: false category: game_data source_ref: "src/trx/game/music/backend_files.c:48" - name: "25.mp3" path: "games/tr2/music/25.mp3" required: false category: game_data source_ref: "src/trx/game/music/backend_files.c:48" - name: "26.mp3" path: "games/tr2/music/26.mp3" required: false category: game_data source_ref: "src/trx/game/music/backend_files.c:48" - name: "27.mp3" path: "games/tr2/music/27.mp3" required: false category: game_data source_ref: "src/trx/game/music/backend_files.c:48" - name: "28.mp3" path: "games/tr2/music/28.mp3" required: false category: game_data source_ref: "src/trx/game/music/backend_files.c:48" - name: "29.mp3" path: "games/tr2/music/29.mp3" required: false category: game_data source_ref: "src/trx/game/music/backend_files.c:48" - name: "30.mp3" path: "games/tr2/music/30.mp3" required: false category: game_data source_ref: "src/trx/game/music/backend_files.c:48" - name: "31.mp3" path: "games/tr2/music/31.mp3" required: false category: game_data source_ref: "src/trx/game/music/backend_files.c:48" - name: "32.mp3" path: "games/tr2/music/32.mp3" required: false category: game_data source_ref: "src/trx/game/music/backend_files.c:48" - name: "33.mp3" path: "games/tr2/music/33.mp3" required: false category: game_data source_ref: "src/trx/game/music/backend_files.c:48" - name: "34.mp3" path: "games/tr2/music/34.mp3" required: false category: game_data source_ref: "src/trx/game/music/backend_files.c:48" - name: "35.mp3" path: "games/tr2/music/35.mp3" required: false category: game_data source_ref: "src/trx/game/music/backend_files.c:48" - name: "36.mp3" path: "games/tr2/music/36.mp3" required: false category: game_data source_ref: "src/trx/game/music/backend_files.c:48" - name: "37.mp3" path: "games/tr2/music/37.mp3" required: false category: game_data source_ref: "src/trx/game/music/backend_files.c:48" - name: "38.mp3" path: "games/tr2/music/38.mp3" required: false category: game_data source_ref: "src/trx/game/music/backend_files.c:48" - name: "39.mp3" path: "games/tr2/music/39.mp3" required: false category: game_data source_ref: "src/trx/game/music/backend_files.c:48" - name: "40.mp3" path: "games/tr2/music/40.mp3" required: false category: game_data source_ref: "src/trx/game/music/backend_files.c:48" - name: "41.mp3" path: "games/tr2/music/41.mp3" required: false category: game_data source_ref: "src/trx/game/music/backend_files.c:48" - name: "42.mp3" path: "games/tr2/music/42.mp3" required: false category: game_data source_ref: "src/trx/game/music/backend_files.c:48" - name: "43.mp3" path: "games/tr2/music/43.mp3" required: false category: game_data source_ref: "src/trx/game/music/backend_files.c:48" - name: "44.mp3" path: "games/tr2/music/44.mp3" required: false category: game_data source_ref: "src/trx/game/music/backend_files.c:48" - name: "45.mp3" path: "games/tr2/music/45.mp3" required: false category: game_data source_ref: "src/trx/game/music/backend_files.c:48" - name: "46.mp3" path: "games/tr2/music/46.mp3" required: false category: game_data source_ref: "src/trx/game/music/backend_files.c:48" - name: "47.mp3" path: "games/tr2/music/47.mp3" required: false category: game_data source_ref: "src/trx/game/music/backend_files.c:48" - name: "48.mp3" path: "games/tr2/music/48.mp3" required: false category: game_data source_ref: "src/trx/game/music/backend_files.c:48" - name: "49.mp3" path: "games/tr2/music/49.mp3" required: false category: game_data source_ref: "src/trx/game/music/backend_files.c:48" - name: "50.mp3" path: "games/tr2/music/50.mp3" required: false category: game_data source_ref: "src/trx/game/music/backend_files.c:48" - name: "51.mp3" path: "games/tr2/music/51.mp3" required: false category: game_data source_ref: "src/trx/game/music/backend_files.c:48" - name: "52.mp3" path: "games/tr2/music/52.mp3" required: false category: game_data source_ref: "src/trx/game/music/backend_files.c:48" - name: "53.mp3" path: "games/tr2/music/53.mp3" required: false category: game_data source_ref: "src/trx/game/music/backend_files.c:48" - name: "54.mp3" path: "games/tr2/music/54.mp3" required: false category: game_data source_ref: "src/trx/game/music/backend_files.c:48" - name: "55.mp3" path: "games/tr2/music/55.mp3" required: false category: game_data source_ref: "src/trx/game/music/backend_files.c:48" - name: "56.mp3" path: "games/tr2/music/56.mp3" required: false category: game_data source_ref: "src/trx/game/music/backend_files.c:48" - name: "57.mp3" path: "games/tr2/music/57.mp3" required: false category: game_data source_ref: "src/trx/game/music/backend_files.c:48" - name: "58.mp3" path: "games/tr2/music/58.mp3" required: false category: game_data source_ref: "src/trx/game/music/backend_files.c:48" - name: "59.mp3" path: "games/tr2/music/59.mp3" required: false category: game_data source_ref: "src/trx/game/music/backend_files.c:48" - name: "60.mp3" path: "games/tr2/music/60.mp3" required: false category: game_data source_ref: "src/trx/game/music/backend_files.c:48" - name: "61.mp3" path: "games/tr2/music/61.mp3" required: false category: game_data source_ref: "src/trx/game/music/backend_files.c:48" # The Golden Mask expansion # Known game tr2-gm, extends tr2 (src/trx/game/shell/mod.c:37-38). # Enumerated by data/trx/ship/games/tr2-gm/gameflow.json5 "levels" array. # Its FMVs and music fall back to games/tr2. - name: "main.sfx" path: "games/tr2-gm/main.sfx" aliases: ["main_gm.sfx"] required: false category: game_data source_ref: "data/trx/ship/games/tr2-gm/gameflow.json5:34, src/trx/game/game_flow/reader.c:198-219, src/trx/game/paths.c:203-212" note: "Sample bank of the expansion. main_gm.sfx is tried first, each name in the expansion directory then in games/tr2." - name: "title.tr2" path: "games/tr2-gm/levels/title.tr2" aliases: ["title_gm.tr2"] required: false category: game_data source_ref: "data/trx/ship/games/tr2-gm/gameflow.json5:16, src/trx/game/game_flow/reader.c:198-219, 903-909, src/trx/game/paths.c:123-132" note: "Title level of the expansion. title_gm.tr2 is tried first, each name in the expansion levels directory then in games/tr2/levels." - name: "level1.tr2" path: "games/tr2-gm/levels/level1.tr2" required: false category: game_data source_ref: "data/trx/ship/games/tr2-gm/gameflow.json5:56" note: "The Cold War" - name: "level2.tr2" path: "games/tr2-gm/levels/level2.tr2" required: false category: game_data source_ref: "data/trx/ship/games/tr2-gm/gameflow.json5:88" note: "Fool's Gold" - name: "level3.tr2" path: "games/tr2-gm/levels/level3.tr2" required: false category: game_data source_ref: "data/trx/ship/games/tr2-gm/gameflow.json5:113" note: "Furnace of the Gods" - name: "level4.tr2" path: "games/tr2-gm/levels/level4.tr2" required: false category: game_data source_ref: "data/trx/ship/games/tr2-gm/gameflow.json5:138" note: "Kingdom" - name: "level5.tr2" path: "games/tr2-gm/levels/level5.tr2" required: false category: game_data source_ref: "data/trx/ship/games/tr2-gm/gameflow.json5:175" note: "Nightmare in Vegas"