Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

game.json — file map

Every game has one game.json in the project folder. Most games set only title, window and a few session keys — everything else has a sensible default.

The whole file

Keys with { … } open below. Linked names jump to that section. Grey notes say what each key does. Under each section, Keys lists type, If omitted, allowed values, and a short note.

{
  "title": "My Novel",         // game name
  "title_key": "game_title",   // translated game name
  "version": "1.0.0",          // your version label
  "authors": ["Your Studio"],  // credits / company
  "icon": "icon.png",          // app icon path
  "window": { … },             // base screen size; the picture scales to any window
  "locale": "en",              // starting language
  "i18n": { … },               // languages offered in Settings
  "typing": { … },             // how dialogue text appears
  "sounds": { … },             // title music, voice beeps, button sounds
  "transitions": { … },        // default fade between scenes and screens
  "notifications": { … },      // short messages like Saved
  "session": { … },            // saving, Back, start and end of the story
  "layout": { … },             // where choices, name entry and characters go on screen
  "cursor": { … },             // custom mouse pointer
  "splash": { … },             // boot / loading look before the title on web, Android, and delivered desktop. Draw order: bg_color → background → logo → progress bar. Root keys are shared; web / android / desktop only override that platform
  "android": { … },            // Android store identity for builds
  "stories": [ { … } ],        // several story packs in one game (early)
  "extensions": [ { … } ]      // advanced: your own code packs
}

Root keys

Top-level keys that are not objects.

title string
If omitted empty — window/build name fall back
Values string
Name on the window, web tab, app file and build folder.
title_key string
If omitted use title instead
Catalog key for the title when you use translations.
version string
If omitted empty string ""
Shown in build folder names (e.g. …-v1.0).
authors array
If omitted empty list
Values list of strings
Credits text; also Windows EXE company field.
icon path
If omitted engine default icon
Values project path
Square PNG stamped for every platform (desktop, web favicon, Android launcher).
locale string
If omitted en
Values language code
Language code the game starts in.

Learn more: title · title_key · icon

window

Base screen size; the picture scales to any window.

{
  "window": {       // base screen size; the picture scales to any window
    "width": 1280,  // design width (px)
    "height": 720   // design height (px)
  }
}

Keys

width int
If omitted 1280
Values pixels ≥ 1
Base design width in pixels. The picture scales to any window.
height int
If omitted 720
Values pixels ≥ 1
Base design height in pixels.

Learn more: window

i18n

Languages offered in Settings.

{
  "i18n": {                   // languages offered in Settings
    "locales": [ {            // one entry per language
      "id": "en",             // language code
      "label": "English",     // name in Settings
      "label_key": "lang_en"  // translated language name
    } ]
  }
}

Keys

locales[].id string
If omitted required in each entry
Locale id (e.g. en, uk). Required in each entry.
locales[].label string
If omitted show id
Human name shown in the language list.
locales[].label_key string
If omitted use label
Catalog key for the language name instead of label.

Learn more: i18n

typing

How dialogue text appears.

{
  "typing": {                     // how dialogue text appears
    "cps": 30,                    // letters per second
    "cps_fast": -1,               // speed while advance held
    "delay": 0.07,                // seconds per letter
    "delay_fast": 0.01,           // fast seconds per letter
    "instant": false,             // always show whole lines
    "speed_scale": 1.0,           // overall speed multiplier
    "auto_advance_default": 0.0,  // auto-advance delay
    "reveal": "typewriter",       // how letters appear
    "pending_alpha": 0.0,         // untyped letter opacity
    "reveal_soft": {              // settings for the soft reveal
      "fade_chars": 2.5           // soft fade width
    },
    "reveal_pop": {               // settings for the pop reveal
      "pop_scale": 1.2,           // pop start scale
      "fade_chars": 1.5           // pop fade width
    },
    "reveal_rise": {              // settings for the rise reveal
      "rise_px": 6.0,             // rise distance
      "fade_chars": 1.5           // rise fade width
    },
    "caret": {                    // a blinking mark where typing is
      "enabled": true,            // show typing caret
      "blink": 0.5,               // blink period
      "glyph": "▋",               // caret character
      "color": "#ffffff",         // caret colour
      "offset_x": 0,              // nudge right
      "offset_y": 0,              // nudge down
      "height": "line",           // caret height
      "scale": 1.0,               // extra size
      "texture": "ui/caret.png"   // caret picture
    },
    "beep": {                     // voice beep while text types
      "enabled": true,            // play typing beep
      "sample": "typing_beep",    // beep sample id
      "volume": 0.5,              // beep volume
      "pitch_min": 0.9,           // beep pitch low
      "pitch_max": 1.1            // beep pitch high
    },
    "start_sfx": {                // sound when a line starts typing
      "enabled": true,            // play start sound
      "sample": "msg_in",         // start sample id
      "volume": 1.0               // start volume
    },
    "end_sfx": {                  // sound when a line finishes typing
      "enabled": true,            // play end sound
      "sample": "msg_done",       // end sample id
      "volume": 1.0               // end volume
    }
  }
}

