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, and 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 bundled: true size: 164304 sha1: "f2b956a6ab8cd903de974bbe2deb59a45ab36984" md5: "f32a4d2aee1927349c80e471e791949f" 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 bundled: true size: 168396 sha1: "2025696a7049a27ee1cec2a9faf5fcd1cfe6201d" md5: "750428793e9a7f74484cef5029f1e9e9" 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 bundled: true size: 173600 sha1: "3319148d0e3c9575e379f53e5dd0d9a45efea109" md5: "873e8ea7a53a81f16ff3d77205964efd" 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 bundled: true size: 176888 sha1: "afce1f28df995726b7c9e49c4bf64c9b427c2ce0" md5: "d534b7b59e44c0b71b924e7c3899b5b4" 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 bundled: true size: 1504176 sha1: "23c9ac25750606f506d4c841f4efb0b33f596d09" md5: "b43719e0af7d587d2b9b274458a793ff" 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 bundled: true size: 1439752 sha1: "7deeaf8ff5d86b63d1def4e47f5998c351db3eb8" md5: "35a62c77d2a64dfd3a35807554685500" 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 bundled: true size: 1505932 sha1: "2544395d0eda03d605678790ed1f6cbadf5578e5" md5: "80c584701955add719913197713b884f" 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 bundled: true size: 1500764 sha1: "e561b7565fc1aeb945ffb7da355d321b43318510" md5: "84d0a6059796703ba8b95e7092670abc" 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, and a load failure is skipped. - name: "unifont.otf" description: "GNU Unifont, Basic Multilingual Plane glyph fallback" required: false bundled: true size: 5321400 sha1: "a550da89f2b7b4a6844842a50094569d67c6e8b0" md5: "9edf66ff1c62ec9e8f20126e5660d516" 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 bundled: true size: 5971416 sha1: "5dbe31ade8ebda982ba41dbd4311407ba88ff16a" md5: "863db23db082ef13d809f142d35411c9" 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 bundled: true size: 358 sha1: "6b47d1e68e79c258d8b733d0525beee7e567a776" md5: "4a2fc2266fb1c4139617e88722b5c6f9" 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 bundled: true size: 367 sha1: "6c389838c66c13397cc3c7096b31fca994bbb34c" md5: "597f5b89772b9660d732a5122d159d6b" 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 bundled: true size: 474 sha1: "225049ddfa6ce2c4b7198ca6c889c81d65b7946f" md5: "83b81c33ec97dbc100c850de7b04a694" 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 bundled: true size: 474 sha1: "813f91ff7f0a0b95fcd37e541414cdc29bbc2968" md5: "d766895891ccec110e15a044af6194c7" 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 bundled: true size: 474 sha1: "8032208eab8f10874f448c39bdc5a85b83d539b3" md5: "3a06a19b8441d931ddef2359116e405a" source_ref: "garglk/theme.cpp:304-316, garglk/CMakeLists.txt:568" - name: "Pencil.json" path: "themes/Pencil.json" description: "Pencil color theme" required: false bundled: true size: 360 sha1: "976b37a0451fb3cbed9a85ccf3c242ae768a4bc5" md5: "6e1743b8b40eaf3a85015013dcea7701" source_ref: "garglk/theme.cpp:304-316, garglk/CMakeLists.txt:569" - name: "Zoom.json" path: "themes/Zoom.json" description: "Zoom color theme" required: false bundled: true size: 358 sha1: "d312b25c5f3a92178a185de122aeb222a32d4096" md5: "641c88ce7f5e1a9a7ac4c18b90a9f38d" source_ref: "garglk/theme.cpp:304-316, garglk/CMakeLists.txt:570" - name: "dark.json" path: "themes/dark.json" description: "Dark color theme" required: false bundled: true size: 358 sha1: "3757750cd3052b8d23f379aba22d7ee3d9353bc9" md5: "2614becc041fc813cf87397aa47e8210" 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 bundled: true size: 412 sha1: "049412d56a41865539faadcd86408d5107a1dbef" md5: "37c78cb6e0105b946627038dcbfc8c64" 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."