Error codes

On this page

A diagnostic of gozen can carry a code: GZN and four digits at the end of the line, or the code field of the JSON output. The message may be reworded; the code does not change, so you can search for it, link to it, and branch on it.

The first digit is the exit value: GZN0xxx is a warning and the command still exits 0, GZN1xxx exits 1 (processing failed), and GZN2xxx exits 2 (the command line is invalid). With gozen check --strict or a growing --baseline budget, warnings instead fail with exit 1 while retaining their codes. The next two digits are the family, what you have to fix. Summary lines such as check: 3 errors carry no code; the diagnostics they count do.

Run gozen help GZN1101 to read an entry in the terminal.

Codes are assigned one family at a time. A diagnostic without a code still exits the same way and still says what is wrong.

CodesExitMeaningAssigned
GZN01xx0warnings of check: the game loads, but something is likely a mistake24 codes
GZN02xx0warnings of a measurement or a recordnot yet
GZN11xx1the definitions of the game: YAML, references, expressions, assets13 codes
GZN12xx1fonts and text layout1 codes
GZN13xx1a simulation could not run or reported a problemnot yet
GZN14xx1a trace of a play is broken or shows faults6 codes
GZN15xx1an output path: it exists, overlaps an input, or cannot be written2 codes
GZN16xx1taking screenshots with the game binarynot yet
GZN17xx1building a release or a trial tree4 codes
GZN18xx1picture and asset tools: catalogs, models, ONNX Runtime, picturesnot yet
GZN19xx1reading an input or writing the outputnot yet
GZN21xx2the shape of the command line: commands, operands, options6 codes
GZN22xx2the value of an option2 codes
GZN23xx2options that do not go together, or need each other3 codes
GZN24xx2a path or a name the command line gives2 codes
GZN25xx2gozen help1 codes

GZN01xx #

Warnings of check: the game loads, but something is likely a mistake. Exits 0.

GZN0101 #

A text does not fit the message window.

The layout check lays out every line of dialogue and every choice with the game’s font and display rules. This one needs more lines than the window shows, so the player would see it cut or paged where the author did not plan it.

Fix: Shorten the text, split it into two lines of dialogue, or change the window in game.yaml.

Reproduction: create these files in an empty game directory, then run gozen check GAME. Decode any base64 block into the named binary file first. Other diagnostics may also be reported.

File: game.yaml

schema_version: 2
id: g
start: {location: camp, party: [scout]}

File: data/world.yaml

classes: {walker: {stats: {mhp: 9, mmp: 0, atk: 1, def: 1, mat: 1, mdf: 1, agi: 1, luk: 1}, exp_for: level * 9}}
actors: {scout: {class: walker}}
skills: {attack: {}, guard: {}}
locations: {camp: {}}
events: {e: {do: [{say: 'aaaa bbbb cccc dddd eeee ffff gggg hhhh iiii jjjj kkkk llll mmmm nnnn oooo pppp qqqq rrrr ssss tttt uuuu vvvv wwww xxxx yyyy zzzz aaaa bbbb cccc dddd eeee ffff gggg hhhh iiii jjjj kkkk llll mmmm nnnn oooo pppp qqqq rrrr ssss tttt uuuu vvvv wwww xxxx yyyy zzzz aaaa bbbb cccc dddd eeee ffff gggg hhhh iiii jjjj kkkk llll mmmm nnnn oooo pppp qqqq rrrr ssss tttt uuuu vvvv wwww xxxx yyyy zzzz aaaa bbbb cccc dddd eeee ffff gggg hhhh iiii jjjj kkkk llll mmmm nnnn oooo pppp qqqq rrrr ssss tttt uuuu vvvv wwww xxxx yyyy zzzz aaaa bbbb cccc dddd'}]}}

GZN0102 #

A balloon face has no face box, or the box is stale.

A painted scene cuts each person’s balloon face around the face that gozen faces found and wrote to assets/faces.json. The file is missing, has no box for a picture, has none found, or the picture changed since, so the face is guessed.

Fix: Run gozen faces again, or give the doll face_at.

Reproduction: create these files in an empty game directory, then run gozen check GAME. Decode any base64 block into the named binary file first. Other diagnostics may also be reported.

File: game.yaml

schema_version: 3
id: g
start: {location: camp, party: [scout]}

File: data/world.yaml

classes: {walker: {stats: {mhp: 9, mmp: 0, atk: 1, def: 1, mat: 1, mdf: 1, agi: 1, luk: 1}, exp_for: level * 9}}
actors: {scout: {class: walker}}
skills: {attack: {}, guard: {}}
locations:
  camp:
    background: bg.png
    stage:
      scale: [{at: [50, 90], height: 40}, {at: [50, 10], height: 10}]
      walk: [[[0, 0], [100, 0], [100, 100], [0, 100]]]
      spots: {gate: {at: [50, 50]}}
      people: [{id: guard, at: [20, 20]}]
    people: [{id: guard, name: Guard, image: guard.png, bubbles: [Hello]}]

File: assets/bg.png

iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAIAAABMXPacAAAA+UlEQVR4nO3RQQ0AIAzAwElHClKQhow9ekkFNLk592mxWT+IBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtPqk7BwnBg7bkAAAAAElFTkSuQmCC

File: assets/guard.png

iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAIAAABMXPacAAAA+UlEQVR4nO3RQQ0AIAzAwElHClKQhow9ekkFNLk592mxWT+IBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtPqk7BwnBg7bkAAAAAElFTkSuQmCC

GZN0103 #

A place of a map or a painted scene cannot be reached.

A point no road leads to, a point without a way back, an exit or a thing that does not touch the walkable area, or a spot without do (which is no entry) cannot be used by the player.

Fix: Connect it (a road, an exit back, walk that touches it) or remove it; give a spot a do to make it an entry.

Reproduction: create these files in an empty game directory, then run gozen check GAME. Decode any base64 block into the named binary file first. Other diagnostics may also be reported.

File: game.yaml

schema_version: 3
id: g
start: {location: camp, party: [scout]}

File: data/world.yaml

classes: {walker: {stats: {mhp: 9, mmp: 0, atk: 1, def: 1, mat: 1, mdf: 1, agi: 1, luk: 1}, exp_for: level * 9}}
actors: {scout: {class: walker}}
skills: {attack: {}, guard: {}}
locations:
  camp:
    background: bg.png
    stage:
      scale: [{at: [50, 90], height: 40}, {at: [50, 10], height: 10}]
      walk: [[[0, 0], [100, 0], [100, 100], [0, 100]]]
      spots: {gate: {at: [50, 50]}, corner: {at: [60, 60], name: Corner}}

File: assets/bg.png

iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAIAAABMXPacAAAA+UlEQVR4nO3RQQ0AIAzAwElHClKQhow9ekkFNLk592mxWT+IBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtPqk7BwnBg7bkAAAAAElFTkSuQmCC

GZN0104 #

A picture or a shape will be drawn otherwise than written.

A polygon that crosses itself, a person without an image (its doll takes plain colors), or an icon that is not square (it is cut round from its middle) is drawn, but probably not as meant.

Fix: Fix the polygon’s points, give the person an image, or make the icon square.

Reproduction: create these files in an empty game directory, then run gozen check GAME. Decode any base64 block into the named binary file first. Other diagnostics may also be reported.

File: game.yaml

schema_version: 3
id: g
start: {location: camp, party: [scout]}

File: data/world.yaml

classes: {walker: {stats: {mhp: 9, mmp: 0, atk: 1, def: 1, mat: 1, mdf: 1, agi: 1, luk: 1}, exp_for: level * 9}}
actors: {scout: {class: walker}}
skills: {attack: {}, guard: {}}
locations:
  camp:
    background: bg.png
    stage:
      scale: [{at: [50, 90], height: 40}, {at: [50, 10], height: 10}]
      walk: [[[0, 0], [100, 0], [0, 100], [100, 100]]]
      spots: {gate: {at: [50, 20]}}

File: assets/bg.png

iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAIAAABMXPacAAAA+UlEQVR4nO3RQQ0AIAzAwElHClKQhow9ekkFNLk592mxWT+IBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtPqk7BwnBg7bkAAAAAElFTkSuQmCC

GZN0105 #

The game’s language and its words or font do not match.

language is not set while the game is written in Japanese, so the engine’s own words are English; or the regular font lacks letters of the chosen words, which would show as blanks.

Fix: Set language in game.yaml, or choose a font that has the letters.

Reproduction: create these files in an empty game directory, then run gozen check GAME. Decode any base64 block into the named binary file first. Other diagnostics may also be reported.

File: game.yaml

schema_version: 2
id: g
title: "\u65C5\u306E\u5BBF"
start:
  location: camp
  party:
  - scout

File: data/world.yaml

classes: {walker: {stats: {mhp: 9, mmp: 0, atk: 1, def: 1, mat: 1, mdf: 1, agi: 1, luk: 1}, exp_for: level * 9}}
actors: {scout: {class: walker}}
skills: {attack: {}, guard: {}}
locations: {camp: {}}

GZN0106 #

A part of an AI rule’s target is not used.

For some actions the target of a rule only decides whether the rule fires: a random enemy is drawn anew, a self skill always hits its user, and by is read only with pick min or max.

Fix: Remove the part the message names, or use a skill whose target the rule chooses.

Reproduction: create these files in an empty game directory, then run gozen check GAME. Decode any base64 block into the named binary file first. Other diagnostics may also be reported.

File: game.yaml

schema_version: 2
id: g
start: {location: camp, party: [scout]}

File: data/world.yaml

classes: {walker: {stats: {mhp: 9, mmp: 0, atk: 1, def: 1, mat: 1, mdf: 1, agi: 1, luk: 1}, exp_for: level * 9}}
actors: {scout: {class: walker}}
skills: {attack: {}, guard: {}, boost: {scope: self}}
locations: {camp: {}}
enemies: {slime: {image: s.png, stats: {mhp: 9, mmp: 0, atk: 1, def: 1, mat: 1, mdf: 1, agi: 1, luk: 1}, ai: [{use: boost, target: {pick: min, by: t.hp}}]}}

File: assets/s.png

iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAIAAABMXPacAAAA+UlEQVR4nO3RQQ0AIAzAwElHClKQhow9ekkFNLk592mxWT+IBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtPqk7BwnBg7bkAAAAAElFTkSuQmCC

GZN0107 #

A set reads another target of the same set.

The targets of one set are assigned one after another in key order, so a right-hand side that reads another target of the same set depends on that order.

Fix: Split it into two set commands in the order you mean.

Reproduction: create these files in an empty game directory, then run gozen check GAME. Decode any base64 block into the named binary file first. Other diagnostics may also be reported.

File: game.yaml

schema_version: 2
id: g
start: {location: camp, party: [scout]}

File: data/world.yaml

classes: {walker: {stats: {mhp: 9, mmp: 0, atk: 1, def: 1, mat: 1, mdf: 1, agi: 1, luk: 1}, exp_for: level * 9}}
actors: {scout: {class: walker}}
skills: {attack: {}, guard: {}}
locations: {camp: {actions: [{label: Go, do: [{set: {var.a: 1, var.b: var.a + 1}}]}]}}

GZN0108 #

A set changes an actor’s stats or level outside the development mode.

Setting a party member’s stats or level is for the development mode (–dev) and tests. The game skips it when played normally.

Fix: Use a command the game keeps (an item, a class change, experience), or keep it in a development-only event.

Reproduction: create these files in an empty game directory, then run gozen check GAME. Decode any base64 block into the named binary file first. Other diagnostics may also be reported.

File: game.yaml

schema_version: 2
id: g
start: {location: camp, party: [scout]}

File: data/world.yaml

classes: {walker: {stats: {mhp: 9, mmp: 0, atk: 1, def: 1, mat: 1, mdf: 1, agi: 1, luk: 1}, exp_for: level * 9}}
actors: {scout: {class: walker}}
skills: {attack: {}, guard: {}}
locations: {camp: {actions: [{label: Train, do: [{set: {actor.scout.level: 5}}]}]}}

GZN0109 #

Lines of a voiced actor have no voice.

An actor with a voices folder has lines without say.voice. They are shown without a voice; the warning counts them so the recording can be finished.

Fix: Record the lines it names and add voice to each, or leave them silent on purpose.

Reproduction: create these files in an empty game directory, then run gozen check GAME. Decode any base64 block into the named binary file first. Other diagnostics may also be reported.

File: game.yaml

schema_version: 4
id: voiced
start: {location: room, party: [reader]}

File: assets/reader/voice/hello.wav

a stub

File: data/world.yaml

classes: {walker: {stats: {mhp: 9, mmp: 0, atk: 1, def: 1, mat: 1, mdf: 1, agi: 1, luk: 1}, exp_for: level * 9}}
actors: {reader: {class: walker, voices: reader/voice}}
skills: {attack: {}, guard: {}}
locations: {room: {}}
events:
  scene:
    do:
      - say: {who: reader, voice: hello, text: Hello.}
      - say: {who: reader, text: Goodbye.}

GZN0110 #

A translation is of a text the game does not have.

A key of lang/.yaml is neither a text of the game (a line, a choice, a name) nor a word of the engine. The text was changed or removed after it was translated.

Fix: Change the key to the text as it is written now, or remove the entry.

Reproduction: create these files in an empty game directory, then run gozen check GAME. Decode any base64 block into the named binary file first. Other diagnostics may also be reported.

