-
Notifications
You must be signed in to change notification settings - Fork 0
Completion Guide Format
A completion guide is a plain JSON file describing a VN's routes, the choices along each one, and the endings they lead to — the kind of information a text walkthrough already contains, structured so the app can render it as a checkable tree instead of a wall of text.
Import one from a novel's row menu ("Import guide…") to attach it to that novel, or from the separate Guides page to keep a guide independent of any imported story. Either way, the file itself is never modified — every checkbox you tick is tracked by the app separately, keyed to the novel/entry, and is completely independent of any save slot.
The parser is deliberately permissive: only a top-level "routes" array is required, every other
field is optional, and unrecognized fields are simply ignored (so a richer, hand-maintained guide
degrades gracefully in older app versions, and vice versa). Two shapes of "prerequisiteEndings"
are both understood (see the field reference below) since real-world walkthrough data isn't
consistent about it.
{
"game": "Example Visionary Tale",
"source": "Written by hand as a schema example for this wiki page",
"rating": "All ages",
"generatedNote": "Not scraped from a real walkthrough -- purely illustrative",
"trueEndNote": "The Grand Ending requires every other ending first",
"recommendedOrderNote": "Play Aria's route before Bram's -- Bram's route assumes Aria's is done",
"saveSlots": [
{ "id": "001", "createdIn": "common route", "usedToStart": ["aria", "bram"], "created": false }
],
"routes": [
{
"id": "aria",
"name": "Aria's Route",
"category": "Main Routes",
"recommendedOrder": 1,
"prerequisiteRoutes": [],
"checkpoints": [
{
"afterEvent": "The rooftop conversation",
"choices": [
{ "num": 1, "text": "Stay and talk with Aria.", "passed": false },
{ "num": 2, "text": "Go back inside.", "passed": false, "saveHereFor": "aria_bad" },
{
"num": 3,
"text": "About the transfer student.",
"characterSelectChoice": true,
"branchesTo": "bram",
"note": "Auto-selected on a first playthrough; picking it manually shifts into Bram's route early.",
"passed": false
}
]
},
{
"afterEvent": "The festival",
"choices": [],
"unenumeratedChoices": 12,
"note": "A dozen minor flavor choices here, none of which affect the ending."
}
],
"endings": [
{
"id": "aria_good",
"name": "Aria - Good End",
"type": "good",
"obtainedBy": "Reached by choosing option 1 at the rooftop.",
"completed": false
},
{
"id": "aria_bad",
"name": "Aria - Bad End",
"type": "bad",
"pivotalChoice": {
"text": "Go back inside.",
"pick": true,
"note": "The choice that locks in the bad end."
},
"completed": false
}
]
},
{
"id": "bram",
"name": "Bram's Route",
"category": "Main Routes",
"recommendedOrder": 2,
"prerequisiteRoutes": ["aria"],
"prerequisiteEndings": { "requireOneOf": ["aria_good", "aria_bad"] },
"prerequisiteNote": "Unlocks after finishing Aria's route with either ending.",
"unlocksOnCompletion": ["grand_ending"],
"checkpoints": [
{
"choices": [
{ "text": "Confront Bram directly.", "passed": false },
{ "text": "Wait and see what happens.", "passed": false }
]
}
],
"endings": [
{
"id": "bram_good",
"name": "Bram - Good End",
"type": "good",
"pivotalChoiceSequence": [
{ "text": "Confront Bram directly.", "pick": true },
{ "text": "Forgive him.", "pick": true, "note": "The final, deciding line." }
],
"completed": false
}
]
},
{
"id": "grand_ending",
"name": "Grand Ending",
"category": "Bonus",
"recommendedOrder": 3,
"prerequisiteRoutes": ["aria", "bram"],
"prerequisiteEndings": ["aria_good", "bram_good"],
"accessedVia": "Unlocks on the title screen once every other ending is completed.",
"onlyOneEnding": true,
"onlyOneEndingNote": "Unlike the other routes, there's just this one ending here.",
"checkpoints": [],
"endings": [
{ "id": "grand_end", "name": "Grand Ending", "type": "true", "completed": false }
]
}
]
}Top level
| Field | Type | Notes |
|---|---|---|
routes |
array | Required. See Route below. |
game |
string | Shown as the guide dialog's title. |
saveSlots |
array | See Save slot below. Optional; a Never7-style walkthrough convention (numbered save slots as waypoints between routes), not needed for guides that don't use them. |
recommendedOrderNote |
string | Free text shown under the title. |
source, rating, generatedNote, trueEndNote
|
string | Joined into one "about this guide" line under the title. |
Route
| Field | Type | Notes |
|---|---|---|
id |
string | Stable identifier; also the prefix used to key this route's choices/endings for progress-tracking. Defaults to "route" + index if omitted. |
name |
string | Display name. Defaults to id. |
category |
string | Shown as a subtitle under the route name (e.g. "Near Side of the Moon"). |
recommendedOrder |
number | Routes are sorted by this ascending; routes without it keep their original array order, sorted after any that do have it. |
prerequisiteRoutes |
array of strings | Other routes' ids this one requires; shown as an info line. |
prerequisiteEndings |
array of strings or object | Either a flat array of ending ids (treated as "requires all of these"), or { "requireOneOf": [...], "requireAll": [...] } for a mix of the two. |
unlocksOnCompletion |
array of strings | Other routes' ids this one unlocks; shown as an info line. |
prerequisiteNote |
string | Free text shown as an info line verbatim. |
accessedVia |
string | How the route is reached (e.g. a main-menu option); shown as "Access via: …". |
onlyOneEnding |
boolean | If true, shows onlyOneEndingNote (or a generic fallback line) noting the route has just one ending. |
onlyOneEndingNote |
string | Custom text for the above. |
checkpoints |
array | See Checkpoint below. |
endings |
array | See Ending below. |
Checkpoint (an item inside a route's checkpoints array)
| Field | Type | Notes |
|---|---|---|
afterEvent |
string | Shown as a small sub-heading above this checkpoint's choices. If omitted and the route has more than one checkpoint, a synthesized "Checkpoint N" is used instead. |
choices |
array | See Choice below. |
unenumeratedChoices |
number | If > 0, shows an inert "+N more choices not itemized" line (for walkthroughs that don't enumerate every minor choice). |
note |
string | Free text; appended to the unenumerated-choices line, or shown alone if there isn't one. |
Choice (an item inside a checkpoint's choices array)
| Field | Type | Notes |
|---|---|---|
text |
string | The choice's own text, shown as the checkbox row's label. |
num |
number | If present, prefixes the label as "N. text" (matches how some walkthroughs number choices). |
passed |
boolean | Seeds this choice's checked state the first time the guide is imported for a given novel/entry — never overwrites progress you've already tracked on a re-import. |
characterSelectChoice |
boolean | Flags an auto-selected/first-playthrough-only choice; shown as a "Character-select choice" note. |
saveHereFor |
string | Notes which ending a save made at this point is for; shown as "Save here for: …". |
branchesTo |
string | Notes which other route this choice branches into; shown as "Branches to: …". |
note |
string | Free text, appended to the same secondary detail line as the above. |
Ending (an item inside a route's endings array)
| Field | Type | Notes |
|---|---|---|
id |
string | Stable identifier, used to key this ending's progress (prefixed with the route's own id). Defaults to routeId + "_ending" + index. |
name |
string | Display name. Defaults to id. |
type |
string | Shown in parentheses after the name (e.g. "(true)", "(good)", "(bad)"). |
completed |
boolean | Seeds this ending's checked state on first import, same rule as passed above. |
loadSave |
string | A save-slot id (see Save slot) this ending is reached from; shown as "Load save …". |
pivotalChoice |
object | A single { text, pick, note } step describing the deciding choice for this ending. Ignored if pivotalChoiceSequence is also present and non-empty. |
pivotalChoiceSequence |
array of the above | Multiple deciding steps in order, rendered joined by an arrow. |
obtainedBy |
string | Free-text alternative/supplement to the structured fields above. |
note |
string | Free text, appended after everything else. |
A pivotalChoice/pivotalChoiceSequence step's own fields: text (the choice's wording), pick
(boolean, default true — set to false to mean "pick the other option here"), and an optional
note.
Save slot (an item inside the top-level saveSlots array — optional, only meaningful for
walkthroughs that structure themselves around numbered save points)
| Field | Type | Notes |
|---|---|---|
id |
string | The slot's own label/number. Defaults to its array index. |
createdIn |
string | Which route this save was made in; shown in the row label. |
usedToStart |
array of strings | Which routes this save is used to start; shown in the row label. |
created |
boolean | Seeds this slot's checked state on first import, same rule as passed/completed above. |