emulator: OpenJazz type: standalone core_classification: game_engine source: "https://github.com/AlisterT/openjazz" upstream: "https://github.com/AlisterT/openjazz" profiled_date: "2026-10-04" source_commit: "a1626f4edd4a7af72c54103021790c56d8ecfced" core_version: "20260301" display_name: "Jazz Jackrabbit (OpenJazz)" cores: [] systems: [jazz-jackrabbit] notes: | Open-source reimplementation of Jazz Jackrabbit 1 (Epic MegaGames, 1994). Reads the original DOS game data; no asset bundling in the engine binary. File lookup walks a path list (platform paths, command-line paths, binary directory, working directory, compiled-in DATAPATH) and opens the first match. ref: src/io/file.cpp:51-77 (File::File), src/main.cpp:186-220 PANEL.000 is the first file opened at startup; the engine aborts with "Unable to find game data files" if that probe fails. The five .0FN fonts follow and abort startup the same way. ref: src/main.cpp:279-295, src/main.cpp:308-333 Level, tileset, sprite and planet names are built by createFileName(): LEVEL., BLOCKS., SPRITES., PLANET., with a three-digit world extension. The episode menu enables an episode when LEVEL0. exists for its first world (0, 3, 6, 9, 12, 15, then 30, 33, 36 and 50). ref: src/util.cpp:123-193, src/jj1/jj1episodeutils.cpp:19-36, src/menu/gamemenu.cpp:557-566 JJ2 engine support is experimental and gated by `ENABLE_JJ2` at build time (off by default); it reads JJ2's .j2l/.j2t files directly (no conversion step). ref: CMakeLists.txt:241-255, src/jj2/level/jj2level.cpp:54-67 files: # ================================================================ # Required files (startup aborts without them) # ================================================================ - name: "PANEL.000" category: game_data system: jazz-jackrabbit required: true source_ref: "src/main.cpp:281 (fatal: \"Unable to find game data files\")" note: "Status bar sprites plus two embedded fonts. Fatal if absent." - name: "FONT2.0FN" category: game_data system: jazz-jackrabbit required: true source_ref: "src/main.cpp:312, 318-333, src/io/gfx/font.cpp:60-64" note: "Startup font. File::File throws when absent and startup aborts." - name: "FONTBIG.0FN" category: game_data system: jazz-jackrabbit required: true source_ref: "src/main.cpp:313, 318-333" - name: "FONTINY.0FN" category: game_data system: jazz-jackrabbit required: true source_ref: "src/main.cpp:314, 318-333" - name: "FONTMN1.0FN" category: game_data system: jazz-jackrabbit required: true source_ref: "src/main.cpp:315, 318-333" - name: "FONTMN2.0FN" category: game_data system: jazz-jackrabbit required: true source_ref: "src/main.cpp:316, 318-333" - name: "STARTUP.0SC" category: game_data system: jazz-jackrabbit required: true source_ref: "src/main.cpp:435-443" note: "Opening cutscene. play() returns the error before the menu when it is absent." - name: "MENU.000" category: game_data system: jazz-jackrabbit required: true source_ref: "src/menu/mainmenu.cpp:72-82, src/main.cpp:458-466" note: "Main menu graphics. The MainMenu constructor throws when it is absent." - name: "SOUNDS.000" category: game_data system: jazz-jackrabbit required: false source_ref: "src/io/sound.cpp:278, 478-485" note: "Digital sound effects. loadSounds returns false when absent and the engine runs without sfx." - name: "MENUSNG.PSM" category: game_data system: jazz-jackrabbit required: false source_ref: "src/main.cpp:408, src/io/sound.cpp:337-344" note: "Menu music. playMusic returns silently when the file is absent." # ================================================================ # Menu extras (each reports its absence and returns to the menu) # ================================================================ - name: "INSTRUCT.0SC" category: game_data system: jazz-jackrabbit required: false source_ref: "src/menu/mainmenu.cpp:177-187" note: "Instructions screen." - name: "ORDER.0SC" category: game_data system: jazz-jackrabbit required: false source_ref: "src/menu/mainmenu.cpp:209-217" note: "Order information screen." - name: "MACRO.1" category: game_data system: jazz-jackrabbit required: false source_ref: "src/menu/mainmenu.cpp:277-289" note: "Demo recording played when the menu idles. MACRO.1 to MACRO.4 are probed." - name: "END.0SC" category: game_data system: jazz-jackrabbit required: false source_ref: "src/main.cpp:479-489" note: "Cutscene played when the main menu is left." # ================================================================ # Required when entering gameplay (level load fails without them) # ================================================================ - name: "FONTS.000" category: game_data system: jazz-jackrabbit required: true source_ref: "src/io/gfx/font.cpp:288-292, src/jj1/level/jj1levelload.cpp:412-421" note: "Level font. JJ1Level::load returns the error when it is absent." - name: "MAINCHAR.000" category: game_data system: jazz-jackrabbit required: true source_ref: "src/jj1/level/jj1levelload.cpp:223 (JJ1Level::load player sprites)" note: "Jazz sprite sheet. Required to start any level." - name: "BONUS.000" category: game_data system: jazz-jackrabbit required: false source_ref: "src/jj1/bonuslevel/jj1bonuslevel.cpp:53-61, 204-206, src/io/gfx/font.cpp:292" note: "Bonus level sprites and the bonus-screen font." - name: "BONUS.0SC" category: game_data system: jazz-jackrabbit required: false source_ref: "src/jj1/bonuslevel/jj1bonuslevel.cpp:764-766" note: "Cutscene played when a bonus level is won." # ================================================================ # Level data. Not every episode is required to run; a user may own # only one. The episode menu probes LEVEL0. for the first # world of each episode; the levels that follow are named by the # level data itself (next level and next world numbers). # ================================================================ - name: "LEVEL0.000" category: game_data system: jazz-jackrabbit required: false source_ref: "src/menu/gamemenu.cpp:324-325, 557-561" note: "First level of world 0, the opener of episode 1." - name: "PLANET.000" category: game_data system: jazz-jackrabbit required: false source_ref: "src/jj1/level/jj1levelload.cpp:437-473" note: "World intro planet screen (name + preview). The level loads under the name CUSTOM when it is absent." - name: "BLOCKS.000" category: game_data system: jazz-jackrabbit required: false source_ref: "src/jj1/level/jj1levelload.cpp:577-599" note: "World 0 tileset. The extension is the world number unless the level names another one." - name: "SPRITES.000" category: game_data system: jazz-jackrabbit required: false source_ref: "src/jj1/level/jj1levelload.cpp:602-609" note: "World 0 enemy/object sprites. One file per world." - name: "BONUSMAP.000" category: game_data system: jazz-jackrabbit required: false source_ref: "src/jj1/level/jj1level.cpp:690, src/menu/gamemenu.cpp:324,570" note: "Bonus level map for episode 1." - name: "LEVEL0.001" category: game_data system: jazz-jackrabbit required: false source_ref: "src/jj1/level/jj1level.cpp:794-801" note: "First level of world 1, reached from the level data of world 0." - name: "LEVEL0.002" category: game_data system: jazz-jackrabbit required: false source_ref: "src/jj1/level/jj1level.cpp:794-801" - name: "LEVEL0.003" category: game_data system: jazz-jackrabbit required: false source_ref: "src/menu/gamemenu.cpp:557-561, src/jj1/jj1episodeutils.cpp:26-28" note: "First level of world 3, the opener of episode 2." - name: "LEVEL0.004" category: game_data system: jazz-jackrabbit required: false source_ref: "src/jj1/level/jj1level.cpp:794-801" - name: "LEVEL0.005" category: game_data system: jazz-jackrabbit required: false source_ref: "src/jj1/level/jj1level.cpp:794-801"