File: game.yaml

schema_version: 4
id: twolang
start: {location: room, party: [reader]}
written_in: en
languages: [en, ja]

File: data/world.yaml

classes: {walker: {stats: {mhp: 9, mmp: 0, atk: 1, def: 1, mat: 1, mdf: 1, agi: 1, luk: 1}, exp_for: level * 9}}
actors: {reader: {class: walker}}
skills: {attack: {}, guard: {}}
locations: {room: {name: Room}}
events:
  scene:
    do:
      - say: Hi.
      - choice: [{label: Stay}]

File: lang/ja.yaml

text:
  Hi.: "\u3053\u3093\u306B\u3061\u306F\u3002"
  Room: "\u90E8\u5C4B"
  Gone line: "\u6D88\u3048\u305F\u53F0\u8A5E"

GZN0111 #

A text of the game is not translated yet.

A language of game.yaml’s languages has no translation of this text in lang/.yaml, so the text is shown as written.

Fix: Add the text as a key of lang/.yaml with its translation; gozen check –format json lists every one with its path.

Reproduction: create these files in an empty game directory, then run gozen check GAME. Decode any base64 block into the named binary file first. Other diagnostics may also be reported.

File: game.yaml

schema_version: 4
id: twolang
start: {location: room, party: [reader]}
written_in: en
languages: [en, ja]

File: data/world.yaml

classes: {walker: {stats: {mhp: 9, mmp: 0, atk: 1, def: 1, mat: 1, mdf: 1, agi: 1, luk: 1}, exp_for: level * 9}}
actors: {reader: {class: walker}}
skills: {attack: {}, guard: {}}
locations: {room: {name: Room}}
events:
  scene:
    do:
      - say: Hi.
      - choice: [{label: Stay}]

File: lang/ja.yaml

text:
  Hi.: "\u3053\u3093\u306B\u3061\u306F\u3002"
  Room: "\u90E8\u5C4B"
  Gone line: "\u6D88\u3048\u305F\u53F0\u8A5E"

GZN0112 #

A flag is set but nothing reads it.

A set writes flag., and no condition, expression or line of the game reads it. It may be a typo of another flag, or left over.

Fix: Read the flag where it should matter, fix its name, or remove the set.

Reproduction: create these files in an empty game directory, then run gozen check GAME. Decode any base64 block into the named binary file first. Other diagnostics may also be reported.

File: game.yaml

schema_version: 4
id: flags
start: {location: room, party: [reader]}

File: data/world.yaml

classes: {walker: {stats: {mhp: 9, mmp: 0, atk: 1, def: 1, mat: 1, mdf: 1, agi: 1, luk: 1}, exp_for: level * 9}}
actors: {reader: {class: walker}}
skills: {attack: {}, guard: {}}
locations: {room: {name: Room}}
events:
  talk:
    do:
      - set: {flag.met: true}
      - if: flag.trusted
        then: [{say: Welcome back.}]
      - call: farewell
  farewell:
    trigger: enter
    location: room
    do: [{say: Goodbye.}, {move: room}]

GZN0113 #

A flag is read but nothing sets it.

A condition or expression reads flag., and no set, gallery scene or state.names declaration gives it a value, so it stays false (unless a test starts with –flags or the game’s Go code sets it).

Fix: Set the flag where it should become true, fix its name, or declare it in state.names.

Reproduction: create these files in an empty game directory, then run gozen check GAME. Decode any base64 block into the named binary file first. Other diagnostics may also be reported.

File: game.yaml

schema_version: 4
id: flags
start: {location: room, party: [reader]}

File: data/world.yaml

classes: {walker: {stats: {mhp: 9, mmp: 0, atk: 1, def: 1, mat: 1, mdf: 1, agi: 1, luk: 1}, exp_for: level * 9}}
actors: {reader: {class: walker}}
skills: {attack: {}, guard: {}}
locations: {room: {name: Room}}
events:
  talk:
    do:
      - set: {flag.met: true}
      - if: flag.trusted
        then: [{say: Welcome back.}]
      - call: farewell
  farewell:
    trigger: enter
    location: room
    do: [{say: Goodbye.}, {move: room}]

GZN0114 #

An expression uses a function’s name as a value.

A built-in function (floor, max, len and the others) or a function of the game (rand, chance, pages) is written alone, not called, as in floor + 1. The expression fails when it is evaluated. floor is the floor’s number only in generate’s size, the count of generate.place and a roamer’s count, appear, wait and every; elsewhere it is the function and the floor’s number is var.floor.

Fix: Call the function (floor(x)), or use the value you meant (var.floor).

Reproduction: create these files in an empty game directory, then run gozen check GAME. Decode any base64 block into the named binary file first. Other diagnostics may also be reported.

File: game.yaml

schema_version: 4
id: fnvalue
start: {location: room, party: [reader]}

File: data/world.yaml

classes: {walker: {stats: {mhp: 9, mmp: 0, atk: 1, def: 1, mat: 1, mdf: 1, agi: 1, luk: 1}, exp_for: level * 9}}
actors: {reader: {class: walker}}
skills: {attack: {}, guard: {}}
locations: {room: {name: Room}}
events:
  pay:
    trigger: enter
    location: room
    do: [{gold: floor + 1}]

GZN0115 #

An encountered enemy has no bestiary lore.

The monster book is enabled and a troop can include this enemy, but its lore field is empty.

Fix: Add a short lore description to the enemy, or turn off ui.bestiary.

Reproduction: create these files in an empty game directory, then run gozen check GAME. Decode any base64 block into the named binary file first. Other diagnostics may also be reported.

File: game.yaml

schema_version: 4
id: bestiary
start: {location: room, party: [reader]}
ui: {bestiary: true}

File: assets/mote.png

iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAIAAABMXPacAAAA+UlEQVR4nO3RQQ0AIAzAwElHClKQhow9ekkFNLk592mxWT+IBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtPqk7BwnBg7bkAAAAAElFTkSuQmCC

File: data/world.yaml

classes: {walker: {stats: {mhp: 9, mmp: 0, atk: 1, def: 1, mat: 1, mdf: 1, agi: 1, luk: 1}, exp_for: level * 9}}
actors: {reader: {class: walker}}
skills: {attack: {}, guard: {}}
enemies: {mote: {name: Mote, image: mote.png, stats: {mhp: 9, mmp: 0, atk: 1, def: 1, mat: 1, mdf: 1, agi: 1, luk: 1}}}
troops: {lesson: {members: [mote]}}
locations: {room: {name: Room, encounters: {troops: [{troop: lesson}]}}}

GZN0116 #

A monster cannot be captured or bred from capturable monsters.

The breeding graph has no path from a monster with a positive recruit chance to this species, including the male and female sexes needed at each step. A species whose only recipes loop back through species that cannot be obtained has no lineage and is reported too.

