Skip to content

babelmap v0.1.0-beta.4

Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 06 Aug 06:03
· 424 commits to main since this release
Immutable release. Only release title and notes can be modified.

babelmap v0.1.0-beta.4

Download the archive for your platform, extract it, and run babelmap
(or one of the no-map CLI players zvm-cli / gvm-cli / scott-cli).

Beta — on-disk save formats are version-pinned and any change
is a deliberate, release-noted bump (see
docs/release/save-format-policy.md); across 0.x versions the
frozen-tier formats may still break, never silently. The
config.toml / style.toml schemas remain tolerant.

Added

  • The matrix map view — mazes finally have a representation that tells the
    truth. Any layer can switch between the drawn map and a direction matrix
    (/view-map): one row per room, a column for every direction, each cell
    saying exactly what is known — mutual passage, goes-there-returns-elsewhere
    (with the return direction), one-way, self-loop, tried-but-flat, or untried
    frontier. Selecting a room bolds its known entrances; identically-named
    rooms number themselves; the table thins its cells before it scrolls. A
    layer marked as a maze (/mark-maze-layer, or accept the offer babelmap
    makes when it notices a tangle) defaults to the matrix. Self-loops — "west
    leads back here" — are now recordable at all, one-way passages grow
    arrowheads on the drawn map, and the room panel gains the full per-direction
    exit card (retiring the explored rose and untried-exits list it replaces).
    Designed against a real player's half-mapped Colossal Cave maze, which now
    lives in the test suite. → mapping

  • The command band replaces the verb menu (which was a left-edge token
    palette nobody could drive). Modeled on Journey's clickable menu system: a
    bottom band (F2, or open-command-band) whose columns fill in
    left-to-right as a phrase narrows — verb, then the objects actually here
    and carried (live from the engine, refreshed every turn), then the
    preposition column when the verb wants one. Everything is clickable, letters
    filter the active column, nothing sends without Enter, and the band is a
    dock rather than a modal: the prompt stays visible, paste works, and
    graphical v6 keeps its pixel path. Verbs and their grammar are configurable
    via [command_band].

  • Screen-reader mode — all three CLIs take --screen-reader (alias
    --plain), and select it automatically under TERM=dumb. It emits no
    escape sequences at all, hands line editing and echo back to the terminal, and
    drops the [MORE] pager. NO_COLOR is honoured separately, as colour only.

  • /status — a host command, at any line prompt in any of the three CLIs,
    that repeats the current status without the game seeing the command.

  • Score announcements — in --screen-reader, a score that changes is
    announced above the prompt ([Score 1, up 1]), since quietening the status
    line otherwise takes the score with it. Exact for Z-machine v1–v3 (a global the
    standard reserves) and for Scott Adams (treasures deposited); recovered from
    the status text for v4+ and Glulx, where no score is exposed to the
    interpreter at all.

  • [MORE] paging in gvm-cli and scott-cli — previously only zvm-cli
    paused at the bottom of a page, so a Glulx game with a long turn scrolled
    straight past; an ordinary Glk library pauses a text-buffer window the same
    way. All three now take --no-more (alias --no-page), page only when both
    ends are a terminal, and never page in --screen-reader.

  • --show-status — narrate the status line whenever the story updates it.
    Off under --screen-reader, because a Z-machine v3 status line carries a move counter
    and so changes on every single turn.

  • Menus read as menus in --screen-reader mode. A menu is a rectangle the
    game repaints, so linearised it used to re-read itself in full on every
    keypress — sixteen lines a press at Planetfall's InvisiClues menu, twenty-three
    at Arthur's, fifteen at Counterfeit Monkey's ABOUT — to say that a > had
    moved down one row. zvm-cli and gvm-cli now read a menu out once,
    host-numbered under a [menu — type a number to jump, Enter to select] line,
    and announce each move as >3. THE DORMITORY (3 of 12). Typing a number jumps
    to that item: the host walks the menu with the game's own keys (n/p when
    the legend names them, else Down/Up), steering by where the marker actually
    landed rather than by a press count, because Arthur's N steps over its
    section headings. /menu re-reads the open menu on demand — at a menu's
    own prompt as well as a line prompt, since screen-reader mode leaves the
    terminal cooked and a keypress there is a whole line. Detection is a
    mechanical diff: only a block that differs from the last one solely in
    marker position is treated as navigation, so a status line that changed, a
    menu that scrolled, or a form that gained a field is still emitted in full.
    Nothing outside --screen-reader changes — piped and terminal output are
    byte-identical, verified across 13 Z-machine and 9 Glulx stories.
    interpreter

