Sharpee
Chord / Vocabulary & Text / define phrasebook

define phrasebook, use phrasebook

A phrasebook groups phrase definitions into one named collection, optionally gated by a while predicate. It carries no fixed meaning of its own. It is simply a way to differentiate text by world state, and whatever the predicate selects for is up to you: a narrative voice, a mood, a chapter, or a location. Whichever declared book's while predicate holds at render time supplies the text, matched first in declaration order, per key. A predicate-less book is the default phrasebook. It is active whenever no earlier book claims the key, and it is the feature at its simplest: one named book with no predicates, used only to group entries.

define phrasebook midnight-book while midnight
  vane-mood, first-time:
    The vane swings hard north, as if the night had opinions.
  or
    The vane holds north. Of course it does.
end phrasebook

define phrasebook evening-book
  vane-mood, first-time:
    The vane noses the evening breeze, unhurried.
  or
    The vane sits easy in the last of the light.

  vane-quiet:
    The vane keeps its own counsel.
end phrasebook

Entries are ordinary phrase definitions. Each takes the form <key>[, strategy]: with or variants, and all five strategies apply, verbatim included. The consuming side is unchanged: you write phrase vane-mood in a clause body, or a {vane-mood} marker in prose. At midnight the first book wins vane-mood, and at any other time the default book supplies it. The default book covers vane-quiet alone, so vane-quiet renders the same in every state. Fallthrough is per key, never per book.

The compiler load-checks each of the following rules.

  • Story text always wins. A story-wide define phrase vane-mood (outside any book) beats every book, in every state; a per-entity phrase vane-mood: beats even that. Swapping books never changes text you wrote at those levels.
  • Story keys only. A book entry key is a single kebab-case word in the story's own phrase namespace. A dotted platform message ID raises analysis.phrasebook-dotted-key. To override a platform message, use a story-level override message <alias> block (ADR-255).
  • The book's while is the only gate. An entry-level while raises analysis.phrasebook-entry-gate. Split the entry into a second book instead.
  • Counters are per book. first-time/cycling/sticky state belongs to the entry: two books' first-time texts for the same key each fire their own "first", and both survive save/restore.
  • The active book is chosen at render. The choice happens when the turn's text renders, against the turn's final state. A turn that flips a predicate renders its whole output from the newly active book.

Two companion forms live outside the define phrasebook block, in the story header and in imported files.

story
  title: The Folly at Fernhill
  authors: The Sharpee Project
  use phrasebook candlewick-gothic while the player holds the locket
  use phrasebook plain-country

import "voices/winter"

use phrasebook <name> [while <condition>] in the story header activates a packaged phrasebook by name and binds the predicate at the use site. You may write it any number of times, and an unknown name raises analysis.unknown-phrasebook. import "voices/winter" at the top level splices in a file of your own define phrasebook blocks. The file on disk is voices/winter.chord, and its books take their arbitration position at the import line. A phrasebook file is just one kind of fragment, because import pulls in any multi-file story source, not only phrasebook blocks. Header use lines and spliced body blocks arbitrate together, in file order.