Fix: Make it recruitable or add a breeding recipe reachable from capturable parents.

Reproduction: create these files in an empty game directory, then run gozen check GAME. Decode any base64 block into the named binary file first. Other diagnostics may also be reported.

File: game.yaml

schema_version: 6
id: g
start: {location: camp, party: [scout]}

File: data/world.yaml

monster_families: {slime: Slime}
classes: {walker: {stats: {mhp: 9, mmp: 0, atk: 1, def: 1, mat: 1, mdf: 1, agi: 1, luk: 1}, exp_for: level * 9}}
actors: {scout: {class: walker}}
skills: {attack: {}, guard: {}}
locations: {camp: {}}
enemies: {mote: {name: Mote, image: x.png, family: slime, rank: 1, monster_class: walker, recruit: {chance: 1}, stats: {mhp: 9, mmp: 0, atk: 1, def: 1, mat: 1, mdf: 1, agi: 1, luk: 1}}, wisp: {name: Wisp, image: x.png, family: slime, rank: 2, monster_class: walker, stats: {mhp: 9, mmp: 0, atk: 1, def: 1, mat: 1, mdf: 1, agi: 1, luk: 1}}}

File: assets/x.png

iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAIAAABMXPacAAAA+UlEQVR4nO3RQQ0AIAzAwElHClKQhow9ekkFNLk592mxWT+IBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtPqk7BwnBg7bkAAAAAElFTkSuQmCC

GZN0117 #

A recruitable monster has no encounter in a location.

A positive recruit chance only matters after winning a battle with that species. No location encounter names a troop containing it. A scripted battle may still offer it, so this is a warning.

Fix: Add the species to a troop in a reachable location encounter, or confirm that a scripted battle is intentional.

Reproduction: create these files in an empty game directory, then run gozen check GAME. Decode any base64 block into the named binary file first. Other diagnostics may also be reported.

File: game.yaml

schema_version: 6
id: g
start: {location: camp, party: [scout]}

File: data/world.yaml

monster_families: {slime: Slime}
classes: {walker: {stats: {mhp: 9, mmp: 0, atk: 1, def: 1, mat: 1, mdf: 1, agi: 1, luk: 1}, exp_for: level * 9}}
actors: {scout: {class: walker}}
skills: {attack: {}, guard: {}}
locations: {camp: {}}
enemies: {mote: {name: Mote, image: x.png, family: slime, rank: 1, monster_class: walker, recruit: {chance: 1}, stats: {mhp: 9, mmp: 0, atk: 1, def: 1, mat: 1, mdf: 1, agi: 1, luk: 1}}, wisp: {name: Wisp, image: x.png, family: slime, rank: 2, monster_class: walker, stats: {mhp: 9, mmp: 0, atk: 1, def: 1, mat: 1, mdf: 1, agi: 1, luk: 1}}}

File: assets/x.png

iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAIAAABMXPacAAAA+UlEQVR4nO3RQQ0AIAzAwElHClKQhow9ekkFNLk592mxWT+IBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtPqk7BwnBg7bkAAAAAElFTkSuQmCC

GZN0118 #

A stream episode lasts less than 10 minutes.

The beats of the episode, timed by the timing of the streams file, add up to less than 10 minutes, so a viewer sees it end soon after opening the game.

Fix: Add beats to the episode, or lengthen the timing.

Reproduction: create these files in an empty game directory, then run gozen check GAME. Decode any base64 block into the named binary file first. Other diagnostics may also be reported.

File: game.yaml

schema_version: 9
id: g
start: {location: room}
streams: data/streams.yaml

File: data/world.yaml

actors: {host: {name: Host, puppet: p/rig.yaml}}
locations: {room: {}}

File: data/streams.yaml

timing: {say: 2, per_char: 0.1, chat: 2, ask: 10}
tips: [10]
crowd: {names: [leaf], lines: [Hi], tip_lines: [Here], rate: 0.5}
channels: [{id: host, actor: host, room: x.png, frame: {cx: 1, top: 0, bottom: 1}, episodes: [streams/one.yaml]}]

File: streams/one.yaml

title: Short
lobby: [Short]
parts: [[{say: Hello.}]]

File: assets/p/rig.yaml

base: base.png
face: normal
faces: {normal: {}}

File: assets/p/base.png

iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAIAAABMXPacAAAA+UlEQVR4nO3RQQ0AIAzAwElHClKQhow9ekkFNLk592mxWT+IBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtPqk7BwnBg7bkAAAAAElFTkSuQmCC

File: assets/x.png

iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAIAAABMXPacAAAA+UlEQVR4nO3RQQ0AIAzAwElHClKQhow9ekkFNLk592mxWT+IBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtPqk7BwnBg7bkAAAAAElFTkSuQmCC

GZN0119 #

A stream voice is missing its folder or matches no line.

The voices folder of the streams file does not exist, holds something other than a folder for each channel, or holds a file that is not the recorded voice of a line the channel says: its name is not the voice key of one of the channel’s lines (in any language the game offers) followed by .ogg, usually because the line changed after the voice was recorded. A line without its voice is still read by speech synthesis in a browser and captioned elsewhere.

Fix: Record the voices again for the lines as they are now and remove the old files, or correct voices in the streams file.

Reproduction: create these files in an empty game directory, then run gozen check GAME. Decode any base64 block into the named binary file first. Other diagnostics may also be reported.

File: game.yaml

schema_version: 9
id: g
start: {location: room}
streams: data/streams.yaml

File: data/world.yaml

actors: {host: {name: Host, puppet: p/rig.yaml}}
locations: {room: {}}

File: data/streams.yaml

voices: voice
timing: {say: 2, per_char: 0.1, chat: 2, ask: 10}
tips: [10]
crowd: {names: [leaf], lines: [Hi], tip_lines: [Here], rate: 0.5}
channels: [{id: host, actor: host, room: x.png, frame: {cx: 1, top: 0, bottom: 1}, episodes: [streams/one.yaml]}]

File: streams/one.yaml

title: Short
lobby: [Short]
parts: [[{say: Hello.}]]

File: assets/p/rig.yaml

base: base.png
face: normal
faces: {normal: {}}

File: assets/p/base.png

iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAIAAABMXPacAAAA+UlEQVR4nO3RQQ0AIAzAwElHClKQhow9ekkFNLk592mxWT+IBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtPqk7BwnBg7bkAAAAAElFTkSuQmCC

File: assets/x.png

iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAIAAABMXPacAAAA+UlEQVR4nO3RQQ0AIAzAwElHClKQhow9ekkFNLk592mxWT+IBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtPqk7BwnBg7bkAAAAAElFTkSuQmCC

File: assets/voice/host/0000000000000000.ogg

