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.