Skip to content

docs: migrate Quest 5 docs into Starlight, content-accuracy pass - #2108

Draft
alexwarren wants to merge 113 commits into
mainfrom
v5-docs-migrate
Draft

docs: migrate Quest 5 docs into Starlight, content-accuracy pass#2108
alexwarren wants to merge 113 commits into
mainfrom
v5-docs-migrate

Conversation

@alexwarren

Copy link
Copy Markdown
Contributor

Summary

Test plan

  • npm run build and npm run lint in site/ are clean
  • Spot-check regenerated screenshots across a few pages
  • Verify sidebar navigation/structure matches the intended reorg

🤖 Generated with Claude Code

alexwarren and others added 30 commits May 3, 2026 12:48
Executes phases 1-5 of docs-migration-plan.md: 746 pages copied from the
v5 branch's docs/ into site/src/content/docs/, internal links resolved
and rewritten against the real source tree, referenced images/audio/
examples copied into site/public/, sidebar rebuilt from the original
Jekyll parent/grand_parent hierarchy into nested Starlight groups, and
the docs.textadventures.co.uk wildcard redirect added.

Phase 6 (removing docs/ from the v5 branch) is left for a follow-up -
that's a destructive change on a different branch.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…betizing it

The reconstructed Quest 5 sidebar was ignoring the just-the-docs nav_order
values and sorting every group alphabetically, and it wrapped everything in
a synthetic "Quest 5 Reference" header that didn't exist in the source nav.
Also, the v5 "guides" directory was landing in this site's own pre-existing
Guides section (introduction/hosting/webplayer) instead of nesting under
"Other Guides", where its own frontmatter parent chain actually places it.

