Chapter 7
Stories within stories
Epistemic levels ask who knows a fact. Diegetic levels ask a
different question: which world does the fact even live in? A character tells a story; that
inner tale is its own plane. A GM plans a twist the players can't see yet; those notes are on a plane of
their own. And the players themselves sit at a table — a plane outside the fiction entirely. TropeLang
gives all of these one construct: <<…>>.
Planes are flat and ambient
A <<world>> on its own line is a directive: every statement
below it lives on that plane, until the next directive switches planes. There's no indentation game, no
nesting in braces — the active level just flows down the file. You can reopen a plane later and add more
facts to it. Levels can have dotted names for sub-planes (world.gm_plan) and metadata, like
marking a plane non_canon — present in the story, but not ground truth.
A plane the table can't see
This is the move the construct is built for. The world is one plane; the GM's plan is another, marked non-canon and attributed to the GM. Nothing on that second plane is visible in the players' view of the world — the twist, staged in the wings.
<<world>>
char gm
char vale [+Protagonist] [+Mark]
<<world.gm_plan : non_canon, teller=gm>>
scene the_setup {
beat 1 { evt scheme [&Deceives(agent=gm, target=<<world|vale>>)] }
}
The token <<world|vale>> inside the scheme is a crossing: the
vertical bar reaches out of the current plane (the GM's plan) to name vale over in the
world. Crossings are the only thing ever decorated this way, and that's
deliberate — a fact leaking silently from one plane into another (the twist spoiling itself, a player's
table-knowledge bleeding into their character) is the most dangerous bug a narrative engine can have. So
every plane change is made loud and visible right in the source.
The player is a character
In a game, the player sits at the table and also is someone in the world. Those are two planes,
and TropeLang keeps them distinct. A player-character is written as a $-role — a slot bound
to a real seat when the session starts — declared on the world plane, while the seats live on the table
plane.
<<table>>
char $alice
char $ben
<<world>>
char vale [+Protagonist]
char $morty [+Protagonist] vale is a fully-authored NPC; $morty is a role waiting for a person. The
$ reuses the same "unresolved binding" idea from trope rules,
now pointing at a chair instead of a pattern variable. The boundary between the table and the world is
itself a crossing — and because crossings are always visible, table-knowledge and character-knowledge
can't leak into each other unnoticed.
Levels are the which-plane axis. There's an orthogonal which-time axis with the same loud-on-displacement discipline — story-time vs work-time, for flashbacks, shuffled timelines, and a character meeting their own other-time self. The two compose: a tale-within-a-tale told out of order is simply level × story-time.