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, with 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, and 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, since a user may # own only one. The episode menu probes LEVEL0. for the first # world of each episode, and 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"