Keys

cps number
If omitted use delay
Values ≥ 0 · 0 = instant
Characters per second. 0 = whole line at once. Omit to use delay instead.
cps_fast number
If omitted -1
CPS while the reader holds fast-forward. -1 means use delay_fast.
delay number
If omitted 0.07
Values seconds
Seconds per character when cps is omitted.
delay_fast number
If omitted 0.01
Values seconds
Seconds per character for fast-forward when cps_fast is unused.
instant bool
If omitted false
Values true · false
Force every line fully visible (wins over a positive cps).
speed_scale number
If omitted 1.0
Multiplies effective typing speed. Readers can change this in Settings.
auto_advance_default number
If omitted 0.0
Values seconds
Seconds after a finished line before moving on. 0 = wait for click.
reveal enum
If omitted typewriter
Values typewriter · soft · fade_line · pop · rise
Reveal style while the typing clock runs.
pending_alpha number
If omitted 0.0
Values 0–1
How visible not-yet-typed letters are (0–1). Ignored for fade_line.
reveal_soft.fade_chars number
If omitted 2.5
How many letters fade at once in soft reveal.
reveal_pop.pop_scale number
If omitted 1.2
Starting size of each letter in pop reveal.
reveal_pop.fade_chars number
If omitted 1.5
Fade width for pop reveal.
reveal_rise.rise_px number
If omitted 6.0
Values pixels
How far letters rise (px) in rise reveal.
reveal_rise.fade_chars number
If omitted 1.5
Fade width for rise reveal.
caret.enabled bool
If omitted true
Values true · false
On/off for the blinking mark at the typed frontier.
caret.blink number
If omitted 0.5
Values seconds
Seconds per blink. 0 = solid (no blink).
caret.glyph string
If omitted ▋
Character drawn when no texture is set.
caret.color color
If omitted #ffffff
Values #RRGGBB
Colour of the caret glyph.
caret.offset_x number
If omitted 0
Values pixels
Horizontal nudge in pixels.
caret.offset_y number
If omitted 0
Values pixels
Vertical nudge in pixels.
caret.height string or number
If omitted line
Values line · pixels
"line" (match line height) or a pixel number.
caret.scale number
If omitted 1.0
Scale multiplier for the caret.
If omitted draw glyph instead
Values project path
Image instead of glyph. Path under the project.
beep.enabled bool
If omitted true
Values true · false
On/off for the typing beep. Panel presets may set this to silence one surface.
beep.sample string
If omitted typing_beep
Values audio id
Sound id under audio/sfx/ played while text types.
beep.volume number
If omitted 0.5
Values 0–1
Typing beep volume (0–1), multiplied by master × SFX.
beep.pitch_min number
If omitted 0.9
Lowest random pitch for the typing beep.
beep.pitch_max number
If omitted 1.1
Highest random pitch for the typing beep.
start_sfx.enabled bool
If omitted true
Values true · false
On/off for the line-start sound. Omit the whole object for silence.
start_sfx.sample string
If omitted no start sound
Values audio id
Sound id under audio/sfx/ played once when the line begins (not on Back/load).
start_sfx.volume number
If omitted 1.0
Values 0–1
Volume (0–1), multiplied by master × SFX. Not gated by Typing Sound.
end_sfx.enabled bool
If omitted true
Values true · false
On/off for the line-end sound. Omit the whole object for silence.
end_sfx.sample string
If omitted no end sound
Values audio id
Sound id under audio/sfx/ played once when the whole line finishes (not each pause, not on Back/load).
end_sfx.volume number
If omitted 1.0
Values 0–1
Volume (0–1), multiplied by master × SFX. Not gated by Typing Sound.

