babelmap v0.1.0-beta.4
Pre-releasebabelmap 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.tomlschemas 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, oropen-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 underTERM=dumb. It emits no
escape sequences at all, hands line editing and echo back to the terminal, and
drops the[MORE]pager.NO_COLORis 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 ingvm-cliandscott-cli— previously onlyzvm-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-readermode. 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'sABOUT— to say that a>had
moved down one row.zvm-cliandgvm-clinow 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/pwhen
the legend names them, else Down/Up), steering by where the marker actually
landed rather than by a press count, because Arthur'sNsteps over its
section headings./menure-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-readerchanges — piped and terminal output are
byte-identical, verified across 13 Z-machine and 9 Glulx stories.
→ interpreter
Changed
--no-statusis now--story-only(zvm-cli;--lower-onlyremains an
alias, and the old spelling still works with a notice). It reads too much like
what--plaindoes to the status line while being stronger — it suppresses the
whole upper window, menus and forms included.gvm-cligains the same flag.gvm-clirenders 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-cliandgvm-cli
previously ignored them — a mistyped--no-statudid nothing and exited 0 —
andzvm-clitook an unknown single-dash argument such as-xfor 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/@restoreabandons 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
@restartno 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.
- Hostile files can no longer crash or hang the host. Illegal Z-machine
Platform notes
- Linux (
x86_64, glibc, built on Ubuntu 22.04) requires
libasound2at 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 withxattr -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