Story Starts
storyStarts
Story starts are the selectable opening scenarios players choose from at the start of a game. Each defines the initial scene, what the player has, and the first narration. A scenario needs at least one start; most have two or three.
"Directions for the AI to start the story"
- Editor location
- World → Story Starts
- Editor type
- JSON + ADD ITEM
- Size limits
-
-
storyStarts(entry count) — 100 entries -
storyStarts.*(each entry, pretty JSON) — 4,000 chars (nominal; engine first fails at 4,008 pretty chars)
-
Schema
{
"storyStarts": {
"<key>": {
"name": "string",
"description": "string",
"storyStart": "string",
"locations": [
"string"
],
"locationAreas": [
"string"
],
"startingQuests": [
"string"
],
"startingItems": [
{
"item": "string",
"quantity": "number"
}
],
"isDefault": "boolean",
"startingPartyNPCs": [
"string"
],
"firstQuest": "string",
"questGenerationGuidance": "string"
}
}
}
Example
{
"The Road to the Capital": {
"name": "The Road to the Capital",
"description": "You arrive in the capital city as the political situation teeters. Factions are maneuvering, information is currency, and everyone seems to be waiting for the first move.",
"storyStart": "[ The capital has looked the same for a century, but something beneath the surface has shifted. ] You arrived on the morning coach, carrying your reputation and not much else. You are on the main thoroughfare. A courier cuts across your path and gives you the quick measuring look of someone who trades in information: 'You look useful. Are you looking for work?'",
"firstQuest": "Find out what is really happening in the capital and decide who, if anyone, you can trust.",
"locations": ["The Capital"],
"locationAreas": ["Market Quarter"],
"isDefault": true,
"startingQuests": [],
"startingPartyNPCs": ["Edra Vane"],
"questGenerationGuidance": "Quests in the Capital should turn on information leverage and factional pressure. Avoid pure dungeon-crawl framings -- the city's tension is political. Player capability surface to use: navigation, persuasion, knowledge, observation."
}
}
Fields
Keyed map. Outer key must exactly match inner name.
storyStart
The field is named storyStart, not narrative. A field named narrative is silently ignored by the engine.
The field supports two distinct authoring patterns:
-
Embedded prose (example above): draft narration text the AI expands from, using
[ ]brackets for narrator prologue and present-tense for the active scene. The AI treats this as a base to build on. - Director instruction: imperative AI prompt describing what to generate rather than pre-writing the text. No embedded prose; the AI produces all output from scratch. Example:
THE SITUATION — The city has been without its ruling council for six days following a sudden vacancy. Three factions are maneuvering to fill the gap and none of them will move openly until they understand where the player stands.
THE PLACE — Establish the players arriving at the main thoroughfare of the Capital. Early morning, market not yet open. The tension of a city holding its breath.
THE MOMENT — A courier approaches and makes first contact with a specific request: deliver a sealed message to the guild quarter before the council bell rings. No explanation given. Payment offered upfront.
Use the character's Background and Class to shape how they are approached and what they notice first.
Both patterns are valid. Director-instruction storyStarts give the author more control over the opening shape; embedded-prose storyStarts give the AI more of the specific language to work from.
Tense rule: events happening right now use present tense; backstory uses past tense. Getting it wrong causes the AI to open the session after the event has already occurred. Test every story start before publishing.
description
Player-facing blurb shown in the story start selector UI, before the player begins. This is the one field in storyStarts
that the player reads directly. Keep it to one to three sentences: what kind of opening this is, what situation the character is in, the tone. In production worlds this often opens with a genre or situation tag (“A political intrigue start”, “Tutorial”, “Combat-focused”) followed by a sentence of context.
firstQuest
Keep vague by default. It blends with whatever backstory the player writes during character creation. “Find out what is really happening in the capital” is about as specific as you should go — treat it as a thematic seed, not a quest description.
firstQuest can hold more than a vague thematic seed when the story start has a predefined first arc. For starts with a specific opening quest chain, firstQuest can carry detailed arc-seeding instructions — secrets to surface, location pins to establish, expected arc conclusions — running several hundred characters. Keep it vague when the start is open-ended; use it for detailed setup only when the first arc is authored and the guidance won’t conflict with the player’s character choices.
startingQuests
Array of quest name strings set to available status at game start, before any trigger fires. Use it when a story start has immediate objectives the player should see from turn one. Use [] (and quest-init triggers instead) when quests should be discovered gradually through play.
startingItems
Warning:
startingItemson story starts applies the same item to every player of that start regardless of their class, background, or any other character-creation choice. For combat gear, professional equipment, or anything that should vary by character build, put it on traits oritemSettings.startingItemsinstead. The legitimate use is small narrative hook items that belong to the story start itself — a letter of introduction, a sealed message, a key the player picks up in the opening scene — where universality is the point. If you find yourself listing weapons, armour, or class kit here, you want a trait.
questGenerationGuidance
Layers on top of storySettings.questGenerationGuidance. Use it when one story start has a distinctly different tone or quest cadence from the rest of the world. In practice, most worlds put all quest guidance into the global storySettings.questGenerationGuidance and leave this field empty.
Initialization order
When a player starts a game with a story start, the engine runs these steps in order:
-
Quest registration — all world quests created with status
hidden; quests instartingQuestsflipped toavailable; on turn 0 the AI also injectsfirstQuestas a quest generation instruction if set -
Location selection — pick from
locations(or random region/location if empty), then filterlocationAreas, then pick one area -
Party NPC setup — for each NPC key in
startingPartyNPCs: move to chosen starting location/area, add topartyState.partyMembers, setnpc.known = true -
Starting items — combined in priority order:
itemSettings.startingItems(global) + traitstartingItems(deduplicated) + story-startstartingItems+ skillstartingItems. Items auto-equip when valid slots are open. - Party state init:
partyState.currentLocation = location.name
partyState.currentLocationArea = chosen area
partyState.currentRegion = location.region
partyState.currentRealm = region.realm
partyState.currentCoordinates = [location.x, location.y]
partyState.day = 1
partyState.timeOfDay = ''
partyState.musicMood = 'peaceful'
-
Initial narrative —
generateInitialStartruns, usingstoryStart.storyStartas base, plus party NPCs, location/area details, character backgrounds, andnarratorStyle
Authoring tips
Three-part structure
Each story start should have a storyStart text with three distinct parts:
-
Narrator prologue (in
[ ]brackets) — factual world context the player always sees. Who the player character is, what the stakes of this start are, what the nearby NPCs’ names and roles are. Prevents the AI from inventing contradictory context. - Character backstory — 2–3 sentences of how this character got here. First person or second person, past tense.
- In-scene action — present tense, drops the player into an active moment. Something is happening right now.
Include a Session Opening section in aiInstructions
telling the AI to personalise the opening further using the player’s chosen Race/Background/Class/Alignment. Static storyStart text + dynamic AI personalisation = best of both approaches.
Opening variety (avoid identical runs)
The problem: Without explicit guidance, the AI tends to open every run of a story start with the same prominent NPC in the same starting area — same scene, same NPC, same tone regardless of which character archetype the player chose.
The fix is two parts:
Part 1: Add labelled hooks to storyStart text. At the end of the storyStart field, append a bracketed hooks block listing 4-5 different opening moments keyed to whatever trait categories define identity in your world — Class, Background, Profession, Origin, Faction, Era, etc. The AI picks the best match for the character that just rolled in.
D&D-style hooks example:
[Opening hooks - pick the one that best fits this character's Background, Class, and Alignment.]
• Criminal / Rogue: ...
• Scholar / Mage: ...
• Soldier / Fighter: ...
• Folk Hero / Healer: ...
• Default: ...
Modern slice-of-life hooks example:
[Opening hooks - pick the one that best fits this character's Profession and Background.]
• Journalist: ...
• Bartender: ...
• Teacher: ...
• Off-duty cop: ...
• Default: ...
The pattern — one hook per dominant trait, plus a default fallback — holds in any genre. Swap the categories for whatever your world uses.
Part 2: Update aiInstructions.generateInitialStart.Opening Structure
with an explicit variety rule. The wording below uses D&D-style categories; replace with your world’s trait names:
“Use the character’s specific combination of [Race, Background, Class, Alignment, or whatever your world’s trait categories are] to select the opening hook from the story start’s hook list. Two characters with different category picks starting from the same story start should open in entirely different moments. Do not default to the most prominent NPC at the location. The same player running the same story start twice should encounter a different opening scene.”
Both pieces are needed: the hooks in the data, and an explicit instruction to use them.
locationAreas must match defined areas
The problem: A story start’s locationAreas places the player inside a specific area of the starting location. If that area doesn’t exist (because the location has no areas defined, or you used a name that doesn’t match), the engine has no room to put the player — behaviour is undefined.
The problem also appears with NPC placement. If an NPC’s currentArea matches a story start’s locationAreas, that NPC always appears in the opening scene — every single run, same character. This makes the opening feel scripted and repetitive.
Rules:
locationAreasmust exactly match an area key defined in that location’sareasobject.- If the location has no
areas(e.g.complexityType: "simple"), leavelocationAreasempty or omit it. - Before wiring a story start, check which NPCs have
currentAreamatching the intended starting area. If a major NPC lives there, every run begins with them front and centre. This may be intentional (a companion, a briefing officer) or a mistake — know which. - For open or free-agent starts, pick a starting area that fits the character archetype, not just the most prominent location in the city. A street-level criminal should not open in the political chamber; a scout recruit should not open in the throne room.