Learn more: typing

sounds

Title music, voice beeps, button sounds.

{
  "sounds": {                      // title music, voice beeps, button sounds
    "main_bgm": "title_theme",     // title music id
    "main_bgm_volume": 1.0,        // title music volume
    "main_bgm_fade_in": 1.5,       // fade-in seconds
    "main_bgm_fade_in_from": 0.0,  // fade-in from volume
    "main_bgm_fade_out": 1.5,      // fade-out seconds
    "main_bgm_fade_out_to": 0.0,   // fade-out to volume
    "button_click": "click",       // button click sound
    "button_hover": "hover",       // button hover sound
    "button_volume": 1.0,          // button sound volume
    "defaults": {                  // Settings values on first launch
      "master": 1.0,               // first-launch master
      "bgm": 1.0,                  // first-launch music
      "sfx": 1.0,                  // first-launch SFX
      "typing_enabled": true       // first-launch beep on/off
    }
  }
}

Keys

main_bgm string
If omitted no title music
Values audio id
BGM id for the title screen.
main_bgm_volume number
If omitted 1.0
Values 0–1
Volume of title BGM (0–1).
main_bgm_fade_in number
If omitted 1.5
Values seconds
Seconds to fade title music in.
main_bgm_fade_in_from number
If omitted 0.0
Values 0–1
Volume the fade-in starts from (0–1).
main_bgm_fade_out number
If omitted 1.5
Values seconds
Seconds to fade title music out.
main_bgm_fade_out_to number
If omitted 0.0
Values 0–1
Volume the fade-out ends at (0–1).
button_click string
If omitted no click sound
Values audio id
Sound id when a UI button is pressed.
button_hover string
If omitted no hover sound
Values audio id
Sound id when the pointer enters a UI button.
button_volume number
If omitted 1.0
Values 0–1
Volume for button click/hover (0–1).
defaults.master number
If omitted 1.0
Values 0–1
Settings master volume on first launch (0–1).
defaults.bgm number
If omitted 1.0
Values 0–1
Settings music volume on first launch (0–1).
defaults.sfx number
If omitted 1.0
Values 0–1
Settings SFX volume on first launch (0–1).
defaults.typing_enabled bool
If omitted true
Values true · false
Whether the typing beep starts enabled in Settings.

Learn more: sounds

transitions

Default fade between scenes and screens.

{
  "transitions": {        // default fade between scenes and screens
    "fade_default": 0.35  // default fade seconds
  }
}

Keys

fade_default number
If omitted 0.35
Values seconds
Default seconds for the full-screen scene veil and screen push/pop when a screen has no own duration.

Learn more: transitions

notifications

Short messages like Saved.

{
  "notifications": {      // short messages like Saved
    "duration": 2.0,      // toast hold time
    "labels": {           // text per message: saved · loaded · save_incompatible
      "saved": {          // any name you choose
        "text": "Saved!"  // message text
      }
    }
  }
}

Keys

duration number
If omitted 2.0
Values seconds
Seconds a short message like Saved stays on screen.
labels.*.text string
If omitted built-in label for that message
Text for one label key (saved, loaded, save_incompatible, …).

Learn more: notifications

session

Saving, Back, start and end of the story.

{
  "session": {                           // saving, Back, start and end of the story
    "boot": "title",                     // cold start screen
    "allow_back": false,                 // enable Back
    "back_retype": false,                // retype when going Back
    "back_limit": 0,                     // Back step limit
    "save_slots": 9,                     // manual save slots
    "hud_screen": "hud",                 // in-game HUD id
    "post_story_screen": "credits",      // screen after last line
    "post_story_return_to_title": true,  // return to title after end
    "default_story": "main"              // New Game story pack
  }
}