x

GZN0120 #

A stream voice is not Ogg Vorbis.

A recorded voice of a line is not an Ogg Vorbis file: Ogg Opus (what many recorders and speech engines write), a WAV or another file named .ogg. gozen cannot play it, so the line is read by speech synthesis in a browser and only captioned elsewhere.

Fix: Convert the voice to Ogg Vorbis (for example: ffmpeg -i in.ogg -c:a libvorbis -q:a 4 out.ogg).

Reproduction: create these files in an empty game directory, then run gozen check GAME. Decode any base64 block into the named binary file first. Other diagnostics may also be reported.

File: game.yaml

schema_version: 9
id: g
start: {location: room}
streams: data/streams.yaml

File: data/world.yaml

actors: {host: {name: Host, puppet: p/rig.yaml}}
locations: {room: {}}

File: data/streams.yaml

voices: voice
timing: {say: 2, per_char: 0.1, chat: 2, ask: 10}
tips: [10]
crowd: {names: [leaf], lines: [Hi], tip_lines: [Here], rate: 0.5}
channels: [{id: host, actor: host, room: x.png, frame: {cx: 1, top: 0, bottom: 1}, episodes: [streams/one.yaml]}]

File: streams/one.yaml

title: Short
lobby: [Short]
parts: [[{say: Hello.}]]

File: assets/p/rig.yaml

base: base.png
face: normal
faces: {normal: {}}

File: assets/p/base.png

iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAIAAABMXPacAAAA+UlEQVR4nO3RQQ0AIAzAwElHClKQhow9ekkFNLk592mxWT+IBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtPqk7BwnBg7bkAAAAAElFTkSuQmCC

File: assets/x.png

iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAIAAABMXPacAAAA+UlEQVR4nO3RQQ0AIAzAwElHClKQhow9ekkFNLk592mxWT+IBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtPqk7BwnBg7bkAAAAAElFTkSuQmCC

File: assets/voice/host/9b56d519ccd9e1e5.ogg

RIFF....WAVEfmt

GZN0121 #

The picture of a browser export’s link card is small.

The picture of game.yaml’s web.image is smaller than 1200x630 pixels, the size the sites a link is shared on (X, Slack, Facebook) show a large card with; they show it blurred, small or not at all.

Fix: Use a picture of 1200x630 or more (1280x720 suits a 16:9 game).

Reproduction: create these files in an empty game directory, then run gozen check GAME. Decode any base64 block into the named binary file first. Other diagnostics may also be reported.

File: game.yaml

schema_version: 9
id: g
start: {location: room}
web: {url: 'https://example.org/g/', image: card.png}

File: data/world.yaml

locations: {room: {}}

File: assets/card.png

iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAIAAABMXPacAAAA+UlEQVR4nO3RQQ0AIAzAwElHClKQhow9ekkFNLk592mxWT+IBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtPqk7BwnBg7bkAAAAAElFTkSuQmCC

GZN0122 #

Authored YAML is complex or repetitive.

Source metrics exceed an authoring budget; these heuristics do not change game behavior.

Fix: Extract shared behavior or review the budgets in check-complexity.yaml; see docs/development/yaml-complexity.md.

Reproduction: create these files in an empty game directory, then run gozen check GAME. Decode any base64 block into the named binary file first. Other diagnostics may also be reported.

File: game.yaml

schema_version: 11
id: complexity
start: {location: room}

File: data/world.yaml

locations: {room: {}}

File: check-complexity.yaml

file_lines: 1

GZN0123 #

Dialogue differs from the speaker’s declared language style.

An opt-in speech rule found an explicitly discouraged form in a literal line.

Fix: Review the line or the actor’s speech rules; quoted dialogue may be intentional.

Reproduction: create these files in an empty game directory, then run gozen check GAME. Decode any base64 block into the named binary file first. Other diagnostics may also be reported.

File: game.yaml

schema_version: 10
id: g
language: en
start: {location: room}

File: data/world.yaml

locations: {room: {name: Room}}
actors: {potter: {name: Potter, speech: {en: {first_person: {preferred: I, avoid: [we]}}}}}
events: {hello: {do: [{say: {who: potter, text: 'we agree'}}]}}

GZN0124 #

A definition has no YAML consumer.

An event, authored screen (including an ensemble), location, item, troop, shop or AI set has no incoming reference in the loaded YAML. Start points, triggered events, calls, screen navigation, flows and literal expression references count as consumers. Dynamic lookups retain their entire definition kind. This is not a proof of unreachable content; external scripts may use a definition.

Fix: Connect the definition to its intended consumer, remove it if obsolete, or record an intentional external-script entry in a reviewed check baseline.

Reproduction: create these files in an empty game directory, then run gozen check GAME. Decode any base64 block into the named binary file first. Other diagnostics may also be reported.

File: game.yaml

schema_version: 11
id: unused
start: {location: camp, event: intro}

File: data/world.yaml

locations: {camp: {}}
events: {intro: [{say: Hello}], leftover: [{say: Unused}]}

GZN11xx #

The definitions of the game: YAML, references, expressions, assets. Exits 1.

GZN1101 #

A definition names something that is not defined.

A troop, item, actor, skill, location, event, song, picture set, state, stat, node or another named thing is referred to but not defined, or the thing has no part of that name (a point of a map, a mood of a song, a face of a puppet).

Fix: Fix the spelling or define the thing. gozen book lists every ID of the game.

Reproduction: create these files in an empty game directory, then run gozen check GAME. Decode any base64 block into the named binary file first. Other diagnostics may also be reported.

File: game.yaml

schema_version: 2
id: g
start: {location: camp, party: [scout]}

File: data/world.yaml

classes: {walker: {stats: {mhp: 9, mmp: 0, atk: 1, def: 1, mat: 1, mdf: 1, agi: 1, luk: 1}, exp_for: level * 9}}
actors: {scout: {class: walker}}
skills: {attack: {}, guard: {}}
locations: {camp: {}}
events: {bad: {do: [{battle: wolves}]}}

GZN1102 #

Something is defined twice.

The same ID or key appears twice, in one file or across the files of data/. The message names the previous definition.

Fix: Rename or remove one of them.

Reproduction: create these files in an empty game directory, then run gozen check GAME. Decode any base64 block into the named binary file first. Other diagnostics may also be reported.

File: game.yaml

schema_version: 2
id: g
start: {location: camp, party: [scout]}

File: data/world.yaml

classes: {walker: {stats: {mhp: 9, mmp: 0, atk: 1, def: 1, mat: 1, mdf: 1, agi: 1, luk: 1}, exp_for: level * 9}}
actors: {scout: {class: walker}}
skills: {attack: {}, guard: {}}
locations: {camp: {}}

File: data/more.yaml

locations: {camp: {}}

GZN1103 #

An expression cannot be read or uses a name unknown there.

An expression (when, a formula, a condition) has a syntax error, uses a name that does not exist where it is written (turn exists only in battle, a and b only in an effect), or mixes types.

Fix: Fix the expression; the message lists the names known at that place.

Reproduction: create these files in an empty game directory, then run gozen check GAME. Decode any base64 block into the named binary file first. Other diagnostics may also be reported.

File: game.yaml

schema_version: 2
id: g
start: {location: camp, party: [scout]}

File: data/world.yaml

classes: {walker: {stats: {mhp: 9, mmp: 0, atk: 1, def: 1, mat: 1, mdf: 1, agi: 1, luk: 1}, exp_for: level * 9}}
actors: {scout: {class: walker}}
skills: {attack: {}, guard: {}}
locations: {camp: {actions: [{label: Go, when: nope > 1, do: []}]}}

GZN1104 #

A definition is missing a part, or has parts that do not go together.

A key that is required is missing or empty, two keys exclude each other, a key is used where it means nothing, or a value has the wrong YAML type (a list where a map belongs, text where a number belongs).

Fix: Write the definition in the shape the Schema page shows for it.

Reproduction: create these files in an empty game directory, then run gozen check GAME. Decode any base64 block into the named binary file first. Other diagnostics may also be reported.

File: game.yaml

schema_version: 2
id: g
start: {location: camp, party: [scout]}

File: data/world.yaml

classes: {walker: {stats: {mhp: 9, mmp: 0, atk: 1, def: 1, mat: 1, mdf: 1, agi: 1, luk: 1}, exp_for: level * 9}}
actors: {scout: {class: walker}}
skills: {attack: {}, guard: {}}
locations: {camp: {exits: [{label: Out}]}}

GZN1105 #

An asset file does not exist.

A picture, a sound, a face, a font or another file named by the definitions is not under assets/. Names are relative to assets/ and case-sensitive.

Fix: Add the file, or fix the name.

Reproduction: create these files in an empty game directory, then run gozen check GAME. Decode any base64 block into the named binary file first. Other diagnostics may also be reported.

File: game.yaml

schema_version: 2
id: g
start: {location: camp, party: [scout]}

File: data/world.yaml

classes: {walker: {stats: {mhp: 9, mmp: 0, atk: 1, def: 1, mat: 1, mdf: 1, agi: 1, luk: 1}, exp_for: level * 9}}
actors: {scout: {class: walker}}
skills: {attack: {}, guard: {}}
locations: {camp: {}}
events: {e: {do: [{image: absent.png}]}}

GZN1106 #

A number is out of its range.

The value is a number, but outside what the key accepts: a rate between 0 and 1, a count of 1 or more, a size above 0, a level within the class’s maximum.

Fix: Use a number in the range the message states.

Reproduction: create these files in an empty game directory, then run gozen check GAME. Decode any base64 block into the named binary file first. Other diagnostics may also be reported.

File: game.yaml

schema_version: 3
id: g
start: {location: camp, party: [scout]}
ui: {balloon: 5}

File: data/world.yaml

classes: {walker: {stats: {mhp: 9, mmp: 0, atk: 1, def: 1, mat: 1, mdf: 1, agi: 1, luk: 1}, exp_for: level * 9}}
actors: {scout: {class: walker}}
skills: {attack: {}, guard: {}}
locations: {camp: {}}

GZN1107 #

A value is not one of the words the key accepts.

The key takes one word from a fixed list, such as a direction, a mode or a screen name. The message lists the words.

Fix: Use one of the listed words.

Reproduction: create these files in an empty game directory, then run gozen check GAME. Decode any base64 block into the named binary file first. Other diagnostics may also be reported.

File: game.yaml

schema_version: 2
id: g
start: {location: camp, party: [scout]}

File: data/world.yaml

classes: {walker: {stats: {mhp: 9, mmp: 0, atk: 1, def: 1, mat: 1, mdf: 1, agi: 1, luk: 1}, exp_for: level * 9}}
actors: {scout: {class: walker}}
skills: {attack: {}, guard: {}}
locations: {camp: {}}
events: {e: {trigger: sometimes, do: []}}

GZN1108 #

A word needs a newer schema_version.

The word was added in a later version of the YAML schema, and game.yaml declares an earlier schema_version, so an older engine would not read the game the same way.

Fix: Raise schema_version in game.yaml to the version the message names.

Reproduction: create these files in an empty game directory, then run gozen check GAME. Decode any base64 block into the named binary file first. Other diagnostics may also be reported.

File: game.yaml

schema_version: 1
id: g
start: {location: camp, party: [scout]}

File: data/world.yaml

classes: {walker: {stats: {mhp: 9, mmp: 0, atk: 1, def: 1, mat: 1, mdf: 1, agi: 1, luk: 1}, exp_for: level * 9}}
actors: {scout: {class: walker}}
skills: {attack: {}, guard: {}}
locations: {camp: {actions: [{label: Look, do: [{pick: Look}]}]}}

GZN1109 #

A YAML file cannot be parsed.

The file is not valid YAML: an indentation, a quote, a colon or a bracket is wrong. A value of a description containing a colon and a space must be quoted.

Fix: Fix the YAML at the line and column the message names.

Reproduction: create these files in an empty game directory, then run gozen check GAME. Decode any base64 block into the named binary file first. Other diagnostics may also be reported.

File: game.yaml

schema_version: 2
id: g
start: {location: camp, party: [scout]}

File: data/world.yaml

