Tutorial · The Game Master
The Game Master
You run a campaign. You're already tracking the cast, who's loyal to whom, the secret one player hasn't discovered, and the betrayal you've got planned for act three. TropeLang lets you write all of that down — and keep table-knowledge separate from character-knowledge — while it watches the tropes take shape.
The comments carry the teaching — read them, and edit any line to try it. (These are fragments; nothing to import.)
1 · The cast
Every campaign starts with who's in it. Here's a court — a king, his steward, and two players:
// char declares an entity — you choose the name
char aldric [+Ruler]
// [+Prop] tags say what a character IS — stack as many as you like
char vorn [+Ally] [+Champion]
// a $ name is a symbolic slot: a player-character,
// bound to a real seat at the table
char $mara [+Protagonist]
char $coll [+Protagonist] 2 · How they're tied
Connect them with edges. (Beyond -- there's > for "holds",
-> for "causes", >< for open conflict — see
the graph.)
char aldric [+Ruler]
char vorn [+Ally]
char $mara [+Protagonist]
// -- is a plain association (who relates to whom).
// the quoted phrase is a label, for you
vorn -- aldric : "sworn steward"
// edges work the same for a player slot
$mara -- aldric : "in his service" 3 · A secret only you know
This is the move that makes TropeLang worth it at the table: the same fact can be true, perceived, or hidden — and the brackets say which. The whole tension of the scene lives in three lines. (Epistemic levels goes deeper.)
char aldric [+Ruler]
char vorn [+Ally]
// facts live inside scenes & beats — a timeline
scene the_court {
beat 1 {
// !…! absolute truth (canon)
!vorn [+Traitor]!
// *…* a perception (how the king reads him)
*vorn [+Loyal]*
// ?…? latent — true, but hidden from the table
?vorn [+Traitor]?
}
} 4 · Your notes, off the table
The betrayal you're planning shouldn't leak to the players. Give it its own plane — and when the steward finally acts, the crossing makes that boundary-hop loud, on purpose. (Diegetic levels.)
// <<…>> sets the plane every line below lives on
<<world>>
char aldric [+Ruler]
char vorn [+Ally]
char $mara [+Protagonist]
// a second plane, marked non_canon —
// your notes, invisible to the players
<<world.gm_plan : non_canon, teller=gm>>
scene the_plan {
beat 1 {
// <<world|aldric>> is a CROSSING: reach from this plane into the world.
// every plane-hop is visible, so a secret can't leak by accident.
evt turn [&Betrays(agent=vorn, target=<<world|aldric>>)]
}
} 5 · Watch the trope appear
Now play it in the open: trusted, then turned. The recognition strip is your cue that a beat landed.
// vorn is the one who turns — the protagonist of this fall
char vorn [+Protagonist]
char aldric [+Ruler]
scene fall_of_the_court {
// trust is established…
beat 1 { vorn -- aldric : "sworn steward" }
// …then broken. &Verb tags describe what HAPPENS at an evt; params bind the roles
beat 2 { evt turn [&Betrays(agent=vorn, target=aldric)] }
}
// you never typed "betrayal" — the strip below recognizes the shape 6 · Numbers at the table
Some things at the table are quantities, not facts — hit points, armor class, a reputation score. A
stat declares one, written with the ^ sigil. Give a character a current value
and a ceiling and the number travels with them like any other tag.
// stat declares a numeric track — ^ is its sigil, the way + and # mark tags
stat HP [+Vital]
stat AC [+Defense]
char goblin [+Antagonist] [+Minion]
// give it a current value and a ceiling
goblin [^HP(cur=7, max=7)]
// a bare number is shorthand for cur
goblin [^AC=15] A rule can watch a number cross a line. The engine reads the value and tests it, but it never does the arithmetic: when the goblin takes nine damage, you do the subtraction and write the result. That split is deliberate — the table stays in charge of the math, while the engine recognizes what the number means once it lands. (More on rules in the guide.)
stat HP [+Vital]
char goblin [+Antagonist]
goblin [^HP(cur=7, max=7)]
// a rule can WATCH a number cross a line.
// $c binds any character; the engine only TESTS the value
rule DropsAtZero {
when:
char $c [^HP <= 0]
then:
$c [#Downed]
}
scene the_ambush {
beat 1 {
// the axe connects. YOU roll the damage and write the result —
// 7 hp, 9 damage: you set the new number, nothing computes it for you
goblin [^HP = -2]
}
} Coming soon — Game Master Mode. A forthcoming mode in the editor closes this loop for you: it rolls the dice, does the arithmetic, and writes the resulting events into the log — so you narrate the table and the record keeps itself. Until it ships, you set the numbers and write the events by hand, as above.
Where to go next
That's the loop: cast → ties → secrets → planes → recognition, session after session. The guide has the concepts behind any step, and every tag is in the glossary.