Sharpee
Chord / Standard Library / Traits Catalog / Structural traits

Structural & authoring traits

identity is every entity's who-am-I, composed implicitly by every create block: the name, aka aliases, and description land here, along with the article/proper-name machinery the sentence assembler uses, grammatical number, the narration's pronoun set, disambiguation adjectives, and optional weight/volume/size. From Chord: name, aliases, description, plural, concealed, and on persons proper and pronouns (ADR-242); the rest is TypeScript.

The author writes:

create the Gatehouse
  a room

  A stone gatehouse with an iron-barred window.

create Tobias
  aka groundskeeper
  a person, proper
  pronouns he
  in the Gatehouse

  A weathered man with a ring of keys.

create the zookeeper
  a person
  in the Gatehouse

  Someone in a canvas apron, name unknown.

create the iron gates
  aka gates
  plural
  scenery
  in the Gatehouse

  Twin gates of black iron, shut fast.

create the player
  starts in the Gatehouse

The player sees:

> look
Gatehouse
A stone gatehouse with an iron-barred window.

You can see Tobias and a zookeeper here.

> take the gates
The iron gates are fixed in place.

> take tobias
You can't take Tobias.

> take the zookeeper
You can't take the zookeeper.

One word each way: proper (person-only) renders Tobias bare-named in the room listing and in refusals while the unmarked zookeeper keeps an article, and plural sets grammatical number so every message agrees: the gates "are" fixed in place where the statue "is".

The rest of the trait in one-liners:

  • pronouns he (or she, it, they, or a define pronouns named set, per chord-language.md) names a person's narration pronoun set; absent means the by-number fallback ("it"/"they"). Nothing is inferred from a name.
  • concealed marks a hidden item that searching reveals and announces.
  • points awards score on the first take, deduped per entity. It is TypeScript-only today; Chord's score … worth N lines are the separate named-award system.
  • The create-line article is never read for identity: create the zookeeper and create a zookeeper load identically.

region (a region, a kind noun since ADR-236) groups rooms into areas: a room carries a region id, regions nest by containing each other, and going emits region_exited / region_entered per crossed boundary. Everything is authored region-side: containing lists members (additive across lines), after entering it / after leaving it react to boundary crossings (leaving exists only on region blocks), and an on every turn clause on the region block is a region daemon, firing only while the player is in a member room (the daemon machinery is the plugins layer's).

The author writes:

create the Grounds
  a region
  containing the Orchard, the Apiary

  after entering it
    phrase under-the-boughs
  end after

  after leaving it
    phrase back-on-the-road
  end after

  on every turn
    phrase bees-drone
  end on

  phrase under-the-boughs:
    You pass under the boughs; the air turns sweet with windfall.

  phrase back-on-the-road:
    The orchard smell fades behind you.

  phrase bees-drone:
    Bees drone somewhere among the trees.

The player sees (starting outside the region, walking east through it and back):

> east
Orchard
Apple trees in ragged rows.

Bees drone somewhere among the trees.

You pass under the boughs; the air turns sweet with windfall.

> east
Apiary
White hives stand in the grass.

Bees drone somewhere among the trees.

> west
Orchard
Apple trees in ragged rows.

Bees drone somewhere among the trees.

> west
Gatehouse
A stone gatehouse at the edge of the grounds.

The orchard smell fades behind you.

Boundary reactions fire only on crossings (the Orchard-to-Apiary move inside the region says nothing extra), while the daemon speaks in every member room and falls silent the turn you leave. One honest gap: the trait's ambient-sound/smell fields are declared but nothing reads them yet (dormant).

scene provides narrative phases with a lifecycle: a scene waits, begins when its registered begin-condition fires, counts its active turns, and ends (or recurs) on its end-condition, evaluated every turn by an always-on engine plugin, emitting scene_began / scene_ended plus any registered reaction messages. The conditions are code (closures registered on the world, re-register after restore); the trait's state persists. It is TypeScript-only, with no Chord surface.

story-info is the story's masthead on an invisible system entity: title, author, version, description, plus build metadata (build date, engine/client versions, ported-by, credits). ABOUT and VERSION read it; the info channels and save metadata consume it. A Chord story never touches it directly; the header (story "…" by "…", version:, blurb:) flows through and the engine materializes the trait.

One neighbor in the traits directory is not a trait at all: obstructor-protocol (ADR-173) is a query-helper module for walls: a wall side may name an obstructedBy entity, and capability consumers (today the sound system's acoustic dampening, ADR-172) ask at query time whether that obstructor is still in the room, so pushing the bookcase aside lifts the obstruction with no bookkeeping. It is TypeScript plumbing only, with no Chord surface and no verb.