Topic tables
Conversation is a declared table per person: one define topics for <person> … end topics block serving both ASK and TELL. Entity rows
(about the silver locket:) resolve like any noun and are checked
first. Quoted rows declare a topic plus comma-separated aliases. Each
alias is matched by normalized whole-topic equality, which is a direct
lookup and never a fuzzy guess. A
row's body is ordinary statements (it binds the owner), so a
conversation can change state anywhere in the world. A miss falls to
the owner's plain on the player asking catch-all if it has one; on a hit the
row fully owns the response. Overlaps are compile errors, never runtime
tie-breaks.
define topics for tobias
about the silver locket: phrase tobias-locket-reply
about "the folly", "the fire":
change tobias to shaken
phrase tobias-folly-reply
end topics
A row can also be gated on how recently a topic came up — see
Topic recency,
which extends this same define topics block, and
Characters & Conversation for
the wider dialogue layers built on it.