emulator: Gargoyle type: standalone core_classification: game_engine source: "https://github.com/garglk/garglk" upstream: "https://github.com/garglk/garglk" profiled_date: "2026-08-08" source_commit: "9e06211c20bee35026744424a57f50375cdc29db" core_version: "2026.1" display_name: "Interactive Fiction (Gargoyle)" cores: - gargoyle systems: - adrift - advsys - agt - alan - glulx - hugo - jacl - level9 - magnetic-scrolls - scott-adams - scott-adams-plus - tads - taylormade - zmachine mode: standalone notes: | Interactive fiction player built on the Glk library implementation garglk, shipping one interpreter binary per story format. The gargoyle binary reads the first 32 bytes of the file, matches it against a magic-number table, falls back to the extension, and executes the matching interpreter. ref: garglk/launcher.cpp:114-189 (probe, extensions, interpreters), 379-419 (rungame) Formats and the interpreter each one runs: Adrift 4 and Adrift 5 both default to scarier, which handles the two; scare takes Adrift 4 and FrankenDrift takes Adrift 5 only where the build asked for them, since each covers a single format. Then AdvSys (advsys), AGT (agility), Alan 2 (alan2), Alan 3 (alan3), Glulx (git), Hugo (hugo), JACL (jacl), Level 9 (level9), Magnetic Scrolls (magnetic), Scott Adams Graphic Adventures Plus (plus), Scott Adams (scott), TADS 2 and 3 (tadsr), TaylorMade (taylor), Z-machine (bocfel). Blorb files are unwrapped first and dispatched on the Exec chunk type. ref: garglk/launcher.cpp:50-74 (interpreter names), 276-328 (runblorb) Adrift 5 needs the FrankenDrift runner, a .NET build option that is off by default, including in the official AppImage. Without it the launcher reports that Adrift 5 is unsupported and stops. ref: CMakeLists.txt:77 (WITH_FRANKENDRIFT), gargoyle-appimage.sh:14, garglk/launcher.cpp:174-175,212 Every glyph is drawn through FreeType rather than by the operating system, so a font file has to be reachable. The default config asks for the families "Gargoyle Mono" and "Gargoyle Serif"; if fontconfig cannot resolve them, the interpreter loads the shipped TTF files by name from the data directory, then the executable directory, then the working directory, and calls winabort() when all three miss. ref: garglk/garglk.h:694-695 (defaults), garglk/garglk.ini:205,208, garglk/fontfc.cpp:83-154 (fontconfig lookup), garglk/draw.cpp:381-408 (path fallbacks), 300-350 (make_font, abort), 490-498 (file names) Gargoyle Serif is Charis SIL and Gargoyle Mono is Go Mono, both renamed so they can be installed system-wide without clashing. Font embedding was dropped because the OFL and the GPL do not mix, which is why the files are loaded from disk. ref: fonts/README Data directory by platform: /usr/share/gargoyle on Unix, /../share/gargoyle for the AppImage, the install directory on Windows, and the bundle Resources directory on macOS. Fonts sit at its root and themes in its themes subdirectory. macOS keeps the eight Gargoyle faces in Resources/Fonts and Unifont in Resources; the Windows installer also registers the eight faces as system fonts. ref: garglk/sysqt.cpp:960-1004, garglk/sysmac.mm:1013-1030, garglk/CMakeLists.txt:137,145, 510-534, gargoyle_osx.sh:124-125,211-213, installer.nsi:89-90,208-215 Themes are read from every *.json in the theme directories, which are the Qt application data locations plus the executable directory on Windows and the data directory for the AppImage. A parse failure is reported and the file skipped. The light and dark themes are also compiled into the binary, so the on-disk copies of those two replace identical entries. ref: garglk/theme.cpp:266-319, garglk/sysqt.cpp:982-1004, garglk/CMakeLists.txt:81-93 garglk.ini is not distributed: the default config is compiled in as a string and written to the highest-priority user location on demand. Installing a system copy is an off-by-default build option. ref: garglk/config.cpp:443-493, garglk/CMakeLists.txt:15 (INSTALL_GARGLKINI), garglk/CMakeLists.txt:61-79 (vtk_encode_string) MIDI in Blorb resources goes through FluidSynth, which needs a SoundFont. Gargoyle names none: the soundfont list is empty unless the user sets it in garglk.ini or the build hardcodes one, and the fallback is whatever FluidSynth reports as its own default. ref: garglk/config.cpp:294-298,864-872, garglk/snddecode.cpp:373-395, garglk/CMakeLists.txt:58 (DEFAULT_SOUNDFONT), INSTALL.md:153-157 Story files are content. Formats that carry companion data read it from the story file's own name or directory, so it travels with the game: Level 9 graphics as PICTURE.DAT, Magnetic Scrolls graphics and hints as .gfx and .hnt, Alan 3 resources as .a3r, TADS resources as .t3r, and the extra disk sides the Scott Adams, Plus and TaylorMade interpreters read from C64, Atari 8-bit and Apple II images. ref: terps/level9/Glk/glk.c:6415-6450, terps/magnetic/Glk/glk.c:5758-5855, terps/CMakeLists.txt:69,73,359,469,565 (c64diskimage, unp64) exclusion_note: > TADS character mapping files are not loaded by this build. The Glk port reports utf-8 and asc7dflt as the local character sets, both built-in tables, and its os_gen_charmap_filename() returns an empty name, so the automatic .tcp lookup never runs; cmap_load() only fires for a path given with -ctab. The agil.cfg read by AGiliTy lives in os_dos.c and os_dos16.c, while the build compiles os_glk.c. ref: terps/tads/glk/osmisc.c:69-72,316-334, terps/tads/tads2/cmap.c:290-315, terps/tads/tads2/trd.c:513-517, terps/CMakeLists.txt:111-119 files: # -- Text fonts, data directory root -- # Loaded by name when fontconfig cannot resolve the configured families. # Gargoyle aborts when a face is available from neither source. - name: "Gargoyle-Mono.ttf" description: "Gargoyle Mono regular (Go Mono)" required: true source_ref: "garglk/draw.cpp:657 (make_entry monor), garglk/draw.cpp:421-471 (make_font, winabort)" - name: "Gargoyle-Mono-Bold.ttf" description: "Gargoyle Mono bold (Go Mono)" required: true source_ref: "garglk/draw.cpp:658 (make_entry monob), garglk/draw.cpp:421-471 (make_font, winabort)" - name: "Gargoyle-Mono-Italic.ttf" description: "Gargoyle Mono italic (Go Mono)" required: true source_ref: "garglk/draw.cpp:659 (make_entry monoi), garglk/draw.cpp:421-471 (make_font, winabort)" - name: "Gargoyle-Mono-Bold-Italic.ttf" description: "Gargoyle Mono bold italic (Go Mono)" required: true source_ref: "garglk/draw.cpp:660 (make_entry monoz), garglk/draw.cpp:421-471 (make_font, winabort)" - name: "Gargoyle-Serif.ttf" description: "Gargoyle Serif regular (Charis SIL)" required: true source_ref: "garglk/draw.cpp:661 (make_entry propr), garglk/draw.cpp:421-471 (make_font, winabort)" - name: "Gargoyle-Serif-Bold.ttf" description: "Gargoyle Serif bold (Charis SIL)" required: true source_ref: "garglk/draw.cpp:662 (make_entry propb), garglk/draw.cpp:421-471 (make_font, winabort)" - name: "Gargoyle-Serif-Italic.ttf" description: "Gargoyle Serif italic (Charis SIL)" required: true source_ref: "garglk/draw.cpp:663 (make_entry propi), garglk/draw.cpp:421-471 (make_font, winabort)" - name: "Gargoyle-Serif-Bold-Italic.ttf" description: "Gargoyle Serif bold italic (Charis SIL)" required: true source_ref: "garglk/draw.cpp:664 (make_entry propz), garglk/draw.cpp:421-471 (make_font, winabort)" # -- Glyph substitution fonts, data directory root -- # Tried for every face after the main fonts; a load failure is skipped. - name: "unifont.otf" description: "GNU Unifont, Basic Multilingual Plane glyph fallback" required: false source_ref: "garglk/draw.cpp:473-496 (make_substitution_fonts), garglk/draw.cpp:642-644" note: > Covers glyphs missing from the text fonts. Loaded directly rather than through the system font mechanism, so it is not installed system-wide. - name: "unifont_upper.otf" description: "GNU Unifont, planes above the BMP" required: false source_ref: "garglk/draw.cpp:473-496 (make_substitution_fonts), garglk/draw.cpp:642-644" # -- Color themes, themes subdirectory -- # Every *.json in the theme directories is parsed, keyed on its name field. - name: "Blue.json" path: "themes/Blue.json" description: "Blue color theme" required: false source_ref: "garglk/theme.cpp:304-316, garglk/CMakeLists.txt:564" - name: "Breeze Darker.json" path: "themes/Breeze Darker.json" description: "Breeze Darker color theme" required: false source_ref: "garglk/theme.cpp:304-316, garglk/CMakeLists.txt:565" - name: "Lectrote Dark.json" path: "themes/Lectrote Dark.json" description: "Lectrote Dark color theme" required: false source_ref: "garglk/theme.cpp:304-316, garglk/CMakeLists.txt:566" - name: "Lectrote Sepia.json" path: "themes/Lectrote Sepia.json" description: "Lectrote Sepia color theme" required: false source_ref: "garglk/theme.cpp:304-316, garglk/CMakeLists.txt:567" - name: "Lectrote Slate.json" path: "themes/Lectrote Slate.json" description: "Lectrote Slate color theme" required: false source_ref: "garglk/theme.cpp:304-316, garglk/CMakeLists.txt:568" - name: "Pencil.json" path: "themes/Pencil.json" description: "Pencil color theme" required: false source_ref: "garglk/theme.cpp:304-316, garglk/CMakeLists.txt:569" - name: "Zoom.json" path: "themes/Zoom.json" description: "Zoom color theme" required: false source_ref: "garglk/theme.cpp:304-316, garglk/CMakeLists.txt:570" - name: "dark.json" path: "themes/dark.json" description: "Dark color theme" required: false source_ref: "garglk/theme.cpp:268-282, garglk/theme.cpp:304-316, garglk/CMakeLists.txt:81-86, garglk/CMakeLists.txt:571" note: "Also compiled in as the built-in dark theme." - name: "light.json" path: "themes/light.json" description: "Light color theme" required: false source_ref: "garglk/theme.cpp:268-282, garglk/theme.cpp:304-316, garglk/CMakeLists.txt:88-93, garglk/CMakeLists.txt:572" note: "Also compiled in as the built-in light theme."