classes: {walker: {stats: {mhp: 9, mmp: 0, atk: 1, def: 1, mat: 1, mdf: 1, agi: 1, luk: 1}, exp_for: level * 9}}
actors: {scout: {class: walker}}
skills: {attack: {}, guard: {}}
locations: {camp: [

GZN1110 #

The game directory or game.yaml cannot be read.

The directory given is not a game directory: it does not exist, cannot be read, or has no game.yaml.

Fix: Pass the directory that holds game.yaml, data/ and assets/.

Not YAML-reproducible: This reports an absent or unreadable game directory or game.yaml, rather than YAML content.

GZN1111 #

A dungeon theme is named but its pictures are not in the game.

A dungeon or one of its looks says theme: , but assets/dungeon/themes// lacks wall.jpg, floor.jpg, ceiling.jpg, door.jpg or theme.yaml. The theme’s pictures are not part of the game until they are copied in.

Fix: Run gozen theme add –name (gozen theme list shows the names), or put your own folder of that name there.

Reproduction: create these files in an empty game directory, then run gozen check GAME. Decode any base64 block into the named binary file first. Other diagnostics may also be reported.

File: game.yaml

schema_version: 2
id: g
start: {location: cave, party: [scout]}

File: data/world.yaml

classes: {walker: {stats: {mhp: 9, mmp: 0, atk: 1, def: 1, mat: 1, mdf: 1, agi: 1, luk: 1}, exp_for: level * 9}}
actors: {scout: {class: walker}}
skills: {attack: {}, guard: {}}
locations: {cave: {name: Cave, dungeon: {theme: cave, map: "#####\n#S..#\n#####", tiles: {S: {start: true}}}}}

GZN1112 #

A monster collection or breeding rule is invalid.

A recruit setting, monster family, rank, sex, sex ratio, pair or breeding requirement is invalid or ambiguous. A pair or family rule also fails when its species cannot supply one male and one female parent.

Fix: Define known classes, families and species; use positive ranks and valid probabilities; give each unordered pair one result and ensure its parents can have opposite sexes.

Reproduction: create these files in an empty game directory, then run gozen check GAME. Decode any base64 block into the named binary file first. Other diagnostics may also be reported.

File: game.yaml

schema_version: 6
id: g
start: {location: camp, party: [scout]}

File: data/world.yaml

monster_families: {slime: Slime}
classes: {walker: {stats: {mhp: 9, mmp: 0, atk: 1, def: 1, mat: 1, mdf: 1, agi: 1, luk: 1}, exp_for: level * 9}}
actors: {scout: {class: walker}}
skills: {attack: {}, guard: {}}
locations: {camp: {}}
enemies: {mote: {name: Mote, image: x.png, family: missing, rank: 1, monster_class: walker, recruit: {chance: 1}, stats: {mhp: 9, mmp: 0, atk: 1, def: 1, mat: 1, mdf: 1, agi: 1, luk: 1}}}

File: assets/x.png

iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAIAAABMXPacAAAA+UlEQVR4nO3RQQ0AIAzAwElHClKQhow9ekkFNLk592mxWT+IBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtPqk7BwnBg7bkAAAAAElFTkSuQmCC

GZN1113 #

A monster cannot use its configured growth.

The recruit level or a learned skill exceeds the monster class maximum, or its experience requirement fails to rise with the level. Such a monster cannot progress as authored.

Fix: Keep recruit and skill levels within the class maximum and make exp_for increase from level two through that maximum.

Reproduction: create these files in an empty game directory, then run gozen check GAME. Decode any base64 block into the named binary file first. Other diagnostics may also be reported.

File: game.yaml

schema_version: 6
id: g
start: {location: camp, party: [scout]}

File: data/world.yaml

monster_families: {slime: Slime}
classes: {walker: {max_level: 2, stats: {mhp: 9, mmp: 0, atk: 1, def: 1, mat: 1, mdf: 1, agi: 1, luk: 1}, exp_for: level * 9}}
actors: {scout: {class: walker}}
skills: {attack: {}, guard: {}}
locations: {camp: {}}
enemies: {mote: {name: Mote, image: x.png, family: slime, rank: 1, monster_class: walker, recruit: {chance: 1, level: 3}, stats: {mhp: 9, mmp: 0, atk: 1, def: 1, mat: 1, mdf: 1, agi: 1, luk: 1}}}

File: assets/x.png

iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAIAAABMXPacAAAA+UlEQVR4nO3RQQ0AIAzAwElHClKQhow9ekkFNLk592mxWT+IBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtAABoBwBAOwAA2gEA0A4AgHYAALQDAKAdAADtPqk7BwnBg7bkAAAAAElFTkSuQmCC

GZN12xx #

Fonts and text layout. Exits 1.

GZN1201 #

A font of the game cannot be read.

The layout check reads the game’s fonts to lay out the dialogue, and one of them is missing or is not a TrueType or OpenType font.

Fix: Fix the font files of game.yaml, or check the structure alone with gozen check –only structure.

Reproduction: create these files in an empty game directory, then run gozen check GAME. Decode any base64 block into the named binary file first. Other diagnostics may also be reported.

File: game.yaml

schema_version: 2
id: g
start: {location: camp, party: [scout]}
fonts: {regular: regular.ttf}

File: data/world.yaml

classes: {walker: {stats: {mhp: 9, mmp: 0, atk: 1, def: 1, mat: 1, mdf: 1, agi: 1, luk: 1}, exp_for: level * 9}}
actors: {scout: {class: walker}}
skills: {attack: {}, guard: {}}
locations: {camp: {}}

File: assets/regular.ttf

not a font

GZN14xx #

A trace of a play is broken or shows faults. Exits 1.

GZN1401 #

A line of the trace is broken.

trace reads the JSON Lines the game writes with –trace. A line is not JSON, has no kind t, or has a tick that is not a time.

Fix: Record the trace again with the game’s –trace; do not edit it by hand.

Not YAML-reproducible: This reads malformed JSON Lines from a recorded trace, not game YAML.

GZN1402 #

A standing picture went wrong in the play.

trace –check found a standing picture that moved while speaking, was left over after its line, hid an event picture, or was missing for a speaker.

Fix: Look at the event at the time the line names, and fix its show and hide commands or the speaker’s pictures.

Not YAML-reproducible: This requires standing-picture events in a runtime trace; checking YAML does not execute the play.

GZN1403 #

A song came later than asked for.

trace –check found a song heard later than –music-late seconds after the game asked for it.

Fix: Make the song shorter to load (a smaller file) or ask for it earlier.

Not YAML-reproducible: This measures music delivery times in a runtime trace; YAML alone has no timing evidence.

GZN1404 #

Skipping passed a line that was not read.

trace –check found a line marked not read while skip mode or scene skip was on. Skipping stops before every line not read, unless the player set Text to skip to all (the skip line then carries unread).

Fix: Record the trace again with this engine; if it happens again, report it with the trace.

Not YAML-reproducible: This requires skip and unread-line events in a runtime trace.

GZN1405 #

Rolling back did not go back.

trace –check found a rollback line whose event stayed and whose line did not go back. Rolling back replays the event from its start to the line before.

Fix: Record the trace again with this engine; if it happens again, report it with the trace.

Not YAML-reproducible: This requires rollback events and positions in a runtime trace.

GZN1406 #

A voice could not be read in the play.

trace –check found a voice line marked missing: the file of a line’s voice was not there or was not a sound the engine reads.

Fix: Add the file under assets/ (ogg or wav), or fix the say.voice that names it; gozen check lists missing voices too.

Not YAML-reproducible: This requires a missing-voice event in a runtime trace.

GZN15xx #

An output path: it exists, overlaps an input, or cannot be written. Exits 1.

GZN1501 #

The output already exists.

Commands that write a directory or a list never overwrite: the output must not exist yet, even as an empty directory.

Fix: Choose a new path, or remove the old output yourself.

Not YAML-reproducible: This depends on an output path already existing on the filesystem.

GZN1502 #

The output is inside an input, or holds one.

Writing into the game directory, the overlay or the list would change what is being read.

Fix: Write the output outside the inputs.

Not YAML-reproducible: This depends on the relationship between command-line input and output paths.

GZN17xx #

Building a release or a trial tree. Exits 1.

GZN1701 #

An asset the game refers to is not approved.

release copies only approved assets. An asset of the overlay that the game refers to has no approved inspection record, or it changed since the record.

Fix: Inspect the asset and add an approved record, or stop referring to it.

Not YAML-reproducible: This requires release approval records and an asset overlay, not just checked game definitions.

GZN1702 #

The approval settings or records cannot be read.

The game’s asset-policy.yaml, the overlay’s records, or the –inspect file is missing or malformed, or no overlay is given.

Fix: Give –overlay and –inspect, and check the files the message names.

Not YAML-reproducible: This reports release policy or inspection-record I/O and parsing, which gozen check does not perform.

GZN1703 #

An asset the game refers to is not there.

The tree being built refers to an asset that is neither in the game nor in the overlay.

Fix: Add the asset, or remove the reference; gozen check lists missing pictures too.

Not YAML-reproducible: This is raised while composing a release tree from a game and an asset overlay.

GZN1704 #

Trial.yaml cannot be read.

The range settings of trial are not valid: YAML, an assume that is not var. or flag., a dive_max without blocked, or a bad pattern.

Fix: Fix trial.yaml as the message says.

Not YAML-reproducible: This is raised by trial when reading its selection settings; gozen check does not read trial.yaml.

GZN21xx #

The shape of the command line: commands, operands, options. Exits 2.

GZN2101 #

There is no such command.

The word is not a command of gozen or of the group it follows. Top-level commands include new, run, export, check, sim, trace, notes, release, trial, play, book, art, theme, version, and help. Removed command names are not aliases; use gozen –help to list the current commands.

Fix: Use the command the message names, or run gozen –help (or the group with –help) for the list.

Not YAML-reproducible: This diagnoses command-line arguments before game validation; YAML content cannot provoke it.

GZN2102 #

The command takes another number of arguments.

A command takes a fixed list of positional arguments, such as a game directory and a troop for sim battle. Too few or too many were given; an option that needs a value may have taken the next word.

Fix: Give the arguments the usage line of the command’s –help shows, in that order. Put – before an argument that starts with a dash.

Not YAML-reproducible: This diagnoses command-line arguments before game validation; YAML content cannot provoke it.

GZN2103 #

The command has no such option.

Options belong to a command: an option of sim battle is not an option of sim dive, and a group such as sim has only –help.

Fix: Check the option in the command’s –help.

Not YAML-reproducible: This diagnoses command-line arguments before game validation; YAML content cannot provoke it.

GZN2104 #

A long option was written with one dash.

Options follow the GNU style. A long name with one dash, such as -seed, would be read as the short options -s -e -e -d, so it is refused instead.

Fix: Write the long option with two dashes, such as –seed.

Not YAML-reproducible: This diagnoses command-line arguments before game validation; YAML content cannot provoke it.

GZN2105 #

An option was given before the command.

gozen itself takes only –help and –version. Options of a command come after the command’s name, because the command decides what they mean.

Fix: Write gozen [OPTIONS], for example gozen sim battle game –troop lesson –seed 7.

Not YAML-reproducible: This diagnoses command-line arguments before game validation; YAML content cannot provoke it.

GZN2106 #

A command is required.

gozen, and a group such as sim or art, does nothing by itself. The message lists the commands it holds.

Fix: Add one of the listed commands, or run the group with –help to read about them.

Not YAML-reproducible: This diagnoses command-line arguments before game validation; YAML content cannot provoke it.

GZN22xx #

The value of an option. Exits 2.

GZN2201 #

An option has a value of the wrong type or out of range.

The value cannot be read as the option’s type (a number, a duration), or it is outside the range the option accepts: a count that must be positive, a rate between 0 and 1, a time that cannot be negative, or a pair such as FLOOR:TROOP written another way.

Fix: Give a value of the type and range the option’s description in –help states.

Not YAML-reproducible: This diagnoses command-line arguments before game validation; YAML content cannot provoke it.

GZN2202 #

An option has a value that is not one of its choices.

The option takes one word from a fixed list, such as –format text or json, or check –only structure or layout. A misspelled choice is refused instead of falling back to a default.

Fix: Use one of the values the message lists.

Not YAML-reproducible: This diagnoses command-line arguments before game validation; YAML content cannot provoke it.

GZN23xx #

Options that do not go together, or need each other. Exits 2.

GZN2301 #

Two options do not go together.

The options ask for things that exclude each other, such as a saved state and a chosen party for sim battle, or –raw and –overlay for capture.

Fix: Keep one of the options the message names.

Not YAML-reproducible: This diagnoses command-line arguments before game validation; YAML content cannot provoke it.

GZN2302 #

An option needs another option.

Some options mean something only in company: –as-is keeps the HP of a –state, –try compares the seeds of one –floor, and –overlay and –inspect go together.

Fix: Add the option the message names, or drop the one that needs it.

Not YAML-reproducible: This diagnoses command-line arguments before game validation; YAML content cannot provoke it.

GZN2303 #

A required option is missing.

The command cannot run without the option: capture needs the job file (–config) and destination (–out), release the inspection records (–inspect), and prompt the catalog (–config).

Fix: Add the option the message names.

Not YAML-reproducible: This diagnoses command-line arguments before game validation; YAML content cannot provoke it.

GZN24xx #

A path or a name the command line gives. Exits 2.

GZN2401 #

A path must be relative and stay inside its directory.

The option names a file or a directory inside the game, such as release –prefix. It must be a relative path separated by / that does not climb out with .. or start at the root.

Fix: Write the path relative to the game directory, without .., such as trial.yaml.

Not YAML-reproducible: This diagnoses command-line arguments before game validation; YAML content cannot provoke it.

GZN2402 #

The command line names something the game does not have.

An ID given on the command line, such as the troop of sim battle, the location of sim dive or sim floors, a boss or a shop, a persona of sim design –only, a shot of capture –only, or a model of models fetch, is not defined. A typo in an argument is an argument error, so it exits 2 in every command.

Fix: Check the spelling against the game’s data (gozen book lists every ID), or the list the message names.

Not YAML-reproducible: This diagnoses command-line arguments before game validation; YAML content cannot provoke it.

GZN25xx #

Gozen help. Exits 2.

GZN2501 #

There is no such diagnostic code.

gozen help explains a code of the form GZN and four digits, and this one is not registered. The message lists the codes of the same family when there are any.

Fix: Copy the code from the end of the diagnostic, or look it up on the error codes page.

Not YAML-reproducible: This diagnoses command-line arguments before game validation; YAML content cannot provoke it.