Rebuilds the sidebar generator to sort by nav_order (falling back to
alphabetical only where the source had none, matching just-the-docs'
own behavior), fold every directory hub page (functions/index.md,
attributes/index.md, etc.) into the same parent/child tree instead of
bolting them on as flat siblings, and place the reconstructed groups
directly at the sidebar root next to Guides rather than under a wrapper.
Moves docs/guides/* to other_guides/ to match its real parent ("Other
Guides"), keeping this site's own guides/ untouched.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Migration was discarding nav_exclude, which surfaced two pages that were
never supposed to be in the sidebar. style_guide.md was a true orphan -
unlinked from anywhere and full of stale Jekyll-specific instructions
(e.g. "must link to the .html version") - so it's just removed rather
than kept as dead weight. functions/index_allfunctions.md is different:
it's deliberately linked from functions/index.md's "alphabetical order"
callout, just never meant to clutter the Functions sidebar group, so it
gets Starlight's direct equivalent (sidebar.hidden) instead of deletion.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…s via autogenerate

Functions/ has its own extra tier that autogenerate can't see: 319 pages
sit flat on disk, but their frontmatter chains up through 15 real category
hub pages (fn-attributes.md "Functions for Attributes", fn-scope.md
"Scope Functions", etc.) before reaching the Functions root. Using
{ autogenerate: { directory: "functions" } } listed all 319 as flat
siblings and lost that middle tier entirely - same problem for every
other directory group, just that none of the others happened to have a
hidden layer to lose.

Replaces the DIR_HUBS/autogenerate approach with one full explicit tree
built from every migrated page's original parent/nav_order frontmatter,
not just the top-level ones - this generalizes correctly to functions/'s
3-level structure without needing to special-case it.

Also fixes an unrelated bug this surfaced: Astro lowercases every slug
path segment (githubSlug), so the one mixed-case filename in the whole
tree (functions/currentDateUTC.md) was actually routable only at
/functions/currentdateutc - both the sidebar config and the inbound link
from index_allfunctions.md pointed at the wrong-case URL. Renamed the
file rather than special-case slug casing everywhere a route is computed.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
… URL, add community links

- ask_about.md and ask_tell.md both inherited the generic "Handling
  ASK/TELL" title from the source, even though they're complementary but
  different pages (one introduces SAY/TALK TO/ASK ABOUT generally, the
  other is a deep dive on building the ASK/TELL system). Retitled to
  "Ways to Talk to NPCs" and "Building an Ask/Tell System" respectively -
  content untouched.
- 5 pages linked to their own siblings via absolute URLs back to
  docs.textadventures.co.uk instead of a relative link (objectlistsort,
  shop, displaymoney, text_processor, quickparams) - normalized to
  internal links so they don't depend on that domain forever.
- Set astro.config.mjs `site` so the sitemap integration stops warning
  and actually emits sitemap-index.xml.
- guides/introduction.md's "Where's all the documentation?" section still
  said the docs were "a work in progress" living on the old Quest 5 site
  and would "be migrated to this site soon" - that's done now, so it
  points at the new Overview/Tutorial instead, and gained a "Getting
  help" section (Discord, GitHub Discussions, issue tracker) since
  nothing else in the site surfaced those.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Checked further: the archived docs.textadventures.co.uk page for Jay
Nabonne's PathLib exists on the Wayback Machine, but its own Download
link doesn't work either - the local archive.textadventures.co.uk forum
export shows the author deleted the v0.7 and v0.8 attachments himself
years ago on the original thread, and the export format doesn't capture
attachments at all for v0.9 to check further. Not recoverable, and not
worth chasing - the actual PathLib_GetPathExt/PathLib_AddEntry code this
page needs is already pasted in full a few paragraphs down, so nothing
here was actually broken beyond the attribution link itself.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
The previous fix dropped the dead PathLib link but left "Jay Nabonne
wrote a path-finding library we can use." pointing at nothing. The code
is already inline a few paragraphs down, so say that instead.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Starlight expands every sidebar group by default; just-the-docs (the old
theme) collapsed everything until you clicked in. With ~750 pages now in
one tree, fully expanded made the sidebar unusably long. Starlight still
auto-expands whichever group contains the current page, so this doesn't
change discoverability - just the default state.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…split

Cuts 13 stub/landing pages, merges 11 duplicate/derivative pages into
their targets, and fixes the resulting sidebar entries and cross-links,
per docs-migration-triage/triage-decisions.md.

Also sweeps ~30 pages that described a Quest 5-era split between a
desktop editor and a more limited web editor (drag-and-drop vs. a Move
button, missing Attributes tab, upload workarounds, etc.). Quest Viva
ships one unified AppShell editor now, so that split no longer exists;
instructions are collapsed into a single accurate path, verified
against the running editor rather than guessed.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Most screenshots in the migrated Quest 5 docs show the old desktop/web
editor, which no longer exists — Quest Viva has one unified AppShell
editor now. Adds tests/e2e/docs-screenshots/ (shared helpers in lib.mjs
plus one capture script per doc page) to regenerate them against the
live editor instead of by hand, and a .claude/skills/docs-screenshots
skill documenting the approach and gotchas (no id/aria-label hooks on
property fields, real ellipsis chars in placeholders, ambiguous tab
labels like "Object" vs "Objects").

Pilot covers tutorial/creating_a_simple_game.md's 7 screenshots. Capture
viewport is kept narrow (960px) and cropped to actual content per shot
(not the full window) so text stays legible once Starlight scales the
image down to its content column width.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Adds 6 more capture-*.mjs scripts covering using_scripts.md, custom_attributes.md,
using_containers.md, moving_objects_during_the_game.md, interacting_with_objects.md
(editor-chrome shots only — Switchonoffplay.png is an in-game player screenshot,
out of scope), and using_timers_and_turn_scripts.md — regenerating 16 stale Quest 5
editor screenshots against the current AppShell editor.

lib.mjs grows addVerb, addAdvancedElement, addScriptCommand, ifExpressionSelect/
ifObjectSelect, and toggleFeature to support the script-editor (if/then/else),
timer, and feature-toggle UI these pages exercise. SKILL.md's stated viewport
(1280x800) is corrected to the 960x800 the harness actually uses.

custom_commands.md and more_things_to_do_with_objects.md are skipped this round —
both are blocked by a real AppShell editor bug (multi-control simplepattern/
scriptdictionary sub-editors render nothing) surfaced while building this batch
and flagged separately.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…hots harness

Extends the Playwright docs-screenshot harness with two previously-deferred
capabilities: openPreview/sendCommand drive the toolbar Preview button into a
live WasmPlayer tab so a capture script can screenshot actual gameplay (not
just editor chrome), and capture()'s new cursorAt option draws a synthetic
mouse pointer, since a real screenshot never captures the OS cursor.

Applied both to the 3 pages already covered by the harness: using_containers.md
gains Containerfridgeplayer.png (opening the fridge to see the custom contents
prefix in play), and using_scripts.md/custom_attributes.md restore the mouse
pointer that the original Quest 5 screenshots had in Addif.png, Addif3.png and
Printexpression.png (confirmed by diffing against the pre-6d4a6460 versions).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…ects.md screenshots

These two tutorial pages were blocked since the last docs-screenshot round by
an AppShell bug where the Command element's Pattern field and the Use/Give
per-object script list rendered nothing. That bug is now fixed, confirmed via
tests/e2e/verify-appshell-multi-control-editors.mjs passing clean, so this
extends the docs-screenshot harness to both pages.

more_things_to_do_with_objects.md is fully done (7/7 images, including a tiny
inline icon crop for Add.png). custom_commands.md is 3/4 (Commandsay,
Commandweigh, Checkforattribute) — the 4th, Say_to_troll.png, hit a different,
still-unimplemented gap (the Switch script command's case-list editor renders
nothing), flagged separately for a follow-up fix.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
First wave of the ~47-page non-tutorial backlog (root site/public/images/ +
other_guides/), covering 9 images across 10 single-image pages: Debugger.png
(shared by about_types.md and debugging_your_game.md, via WasmPlayer's
editor-preview debugger), Pov1.png (changing_the_player_object.md), Talk3.png
(conversations.md), status2.png (status_attributes.md), Templates.png
(changing_templates.md), text_processor_text.png (text_processor.md),
type_attributes.png (using_inherited_types.md), verb_element.png
(using_verbs.md), and ShowMenu.png (showing_a_menu.md).

A prior classification pass (Explore agent) sorted the 47 pages into ~30
pure-editor, ~4 pure-player, ~5 external/out-of-scope, and ~6 mixed pages.
This wave covers the simplest single-image editor pages as a first slice.

ask_about.md's Asktell3.png hit a real gap - ScriptDictionaryEditor.svelte
(shared by Ask/Tell topics and Use/Give's per-object list) supports adding
and removing entries but not renaming an existing one's key, which the doc
page specifically demonstrates - flagged separately, page left for later.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Covers 12 images across 8 pages: cloak_of_darkness.md (cod01.png),
patrolling_npcs.md (patrol1.png - Set variable/If/Call-function-with-parameters
script on a custom string-list attribute), commands.md (CommandHelp.png,
CommandAttack.png), other_guides/starting_inventory.md and
other_guides/implementing_components_of_an_object.md (one image each),
speak_to.md (Talk1.png only - Talk2.png needs the still-unimplemented Switch
case-list editor), memory_or_wiki.md (memory1.png, memory2.png - the latter
demonstrates AppShell recognising a known library function, DoAskTell, and
swapping the generic "+ param" list for named fields matching its actual
signature), and score_health_money.md (increase_decrease.png, increase.png,
you_died.png).

Two recurring gotchas hit repeatedly this round, now worth remembering:
scrolled-input text truncation (a .fill()'d field showing its tail, not its
start, unless scrollLeft is reset) and same-label field collision once a
page has more than one row sharing a label like "Set variable" or "else if"
(must anchor on the specific nth occurrence of the label/branch itself, not
a page-wide following:: sweep, or fills land in the wrong row).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Regenerates 21 editor screenshots across 6 pages (character_creation.md,
editor_user_interface_elements.md, exits.md, convert.md,
asking_a_question.md, switchable.md) against the current AppShell editor.

lib.mjs gains two reusable helpers found along the way:
- setScriptCodeView: types raw quest-script into a script's Code view and
  switches back to Visual editor — much faster than reconstructing nested
  scripts via addScriptCommand, and the only way to reach "get input"
  (intentionally removed from the Add Script Command picker, superseded by
  GetInput(), but still fully editable once present).
- capture() now grows the viewport to fit content taller than the fixed
  960x800 frame (e.g. deeply nested get-input/show-menu chains) instead of
  silently truncating.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Regenerates all 8 editor screenshots in site/src/content/docs/containers.md
against the current AppShell editor (chest/backpack containers, locking,
limited-container volume/count, open/add-object trap scripts).

Found the doc's "Require all keys" checkbox (Quest 5.8+) has no
corresponding code path in the current container_lockable type — flagged
as a follow-up task, not fixed here; lockandkey.png captured faithfully
without it.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
docs/containers.md has described a "Require all keys" checkbox since
2018, claiming it shipped in Quest 5.8, but it was never actually
implemented in code (verified across the full git history back to the
2014 commit that added multi-key locking). Adds it for real: a new
requireallkeys attribute on container_lockable (default true, so
existing behaviour is unchanged) plus an AnyKeyAvailable function used
when it's unticked, and the corresponding Container-tab checkbox.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Regenerates the 4 of 7 editor screenshots in
site/src/content/docs/ask_simple_question.md that don't depend on the
Switch cases editor (menu1/1a/2/5.png). menu3/4/4a.png all render the
Switch command's Cases as a raw "[scriptdictionary]" placeholder — the
same unimplemented-control gap already flagged as task_082ae91c and fixed
upstream in PR #2090 (open, not yet merged); left at their old Quest 5
screenshots pending that merge.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Now that PR #2090 (Switch cases editor) is merged, regenerates the
remaining 3 of 7 screenshots that were blocked (menu3/4/4a.png), expanding
each case row so the actual per-case script content is visible rather
than the collapsed "▶ case" summary.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Now that PR #2091 (ScriptDictionaryEditor rename/edit-key support) is
merged, captures Mary's "dr black" topic renamed to "dr doctor black" via
the new Edit Key affordance — previously blocked entirely (no rename UI
existed).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Now that PR #2090 (Switch cases editor) is merged, regenerates Talk2.png
(the topic-menu + switch example) — previously blocked. Talk1.png
re-verified unchanged.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Now that PR #2090 (Switch cases editor) is merged, regenerates
Say_to_troll.png — previously blocked. The doc gives no exact code for
this "Additional Example (Advanced)" beyond the command pattern and "a
different response for different characters, and a default too", so the
switch's case/message content here is a reasonable invented match for
that description, not transcribed from the doc. Commandsay/Commandweigh/
Checkforattribute.png re-verified unchanged.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Now that PR #2090 (Switch cases editor) is merged, captures the nested
ShowMenu/switch/ShowMenu example — previously blocked. Confirms a
multi-key case ("Green", "Blue") also renders correctly as one case row.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
alexwarren and others added 30 commits August 18, 2026 21:52
Part 1/2/3 were a single continuous guide split for old-wiki pagination,
each ending with an explicit "in part N we will..." handoff to the next.
Merged into howto/ux/customising_the_ui.md, relying on Starlight's
right-hand page TOC for navigation instead of three separate sidebar
entries. Along the way, fixed a genuine duplicate-heading bug that
predated the merge - Part 1 had two H2 sections both titled "JavaScript"
- by folding the second (a one-paragraph transition into jQuery) into
the jQuery section's lead-in instead.

Redirects for the old three URLs point into the merged page: Part 1 to
the top, Part 2 and 3 to the #elements and #testing anchors where their
content now starts. Updated the 4 in-repo cross-links that pointed at
the old pages.

Zombie Apocalypse (Part 1)/(Part 2) were considered for the same
treatment but left as separate pages - unlike this reference-style
guide, they're a single continuous ~900-line "build this game" tutorial
project, the same kind of sequential hands-on content the main Tutorial
section already keeps as separate chapters rather than one page.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Extends the earlier page-title casing pass to H2-H4 headings within
page content, e.g. "Basic Controls" -> "Basic controls", "A Note About
Lists and Dictionaries" -> "A note about lists and dictionaries". Same
rule as before: capitalize only the first word and genuine proper
nouns/acronyms (Quest, GitHub, HTML, ID, RPG, etc.); code spans and
quoted UI strings within a heading are left untouched.

Explicitly excludes the merged Language Reference pages (scripts,
functions, attributes, elements, types, js) - their H2 headings are
literal function/attribute/command/element names, not prose section
titles, so changing their case would misrepresent real identifiers
rather than fix a style inconsistency. Also excludes 6 CSS-property H3s
in the newly-merged "Customising the UI" page (color,
background-color, width, opacity, border, background-image) for the
same reason - they're literal CSS property syntax.

Anchor slugs are unaffected throughout, since heading-derived anchors
are already lowercased regardless of display casing - no redirects or
cross-link updates needed.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
The "Troubleshooting" guide section under Guides was a set of 2012-era
teacher-contributed helpsheets that had drifted from actual troubleshooting
into ad-hoc recipes, all of which already had a better, current home:
locked exits/doors in exits.md, yes/no questions in asking_a_question.md,
timers in using_timers_and_turn_scripts.md/status_attributes.md, sounds in
adding_sounds.md, the object-prefix fix in the main tutorial, and the
"monster behind a door" puzzle already had a proper duplicate at
other_guides/timelimitedpuzzles.md. Removes the 11 helpsheet pages, their
index, the nav entry, and their now-orphaned screenshots (keeping the 5
still referenced by timelimitedpuzzles.md).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Covers three pages left over after the recent doc cuts: timelimitedpuzzles.md
(5 images, kept from the deleted helpsheets/ track), the switch-script page
(3 images, was blocked on the Switch case-list editor which has since
shipped), and copy_and_paste_code.md (1 image, TV's look script in Code
View).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Covers the three remaining pure-player pages: ui-style.md (classic interface,
colour-blend background with command bar off, cursor-only command bar with
panes off), ui-custom.md (CSS-styled game panes in four colour schemes), and
custom_panes.md (a custom HTML hit-points indicator bar).

ui-custom.md's JS.setCss("#status", ...) call is a no-op against the current
engine (the element was intentionally renamed to "#qv-status" in 42cdd9b),
so the top status bar keeps its default look in all four captures rather
than picking up the doc's styling - captured faithfully as the engine
actually behaves; flagged separately as a doc/engine follow-up.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…p.md

overview.md (6 images) is a broad illustrative tour rather than tutorial
prose, so the scenes are representative: editor tree/Setup, initial player
view, a room picture in the game pane (new original placeholder graphic,
not a copy of any existing artwork), a Verbs if/else script, a distinct
dark custom-UI theme, and a fresh Gamebook draft's default scaffolded page
(matches the old screenshot's content without any editing needed).

showing_a_map.md: Map.png and Map2.png (the two-room map feature basics)
via the Interface tab's map toggle + room Map tab sizing/colour/label
fields, screenshotting and auto-trimming the #gridPanel canvas. The other
5 images on that page (map3-7) illustrate specific multi-room layout edge
cases - matched-loop distances, path border types, up/down levels - that
need much more elaborate room graphs and are left for a follow-up pass.

lib.mjs: createLocalDraft gained an optional gameType param ('Gamebook')
for the overview-gamebook.png capture.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
SetUpShop.png (a Function with shop/stock params and its foreach/Call
function body) and StartShop.png (game Start script calling it) - the
latter confirms a user-defined function, once already declared elsewhere
in the same draft, gets recognised by the "Call function" picker and
rendered with named parameter fields rather than the generic +param form,
same as built-in functions.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
The one remaining image from adding_sounds.md (deferred out of the main
capture script since it needs a WasmPlayer preview, not editor chrome) -
the native HTML5 <audio controls> widget renders regardless of whether the
src resolves to a real file, so no audio asset was needed.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…erge)

Two rooms (Lobby W/Lobby E, sized 3x2 so the effect is visible) with a
zero-length exit and complementary Path East/Path West border types on
their shared side, demonstrating how two separate rooms can read as one
continuous space on the map. map3/map4/map5/map6 (matched-loop-distance
and up/down-level scenarios) still need much more elaborate, precisely-
measured room graphs and remain deferred.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Completes the last page in the docs screenshot regeneration effort.

map3/map4/map5 build a growing room graph matching the doc's own worked
arithmetic: a 3-room diagonal loop (Lounge/Lobby/Kitchen, all 2x2) plus
Garden hanging off Kitchen (map3); a second loop closed through
Garden-Gazebo-Garage-Kitchen with mismatched distances so the new exits
visibly don't meet (map4); then fixed by widening Garage to 2x2 and
setting the Kitchen<->Garage exit length to 3 on both sides, matching
Garden<->Gazebo's own total (map5). map6 demonstrates up/down exits
rendering the previous level faded behind the current one.

Also fixes a real bug in the exit-length helper (affecting map7.png too,
now corrected): clicking an exit's "direction → destination" summary link
selects the *destination room*, not the exit - matching a gotcha already
documented for a different page. Selecting the exit's own tree row also
turned out to need explicit scoping and expansion: a room's [data-value]
is shared by three different elements (the ARIA treeitem, the clickable
label, and the - possibly collapsed - content container holding its
children), and re-selecting a room after adding an exit to it doesn't
reliably re-expand the branch.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Rebuilt against the actual pre-migration screenshot (recovered from commit
9c6f2cc) after review caught several misses in the first pass:

- The Lobby W <-> Lobby E exit only had its length set to 0 on one side.
  Exit length is per-direction (not shared between the two auto-created
  reciprocal exits), so the un-set reciprocal left a stray visible
  connector between the two "merged" rooms - the same "remember to change
  both directions" lesson this page's own map5.png fix already applied,
  missed here on a different exit.
- Lobby/Lounge/Kitchen had no fill colours at all (original has peach/
  yellow/sky-blue).
- The Lobby E -> Lounge exit was a straight "north" instead of the
  original's diagonal "northeast".
- Lounge and Kitchen had lost their labels.
- The original has extra exit stubs off Lobby W, Lounge, and Kitchen
  trailing off-frame to unbuilt rooms - added stub destination rooms
  (Corridor/Study/Pantry/Cellar) so those lines render too.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…mages

The player dot (and the view's pan/recentre after it) animate toward their
new position over several requestAnimationFrame ticks rather than snapping
instantly (src/PlayerCore/Resources/grid.js's onFrame()/drawPlayer -
playerVector/offsetVector are plain top-level `var`s in a non-module
script, so reachable as window globals). sendCommand() only waits for the
game-logic turn to finish, not this separate canvas animation, so a
screenshot taken right after the last movement command could catch the
dot mid-slide - confirmed by the user noticing the dot's position looked
slightly off across several of these captures.

Added a wait for both vectors to null out (onFrame's own "arrived" signal)
before every grid screenshot in capture-showing-a-map.mjs. Re-ran all 7
captures: only map3.png and map5.png actually changed pixels (the dot
settling into its true final position instead of a fractionally-earlier
frame); everything else was already landing on the right frame by luck.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
capture() was screenshotting the editor mid-edit, showing the toolbar's
"Unsaved"/"Saving..." pill and the "only stored in this browser" backup
banner in most captures. It now saves and dismisses the banner first
(skipped when a modal dialog is the subject of the shot, since its
backdrop blocks the click).

Also fixes capture-overview.mjs's Bob to use "Male character (named)"
so the room description reads "Bob" instead of "a Bob", and swaps an
ambiguous text=watch wait in capture-tutorial-creating-a-simple-game.mjs
for the shared addVerb() helper, which was hanging on an invisible
responsive-mode duplicate label.

Regenerates all 129 affected screenshots.
… sync check

Cross-referenced every <function> in src/Engine/Core/*.aslx against the
function reference pages and found 150 undocumented functions plus a few
stale entries for functions that no longer exist (removed Scope* functions,
a non-existent ListVisible).

- Document the previously-unreferenced Pages dialogue-tree system
  (ShowPage/GoToPage/HasSeenPage/EndPageDialogue) in user-interface.md
- Add a new gamebook.md page for Gamebook-mode functions (flags, counters,
  page navigation) that had no home in the existing category taxonomy
- Add real entries for ~54 other author-facing functions across
  attributes/core/objects/general/clothing/scope/string.md
- Add internal-core.md placeholders for the ~96 remaining internal functions
- Remove/fix stale entries referencing removed or non-existent functions
- Add site/scripts/check-function-docs.mjs, wired into CI, which fails if a
  Core.aslx function has no doc entry, or a doc entry no longer matches any
  current library or hard-coded function

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Cross-referencing functions/scope.md's RemoveLookOnlyExits against
CoreScopes.aslx turned up an undocumented exit attribute; add it to
the attribute reference and link it from RemoveLookOnlyExits.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
The page-level intro already states games shouldn't normally need to
call these directly, so repeating that on every heading was pure
boilerplate left over from the merge. RequestSave keeps a standalone
"Deprecated." note since that was unique information.
The .aslx download link was broken since the Jekyll migration - the
game file was never carried over. Recovered the original from the old
docs repo's history and added it under site/public/examples/, matching
the existing PlayAudioExample.aslx convention.

Also moved the page out from under the beginner Tutorial (where it
read as a mandatory "second tutorial") into Guides, since its content
is meaningfully more advanced than the tutorial series.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
The earlier heading-casing pass (018a8d6) only searched for `##`/`###`
ATX-style headings and missed Markdown's underline-style (setext) H2
headings entirely, so ~530 headings across the site stayed
title-cased and in the older two-line format. Converts every setext
H2 to `## `, and sentence-cases each using the same rule as before:
capitalize only the first word and genuine proper nouns/acronyms,
leaving code spans, quoted UI strings, and literal in-game command
syntax (e.g. SAY, TAKE ALL) untouched.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…guage

Adds a custom TextMate grammar for Quest's script DSL (mirroring the
editor's own CodeMirror language definition), registered with
Starlight/Shiki so ```quest fences render with real syntax highlighting
instead of plaintext. Classifies and tags nearly every code block in the
docs (fenced and legacy 4-space-indented) by language - quest, xml, js,
regex, or css, using Shiki's built-in grammars where applicable. Blocks
that are genuinely non-code (game transcripts, verb-pattern tables,
runtime error messages) are deliberately left untagged.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Several fenced code blocks carried leftover leading whitespace from
their original 4-space-indented Markdown form (or from manual
indentation), so the rendered code started a few columns in instead of
flush against the block edge. Strips each block's common leading
whitespace while preserving relative nesting indentation; skips the
handful of blocks nested inside list items, where the indentation is
structural.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…dings

- Regenerate Switchonoffplay.png against the current WasmPlayer instead
  of the old Quest 5 desktop editor screenshot.
- Remove manual "Next:" links from tutorial pages that duplicated
  Starlight's automatic prev/next pagination.
- Move Cloak of Darkness to a top-level slug so its URL matches its
  "Guides" sidebar placement, with a redirect from the old path.
- Convert italic pseudo-headings ("Improved LISTEN" and 22 others in
  the `request` script command reference) to real headings, so they
  get anchors and show up in the page's table of contents.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
The per-request headings from the previous commit worked but bloated
the page's TOC (23 entries for what's now legacy/obsolete surface
area). A table is a better fit: one row per request name with its
effect and modern alternative, with the three entries that need more
than a one-liner (Show/Hide, SetCompassDirections, SetInterfaceString)
kept as prose below it.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- Sort the request reference table by request name.
- Link every "Use instead" cell to a real target where one exists;
  JS.* alternatives link to their entry on /js/. RequestSave's
  requestsave() has no documented target anywhere, so it stays
  unlinked.
- Add missing /js/ entries (panesVisible, setCompassDirections,
  setGameName) that games already call in several howto pages but
  the JS reference itself never documented, and fix uiShow/uiHide
  being out of alphabetical order there.
- Fix a pre-existing typo in the SetCompassDirections example
  ("whatever" instead of "south" as the seventh direction).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Since there's no code-level allowlist distinguishing "public" JS.*
functions from playercore.js internals (JS.foo literally window.evals
"foo(...)"), used "does an existing howto page already tell authors
to call this" as the public-surface signal. howto/ux/customising_the_ui.md
turned out to already be showing a much larger JS.* catalog than
js/index.md documented:

- addExternalStylesheet, AddYouTube, Grid_ClearAllLayers, hideBorder,
  setBackground, setGamePadding, setGameWidth, showStatusVisible,
  TurnOffHyperlinksUnderline, and the six SetMenu* colour/font
  functions - all real, all already recommended to authors elsewhere,
  none previously documented on the JS reference page itself.

Also fixed two accuracy bugs found while cross-checking against
playercore.js:
- setCss's own example called JS.setCSS (wrong case - the actual
  function is setCss, so that example would have silently failed).
- uiShow/uiHide claimed only 3 elements were valid targets; the
  implementation takes any CSS selector ($(element).show()/.hide()),
  with #gamePanes as the one special-cased name.

Replaced scripts/index.md's stale, incomplete duplicate of
setInterfaceString's valid element names (missing StatusLabel,
TypeHereLabel, ContinueLabel) with a link to js/index.md's
already-correct list, rather than fixing the same list in two places.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
WriteToLog was removed entirely in #1924 alongside the dead "write log
to file" feature, but Core.aslx's Log function is inlined into every
published game (see Core Library Semantics in CLAUDE.md) - an
already-published game with game.writelogtofile set still calls
JS.WriteToLog(text) on every Log() call, which now throws since the
function no longer exists anywhere in the runtime. Restoring it as a
no-op (as it already was before #1924) fixes that without reviving the
removed feature for newly-authored games.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…nd Wait

Checked each of the 23 request names against RequestScript.cs's actual
WorldModelVersion gating rather than trust the inherited "obsolete as
of 5.x" annotations:

- FontName/FontSize error unconditionally for WorldModelVersion >= 540
  (which includes 600, the default for every game saved today) with no
  restore path - genuinely dead, so removed from the table entirely
  rather than kept as a documented-but-broken row.
- Pause and Wait are gated only for 550..<600 and 540..<600
  respectively - both work again at WorldModelVersion 600. Commit
  0a0b544/44669ece ("introduce WorldModelVersion 600, restore sync
  script support") deliberately undeprecated them because the
  TCS-based async rewrite made the old sync-blocking versions more
  usable than their callback-based replacements. Dropped the stale
  "Obsolete"/"Deprecated" annotations accordingly.
- Stripped the remaining "(as of 5.x)" version-history annotations
  throughout - not useful to a reader authoring a new game today.

Also moved the Show/Hide pane-selector list and SetCompassDirections'
ordering rules out of the request table's trailing prose and onto the
actual JS.uiShow/uiHide/setCompassDirections entries on /js/, since
that's the API a reader ends up using - the request row now just links
there instead of duplicating the detail locally.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…ture games

GamebookCore.aslx (which defines these) isn't included in a Text Adventure
game's library chain, only Core.aslx/CorePages.aslx is - so add matching
implementations to CorePages.aslx, using the same options-stringdictionary
mechanism as the Gamebook versions.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Pages had no documentation at all - add a tutorial chapter building a
branching conversation with Bob, a deeper "Building a conversation with
Pages" guide under NPCs & Dialogue, and cross-links from Introduction to
conversations and Handling SPEAK TO.

Verbs were used from the first tutorial chapter onward but never got a
deeper treatment the way commands do - add a chapter combining the two
(a custom SIT command invoking the sofa's own verb script), and fix an
existing inaccuracy in the verb name/attribute table in How to use verbs
found while verifying it against CoreCommands.aslx.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Mirrors the existing Gamebook "Add page link"/"Remove page link" adder
entries in GamebookCoreEditorScriptsPages.aslx, for the Text Adventure
versions of these functions added in a prior commit. English, German and
Spanish translations included - verified with tools/i18n/audit.mjs --strict.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant