Skip to content

Style Guide

Valid syntax is the floor. These are the conventions that make a fragment feel like Wyrdwright.

  • One situation per fragment. A fragment is a single scene with a beginning and an end - an afternoon, a conversation, a decision. Life-spanning arcs come from variables and played: checks across fragments, not from one giant fragment.
  • As many choices as the situation invites, each meaningfully different. Two quiet options or a wild spread both work; if two choices lead to nearly identical outcomes, cut one.
  • Gate boldly, but leave a door open. Whole situations locked behind high or low stats are part of the design: not every character can end up everywhere. But every scene has to offer somebody who reaches it something they can actually do, and the build enforces it: a scene whose choices are all gated fails with nothing but locked doors. Leave one choice ungated, or give the scene an *exhausted: target saying where a character goes when none of the gates opens. The second is how you write a deliberately locked scene; the first is how you write every other one.
  • ±2 to ±10 per stat, 0-3 stats per choice. The build warns from ±16 up. Save large swings for genuinely rare, drastic moments - a -20 should feel like an event. Remember the number is a percentage of the room left, so +10 on a middling stat is about five points and on a high one is one or two. When you are unsure what an event is worth, Sizing a number lists the range against the kinds of thing that happen to people.
  • Charge for good outcomes. The best result costing WEA-2, gated behind *requires:, or left to the dice (*if random(20) + VIT >= 70, a *random block) keeps choices interesting. Free wins make flat stories.
  • Don’t fight the curve. Everything drifts toward the middle: a high stat is hard to raise and easy to lose, a low one easy to raise and hard to lose. Writing a bigger number to force a high stat higher works out as a huge swing for everybody else, because the same line is read by characters at every point on the scale.
  • MOR is who they are, not a score for the choice. Disposition is a fact about the character, so it moves when they act against type as much as when they act in it: a cruel act by a saint still costs MOR, and a kindness from somebody selfish still earns it. Written the other way, as a tally of whether each choice was the good one, it stops being a personality and becomes a morality meter the player is being marked against. Nobody enjoys being graded, and they are watching the number move.
  • Delay the reveal when life would. Effects fire where you place them - if the cost of a choice only becomes clear a week later in story time, put the *effects: next to that paragraph, behind a ... beat. The choice-then-instant-feedback pattern is for immediate outcomes only.
  • Prefer variables over stats for facts. “Has a pet” is a variable, not HAP+2. Set it, and let future fragments pay it off with requires: has_pet.
  • Count the visits. *set: visits += 1 at the top of a hub, then *if visits = 1 for the arrival text and *else for the return text. A hub whose opening paragraph repeats verbatim on the fourth loop reads like a bug.
  • Never pay out on a loop. Stat effects in a hub body, or in a sticky choice that comes back to it, fire every single visit. The build warns; take the warning seriously, because a player who notices will farm it.
  • Give a hub a door. A hub that runs dry with no way out just ends the fragment, which lands flat. Point it somewhere with *exhausted: so the scene closes on your words, and add a sticky “leave” choice if the player should be able to go before they have seen everything.
  • Say the number when it earns its place. {visits} and friends print a value straight into the prose, which is worth it for a counter the player is tracking and noise for one they are not. “Your third time at this door” reads; “you have 3 dread” does not.
  • requires: (visible-but-disabled) when seeing the locked door is part of the experience: “Requires CHA ≥ 60” tells the player who they aren’t.
  • *requires_hidden: for temptations and secrets - a highly moral character shouldn’t even be shown “Steal the money.”
  • Using somebody else’s character needs no permission, unless it does. The Library says whether an element is open or reserved; reserved means ask whoever introduced them first. Once your fragment is accepted it keeps them whatever happens afterwards, so neither a later reservation nor the author leaving can take them out of your scene. What you never get is a say in who they become, since other fragments develop them too. Put them in the room and let them matter, but think twice about a scene whose whole shape is somebody else’s person.
  • Gate on the state, not on whether they have met. friend_kevin means the friendship landed, not that Kevin turned up in a scene. So unset covers both never meeting him and meeting him without it taking, and = false is a third thing again: a friendship that happened and came undone. Ungated, your scene greets all three the same way, and the worst of them is the one where it went wrong and your prose says old friend.
  • Gate anyway. An orphaned dependency is not yours to carry. If the only fragment setting the variable you require is ever withdrawn, your condition stays valid and simply stops being satisfiable. Fixing that is the project’s job, not yours, and it is always fixable: a shared variable belongs to nobody, so a replacement setter can be written by anyone. Build on other people’s work freely. youth_thirst requires friend_kevin, and only childhood_friend sets it.
  • Second person, past-agnostic present. “You stand very still.”
  • Keep paragraphs short - 1-3 sentences. The reveal rhythm of the game favors compact beats.
  • Write for all three pronoun sets. Read your {they} sentences aloud as he/she/they before committing.
  • Let low stats be funny and high stats be burdens sometimes. The best fragments treat stats as personality, not power level.
  • Tag TODOs honestly: # TODO Finish - low-INT branch is placeholder. The parser keeps comments out of the game, and other contributors can find them.