Style Guide
Valid syntax is the floor. These are the conventions that make a fragment feel like Wyrdwright.
Scope and shape
Section titled “Scope and shape”- 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
-20should feel like an event. Remember the number is a percentage of the room left, so+10on 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*randomblock) 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.
MORis 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 costsMOR, 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.
Consequences
Section titled “Consequences”- 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 withrequires: has_pet.
- Count the visits.
*set: visits += 1at the top of a hub, then*if visits = 1for the arrival text and*elsefor 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.
Gating
Section titled “Gating”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_kevinmeans 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= falseis 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_thirstrequiresfriend_kevin, and onlychildhood_friendsets 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.