Keys

boot enum
If omitted title
Values title · new_game
"title" shows the title screen; "new_game" skips it and starts play.
allow_back bool
If omitted false
Values true · false
Let readers step back through earlier lines (scene rewinds too).
back_retype bool
If omitted false
Values true · false
Retype text when stepping back.
back_limit int
If omitted 0
Values 0 = unlimited · ≥ 1
How many steps Back may go. 0 = no limit.
save_slots int
If omitted 9
Values 1–99
Number of manual save slots (1–99).
hud_screen string
If omitted hud
Values screen id · ""
Screen id shown during play. "" turns the HUD off.
post_story_screen string
If omitted ""
Values screen id · ""
Screen when the story ends (e.g. credits). Empty = none.
post_story_return_to_title bool
If omitted true
Values true · false
After the post-story screen, go back to the title.
If omitted first story pack / main
Values story id
Which story pack bare New Game starts when you have several.

Learn more: session

layout

Where choices, name entry and characters go on screen.

{
  "layout": {                                 // where choices, name entry and characters go on screen
    "choices": {                              // choice menu defaults
      "show_numbers": true,                   // number choices
      "shuffle": false,                       // shuffle choice order
      "gap": 10,                              // space between choices
      "style": "choice_button",               // choice button pack
      "container": {},                        // menu placement box
      "item": {}                              // per-choice defaults
    },
    "text_input": {                           // name-entry defaults
      "style": "input_default",               // input look pack
      "source": "input_extra",                // extra input look
      "container": {},                        // field placement
      "field": {},                            // field chrome
      "confirm": {"label": "OK"}              // confirm button
    },
    "characters": {                           // places for characters on stage
      "mode": "adaptive",                     // place layout engine
      "base_texture_size": 600,               // art height basis
      "active_profile": "default",            // active arrangement
      "adaptive": {                           // an even row of places
        "slot_count": 3,                      // how many places
        "slot_width": 400,                    // place width
        "slot_height": 720,                   // place height
        "side_margin": 20,                    // side inset
        "slot_gap": null,                     // gap between places
        "snap": "bottom",                     // vertical snap
        "margin": 0,                          // edge margin
        "auto_selection_policy": "nearest_center_out",  // free-place pick order
        "alias_strategy": "canonical",        // how places are named
        "aliases": ["left", "center", "right"],  // custom place names
        "z_pattern": "center_front"           // draw-order pattern
      },
      "explicit": {                           // your own arrangements (same as profiles below)
        "active_profile": "default",          // active explicit profile
        "profiles": {}                        // named arrangements
      },
      "profiles": {                           // arrangements by name
        "closeup": {                          // any name you choose
          "aliases": {},                      // extra names for places
          "auto_selection_policy": "nearest_center_out",  // free-place pick order
          "transition": {},                   // move between arrangements
          "slots": [ {                        // the places
            "id": "left",                     // place id
            "x": 320,                         // x position
            "y": 720,                         // y position
            "width": 400,                     // place width
            "height": 720,                    // place height
            "z": 0,                           // draw order
            "order": 0,                       // auto-pick order
            "draw_layer": "behind_panel",     // behind or above panel
            "modulate": "#ffffff",            // tint
            "scale": 1.0                      // size multiplier
          } ]
        }
      }
    }
  }
}

Keys