Changed

  • --no-status is now --story-only (zvm-cli; --lower-only remains an
    alias, and the old spelling still works with a notice). It reads too much like
    what --plain does to the status line while being stronger — it suppresses the
    whole upper window, menus and forms included. gvm-cli gains the same flag.
  • gvm-cli renders Glk grid windows as inline text when there is no TTY; they
    were previously tracked and then dropped, losing the status line from piped
    output entirely.

Fixed

  • Unknown command-line options are now an error in all three CLIs, naming
    the option, printing the help, and exiting 2. zvm-cli and gvm-cli
    previously ignored them — a mistyped --no-statu did nothing and exited 0 —
    and zvm-cli took an unknown single-dash argument such as -x for the story
    path. A missing option value and a second positional argument are errors too.
  • A full-workspace code review closed forty-odd defects (SQ-0619–SQ-0661), the
    themes being:
    • Hostile files can no longer crash or hang the host. Illegal Z-machine
      instructions latch a fault instead of panicking; crafted stories, saves,
      blorbs and dictionaries that used to trigger unbounded recursion, multi-GB
      allocations, out-of-bounds indexing or infinite sibling walks are rejected
      or clamped in all three VMs; restored Glulx save data — stack frames, the
      Glk window tree, the heap block list — is structurally validated.
    • Nothing overwrites a good file with a bad one. Every persistence write
      (archive, config, saves, sidecar stores, downloads, exports) goes through
      one atomic temp-and-rename helper; a config that is valid TOML but has a
      wrongly-typed value no longer loads as defaults and then rewrites the
      user's file to defaults on the next save; the exit watchdog waits for an
      in-progress save.
    • Save/restore honesty across engines. A host restore over a suspended
      in-game @save/@restore abandons the old suspension in every engine
      (Glulx replayed the snapshot's last command as a free turn; the Z-machine
      recorded a discarded PC into the next save); a resize or a finishing sound
      no longer silently fails the save dialog the player is sitting in; v6
      @restart no longer replays pre-restart art on the next palette change;
      Quetzal v6 saves drop the dummy stack frame per §4.11.
    • The terminal is treated like the shared resource it is. Worker-thread
      panics no longer tear down a live session's terminal; kitty image ids are
      deleted when their windows close or resize instead of leaking; layered v6
      chrome art is cached instead of re-uploaded every frame; the CLIs accept
      only key presses (Windows doubled everything), reset the scroll region on
      every exit path, and enable VT processing on Windows.
    • Text is unicode, everywhere it wasn't. Typed non-ASCII input reaches the
      Z-machine as ZSCII instead of raw UTF-8 bytes; room notes, save
      timestamps, IFDB titles, selections, caret placement and field editing are
      char-, width- or grapheme-aware instead of byte- or column-indexed.
    • The map's layers behave. Peeling cuts only the true reciprocal edge,
      merging survives a deleted parent layer, a room can hold more than one
      non-compass passage, and Scott Adams noun resolution matches ScottFree
      (location-aware auto-get, the two-bottles problem).
    • Styling is honest. A whole family of parsed-but-dead style.toml keys
      (border sides, glyphs, dialog shadow/placement) now resolves; choosing a
      colour scheme no longer flips border structure; the modal selection,
      footer, inspector and search-highlight styles are themeable selectors
      instead of hard-coded colours.

Platform notes

  • Linux (x86_64, glibc, built on Ubuntu 22.04) requires
    libasound2 at runtime for audio —
    sudo apt-get install libasound2 (Debian/Ubuntu) or your distro's
    equivalent.
  • macOS is a universal binary (Apple Silicon + Intel), ad-hoc
    signed but not notarized with an Apple Developer ID. If you
    download it with a browser, Gatekeeper quarantines it — clear
    the flag with xattr -dr com.apple.quarantine <extracted-folder>
    (or approve it once in System Settings → Privacy & Security).
    Downloading and extracting from the Terminal avoids quarantine
    entirely: curl -L <url> -o babelmap.tar.gz && tar xzf babelmap.tar.gz.
  • Windows is x86_64. It is unsigned, so SmartScreen may warn on
    first launch (More info → Run anyway).

Verify a download against its .sha256 sidecar.

Full Changelog: v0.1.0-beta.3...v0.1.0-beta.4