choices.show_numbers bool
If omitted true
Values true · false
Prefix choices with "1.", "2.", …
choices.shuffle bool
If omitted false
Values true · false
Mix up choice order.
choices.gap number
If omitted -1 (use theme spacing)
Gap between choice rows. -1 means use theme spacing.
If omitted built-in choice look
Values pack name
Theme pack stem for stacked choice buttons.
If omitted default placement
Where the choice menu sits (anchors, size).
If omitted default button chrome
Default chrome for each choice item.
If omitted dialogue colours / flat field
Values pack name
Pack for the name-entry field look.
If omitted none
Values pack name
Optional extra compose pack layered on the input.
If omitted default placement
Where the text-input block sits.
text_input.field object
If omitted default field chrome
Look of the text field itself.
text_input.confirm object
If omitted default confirm button
Confirm button defaults (e.g. { "label": "OK" }).
characters.mode enum
If omitted adaptive
Values adaptive · explicit
"adaptive" = even row; "explicit" = your named profiles.
characters.base_texture_size number
If omitted 600
Values pixels ≥ 1
Picture height your art is drawn for; sizes places when width/height omitted.
characters.active_profile string
If omitted default
Which named profile is in use.
characters.adaptive.slot_count int
If omitted 3
Values 2–…
Number of places in the row (≥ 2).
characters.adaptive.slot_width number
If omitted same as base_texture_size
Width of each place in pixels.
characters.adaptive.slot_height number
If omitted same as slot_width, or base_texture_size
Height of each place in pixels.
characters.adaptive.side_margin number
If omitted 20
Values pixels
Space at the left/right screen edges.
characters.adaptive.slot_gap number or null
If omitted null — auto gap to fit the window
Values null · pixels
null = auto gap to fit the window. A number sets an exact gap (negative overlaps).
characters.adaptive.snap enum
If omitted bottom
Values bottom · top
Stand on the bottom edge or hang from the top.
characters.adaptive.margin number
If omitted 0
Values pixels
Space from the snapped edge (top or bottom).
characters.adaptive.auto_selection_policy string
If omitted nearest_center_out
Values nearest_center_out · policy name
How a free place is chosen when the script gives none.
characters.adaptive.alias_strategy enum
If omitted canonical
Values canonical · indexed · custom
Naming for script places: canonical, indexed, or custom aliases.
characters.adaptive.aliases array
If omitted generated from strategy (left/center/right for 3 slots)
Values list of names
Your names for the places. Required when strategy is custom.
characters.adaptive.z_pattern string
If omitted center_front
Values center_front · pattern name
Which places draw in front (e.g. center_front).
characters.explicit.active_profile string
If omitted default
Which arrangement under explicit.profiles is active.
characters.explicit.profiles object
If omitted built-in three-place profile
Your own place layouts by name.
characters.profiles.*.aliases object
If omitted empty — use slot ids only
Map of alias → slot id for this profile.
characters.profiles.*.auto_selection_policy string
If omitted nearest_center_out
Pick order when no place is given.
If omitted {"kind":"instant","duration":0}
How characters move when switching profiles.
characters.profiles.*.slots[].id string
If omitted required on each place you define
Stable name of this place (required).
characters.profiles.*.slots[].x number
If omitted required on each place you define
Values pixels
Horizontal position in design pixels (required).
characters.profiles.*.slots[].y number
If omitted required on each place you define
Values pixels
Vertical position in design pixels (required).
characters.profiles.*.slots[].width number
If omitted required on each place you define
Values pixels
Width in design pixels (required).
characters.profiles.*.slots[].height number
If omitted required on each place you define
Values pixels
Height in design pixels (required).
characters.profiles.*.slots[].z number
If omitted 0
Higher draws in front.
characters.profiles.*.slots[].order number
If omitted 0
Order in the auto-selection list.
characters.profiles.*.slots[].draw_layer enum
If omitted behind_panel
Values behind_panel · above_panel
Draw behind the dialogue box or above it.
characters.profiles.*.slots[].modulate color
If omitted #ffffff
Values #RRGGBB
Colour multiply tint for characters in this place.
characters.profiles.*.slots[].scale number
If omitted 1.0
Scale for characters in this place.

Learn more: layout

cursor

Custom mouse pointer.

{
  "cursor": {                                 // custom mouse pointer
    "enabled": true,                          // use custom pointer
    "default": "arrow",                       // starting pointer profile
    "config": "cursors.json",                 // pointer catalog file
    "touch_pointer": false,                   // show on touch
    "idle_hide": {                            // hide the pointer while reading
      "enabled": true,                        // hide while idle
      "delay": 2.5,                           // idle seconds
      "fade": 0,                              // fade-out seconds
      "keep_visible": ["choices", "screens"]  // never hide during…
    }
  }
}

Keys

enabled bool
If omitted false
Values true · false
Software cursor on/off. Off or omitted → OS pointer.
default string
If omitted "default", or the default in cursors.json
Profile id from cursors.json to start with.
config string
If omitted cursors.json
Values project path
Path to the pointer pictures file.
touch_pointer bool
If omitted false
Values true · false
Show the soft cursor while touch-pointing.
idle_hide.enabled bool
If omitted false unless you enable idle-hide
Values true · false
Hide the pointer after idle time while reading.
idle_hide.delay number
If omitted 2.5
Values 0.5–30 seconds
Seconds without moving before hide.
idle_hide.fade number
If omitted 0
Values seconds
Soft fade when hiding. OS cursor ignores fade.
idle_hide.keep_visible array
If omitted ["choices","screens"] when idle_hide is set
Values choices · screens · hotspots
Contexts that keep the pointer visible.

Learn more: cursor

splash

Boot / loading look before the title on web, Android, and delivered desktop. Draw order: bg_color → background → logo → progress bar. Root keys are shared; web / android / desktop only override that platform.

{
  "splash": {                          // boot / loading look before the title on web, Android, and delivered desktop. Draw order: bg_color → background → logo → progress bar. Root keys are shared; web / android / desktop only override that platform
    "bg_color": "#1a1a2e",             // solid fill behind everything
    "background": "ui/splash_bg.png",  // full-bleed picture under the logo
    "logo": "sprites/logo.png",        // centred brand mark (prefer PNG)
    "logo_max_width": 300,             // max logo width
    "logo_offset_x": 0,                // nudge logo right (+)
    "logo_offset_y": 0,                // nudge logo down (+)
    "boot": {                          // logo drawing on the web shell
      "fullsize": false,               // stretch logo to fill (web)
      "use_filter": true               // smooth logo scaling (web)
    },
    "progress_bar": {                  // loading bar (web + Android; not desktop)
      "background": "#2a3060",         // track (empty bar) colour
      "fill": "#6a75b0",               // progress fill colour
      "width": "50%",                  // bar width (px or %)
      "height": 6,                     // bar height
      "border_radius": 3,              // bar corner radius
      "bottom_percent": 10             // distance from bottom (%)
    },
    "web": {                           // web-only overrides (merged over root; any splash key may live here)
      "notice": {                      // error plate if the web pack fails
        "background": "#5b3943",       // error plate fill (web)
        "border_color": "#9b3943",     // error plate border (web)
        "text_color": "#e0e0e0"        // error plate text (web)
      }
    },
    "android": {},                     // Android-only overrides
    "desktop": {                       // delivered desktop builds only
      "min_seconds": 0.6               // min brand hold (desktop builds)
    }
  }
}

Keys

bg_color color
If omitted theme panel.default.bg, else colors.background_default; no theme → kit #000000
Values #RRGGBB · null
Solid fill on all platforms (under picture + logo).
background path
If omitted no picture — solid bg_color only
Values project path · null
Cover image under the logo. Web + in-engine Android/desktop overlays. Not used by the Android OS splash API.
logo path
If omitted no logo (null also hides it)
Values project path · null
Centred brand mark. Android OS splash uses this; if missing, root icon is used for the OS splash icon.
logo_max_width number or size
If omitted web shell uses 300; in-engine overlays leave width unconstrained
Values px · CSS size
Max logo width in px; web also accepts CSS sizes like "40%".
logo_offset_x number
If omitted 0
Values pixels
Horizontal nudge from centre; + = right.
logo_offset_y number
If omitted 0
Values pixels
Vertical nudge from centre; + = down, − = up.
boot.fullsize bool
If omitted false
Stretch the logo to fill the web overlay.
boot.use_filter bool
If omitted true
Smooth logo scaling on web; false = sharp / pixel art.
progress_bar.background color
If omitted darkened splash/panel bg from theme; no theme → kit #2a3060
Values #RRGGBB
Colour of the empty loading-bar track. Web + Android in-engine only.
progress_bar.fill color
If omitted theme colors.speaker_text, else choice_text; no theme → kit #6a75b0
Values #RRGGBB
Colour of the loading-bar fill. Web + Android in-engine only.
progress_bar.width number or size
If omitted web shell "50%"
Values px · CSS size
Bar width as pixels or CSS size. Mainly web shell.
progress_bar.height number or size
If omitted 6
Values pixels
Bar height in px (web CSS / overlay).
progress_bar.border_radius number or size
If omitted 3
Values pixels
Rounded corners of the bar (web).
progress_bar.bottom_percent number
If omitted 10
Values 0–100 % of screen height
How far the bar sits from the bottom edge, as % of screen height (web).
web.notice.background color
If omitted darkened splash bg from theme; no theme → kit #5b3943
Values #RRGGBB
Fill of the web error plate when the pack fails to load.
web.notice.border_color color
If omitted same as progress fill from theme; no theme → kit #9b3943
Values #RRGGBB
Border of the web error plate.
web.notice.text_color color
If omitted theme notification_text / dialogue_text; no theme → kit #e0e0e0
Values #RRGGBB
Text colour of the web error plate.
android object
If omitted use root splash keys for Android too
Same keys as root splash, deep-merged for Android only (e.g. a different logo_max_width).
desktop.min_seconds number
If omitted 0.6
Values 0–… seconds
Shortest time the brand splash stays on delivered desktop builds. 0 = dismiss when ready. Not used on web/Android. Author Open does not show this overlay.

Learn more: splash

android

Android store identity for builds.

{
  "android": {                          // Android store identity for builds
    "package_id": "com.studio.mygame",  // Android app id
    "version_code": 1                   // Play versionCode
  }
}

Keys

package_id string
If omitted required for Android builds
Values reverse-DNS id
Reverse-DNS id (e.g. com.studio.game). Required for Android builds. Never change after first Play upload.
version_code int
If omitted 1
Values 1–…
Integer for store uploads. Raise by one every Play upload.

Learn more: android

stories

Several story packs in one game (early).

{
  "stories": [ {               // several story packs in one game (early)
    "id": "main",              // story pack id
    "title": "Chapter One",    // display name
    "title_key": "ch1_title",  // translated title
    "path": "story",           // story folder
    "start": "start",          // first scene id
    "mode": "anthology",       // episode or anthology
    "unlock": {                // when it becomes available
      "always": true,          // always unlocked
      "flag": "ch1_done"       // unlock flag
    },
    "clear_flag": "ch1_done"   // flag set on finish
  } ]
}

Keys

id string
If omitted required on each story entry
Stable id saved with progress (required).
title string
If omitted use id
Name shown to readers / slot labels.
title_key string
If omitted use title
Catalog key for the story title.
path string
If omitted story
Values project folder
Folder with script.txt / story.json.
start string
If omitted start
Entry node id for New Game. Default looks for a moment named start; if that id is missing, the first moment in the story is used. Script sugar: :: start.
mode enum
If omitted anthology
Values episode · anthology
"episode" unlocks in order; "anthology" is free pick.
unlock.always bool
If omitted true when unlock is omitted entirely
Values true · false
Available from the start. Default when unlock is omitted.
unlock.flag string
If omitted ignored unless set
Values flag name
Available once this campaign flag is set.
clear_flag string
If omitted none
Values flag name
Set this campaign flag when the story ends (episode mode).

Learn more: stories

extensions

Advanced: your own code packs.

{
  "extensions": [ {                          // advanced: your own code packs
    "id": "parallax",                        // extension id
    "entry": "extensions/parallax/main.gd",  // main script path
    "runtime_min": "0.1.0"                   // oldest player version
  } ]
}

Keys

id string
If omitted required on each extension entry
Values lowercase_id
Unique id ([a-z0-9_]+). Required.
entry path
If omitted required on each extension entry
Values project path
Extension entry file relative to the project root. Required.
runtime_min string
If omitted no minimum check
Values semver
Skip load if the player is older than this version.

Learn more: extensions