Skip to main content
skill Claude Code CX Codex Cursor GitHub Copilot

visual-novel — Claude Code skill: branching script to save/load

A playbook for visual novels: branching script, character and background display, a text box with choices, save anywhere, backlog, skip and auto.

Install into Claude Code · Skills CLI (Vercel) All methods and platforms ↓
npx skills add gamedev-skills/awesome-gamedev-agent-skills --skill visual-novel -a claude-code
Open on GitHub

What visual-novel does

The skill covers the full shape of a visual novel: a branching script in Ink or Yarn Spinner, a text box with speaker name and typewriter reveal, character sprites with expressions and poses, backgrounds with fades. It also details the quality-of-life systems players expect as baseline: save-anywhere, a backlog of read text, skip that fast-forwards only read lines, auto-advance and a text-speed setting.

Inside are nine must-have systems and a table of design knobs: text speed, auto-advance delay, branch breadth and depth, visibility of locked choices, backlog length. Three patterns come with pseudocode: script as data stepped through by the engine; typewriter reveal via visible-character count instead of string slicing; choices that write flags and change later lines or endings.

The skill is compositional: it drives a dialogue engine and a UI layer, but does not re-teach them. For the branching-script engine itself, pair it with dialogue-systems. If the project is Ren'Py 8.5.3, the skill advises using the built-in save-anywhere, rollback, backlog and skip through screens and preferences, applying only the route and flag guidance rather than rebuilding patterns 2–3.

One thing to check early: Yarn Spinner saves only the node, not the exact position inside it. If you need save-anywhere, Ink restores the precise spot; Yarn requires your own state serialisation.

What it helps with

  • write a branching script with conditions and variables
  • build a typewriter text box without words jumping between lines
  • set up sprites, backgrounds and scene transitions
  • add save-anywhere that resumes the exact script position
  • implement backlog, skip-read and auto-advance

Example prompts for the agent

  • Design the route structure and story flags for a visual novel with three endings
  • Add save-anywhere and a read-text backlog to my project
  • Show how to do a typewriter reveal in Godot 4.7 without slicing the string

How to install visual-novel

1Skills CLI (Vercel)

npx skills add gamedev-skills/awesome-gamedev-agent-skills --skill visual-novel -a claude-code

2Manually: put the files in place

~/.claude/skills/visual-novel/SKILL.md

Copy the whole skill folder; for one project use .claude/skills/visual-novel/

From the same set40

The whole set →
game-feel gamedev-skills Teaches the agent to add feedback to game actions: camera shake, hit-stop, eased tweens, squash and stretch, knockback. For mechanics that work but feel weightless. Claude Code CX Codex Cursor +1 9,400installs game-ui-ux gamedev-skills Engine-neutral game UI architecture skill for responsive layouts, screen stacks, gamepad focus, and event-driven HUD updates. Claude Code CX Codex Cursor +1 9,200installs level-design gamedev-skills Plans playable game levels from blockout through playtesting, covering routes, pacing, gates and encounters. Use it when working on whiteboxes, critical paths or room flow. Claude Code CX Codex Cursor +1 7,500installs camera-systems gamedev-skills Engine-neutral patterns for 2D and 3D game cameras: smooth follow, deadzones, look-ahead, bounds clamping, and third-person collision. Claude Code CX Codex Cursor +1 7,100installs audio-design gamedev-skills A skill that treats game audio as a mixer graph: buses, gain in decibels, sidechain ducking, adaptive music and beat-synced events. Samples use Godot 4.7, Unity gets notes. Claude Code CX Codex Cursor +1 7,100installs performance-optimization gamedev-skills A skill that turns “the game runs slow” into a measured bottleneck and a specific fix: profile first, then pool objects, batch draw calls, cut allocations. Claude Code CX Codex Cursor +1 7,100installs game-ai gamedev-skills Designs NPC decision-making, behavior trees, steering forces, and A* pathfinding. Useful when building game enemy logic across engines. Claude Code CX Codex Cursor +1 7,100installs input-systems gamedev-skills Engine-neutral input system: map keys to named actions, rebinding with conflict detection, keyboard, gamepad and touch support, analog deadzones, input buffering and coyote time. Claude Code CX Codex Cursor +1 6,800installs

Similar

fal-assets rehan-remade Generates sprites, tileable textures, 3D models, SFX, and music via fal. Built for modders and game developers who need ready-to-use visual and audio assets directly in their workspace. Claude Code CX Codex Cursor +1 1,400installs threejs-game-ui-designer majidmanzarpour Skill for designing game UIs in Three.js: HUDs, menus, pause and win screens, responsive layout for mobile and desktop. Prevents overlaps, ensures readability, and keeps UI cohesive with game style. Claude Code CX Codex Cursor +1 3,300installs orbit-card heygen-com Adds a 10-second 1920×1080 HyperFrames motion block where a single feature card orbits a dot sphere using exported Blender camera paths. Claude Code CX Codex Cursor +1 9,800installs sdf earthtojake This skill authors and validates SDFormat files for models and worlds, then helps prepare them for simulator handoff. Claude Code CX Codex Cursor +1 10,500installs urdf earthtojake This skill helps create, validate, and debug URDF robot descriptions. Use it when working with links, joints, geometry, meshes, or inertial data. Claude Code CX Codex Cursor +1 10,400installs hatch-pet official openai Creates and packages animated pets and spritesheets for Codex. Use it to turn a character concept, reference image, or brand cues into a pet. Claude Code CX Codex Cursor +1 3,300installs gcode earthtojake Slices STL, 3MF, and OBJ models into printer-ready G-code through OrcaSlicer. Use it when you need a print file without connecting to the printer. Claude Code CX Codex Cursor +1 9,500installs dxf earthtojake Generates and validates 2D DXF drawings from Python build123d scripts: outlines, gaskets, panels, flat patterns for cutting. Claude Code CX Codex Cursor +1 9,100installs

Questions about visual-novel

How do I install visual-novel in Claude Code?

Run npx skills add gamedev-skills/awesome-gamedev-agent-skills --skill visual-novel -a claude-code, then npx skills add gamedev-skills/awesome-gamedev-agent-skills --skill visual-novel -a claude-code. The skill lands in ~/.claude/skills/visual-novel/SKILL.md.

What does the visual-novel skill do?

It defines the script model and player conveniences: text box, characters, backgrounds, choices, flags, save/load, backlog, skip and auto. For the branching-script engine itself you pair it with dialogue-systems.

How is it different from dialogue-systems?

dialogue-systems handles the branching-script engine, Ink or Yarn Spinner. visual-novel works on top of it: script model, character and background presentation, plus save/load, backlog, skip and auto systems.

Source text

SKILL.md · Apache-2.0
---
name: visual-novel
description: >
  Build a visual novel: a branching script, character and background display, a text box with choices,
  save/load, backlog, and skip/auto. Use for a VN, dating sim, or branching story game.
---

# Visual Novel

A playbook for visual novels — the branching script, the presentation (text box, characters,
backgrounds), choices, and the quality-of-life systems players expect (save anywhere, backlog,
skip, auto). This is a **compositional** skill: it drives a dialogue engine and a UI layer. It
does not re-teach the dialogue engine or UI nodes; it defines the script model and the player
conveniences that make a VN pleasant to read.

## When to use

- Use when the game is **mostly reading branching text** with character art and backgrounds:
  visual novel, dating sim, branching interactive fiction, story-choice game.
- Use when designing a choice/route structure, story flags, or VN conveniences (backlog,
  skip, auto-advance, save-anywhere).

**When *not* to use:** dialogue as one feature inside a larger game → `rpg` consuming
`dialogue-systems`. Card/board play → other genres. For the branching-script engine itself,
use `dialogue-systems` (Ink / Yarn Spinner).

**If the project is Ren'Py** (current stable 8.5.3): the engine already ships save-anywhere,
rollback, a history (backlog) screen, skip that stops at unseen text by default
(`preferences.skip_unseen = False`), auto-forward and a text-speed preference. Use and restyle
those through its screens and preferences; apply this skill's design guidance (routes, flags,
reactivity) rather than rebuilding the systems in Patterns 2–3.

## Core loop

**Read a line → advance → (at a branch) make a choice → the story branches on flags/choices →
read on → reach an ending.** The "game" is the *shape of the branching* and whether choices
feel consequential; everything else is presentation and convenience.

## Must-have systems

1. **Branching script** — ordered lines + choices + jumps, with conditions and variables (Ink/Yarn).
2. **Text box** — speaker name, body text, typewriter reveal, advance on click/key.
3. **Characters** — sprites with expressions/poses, positions, show/hide transitions.
4. **Backgrounds + transitions** — scene images, fades/dissolves.
5. **Choices** — present options, gate some on flags, record the pick.
6. **Story state** — flags/variables that branch the script and unlock content.
7. **Save/load (save-anywhere)** — full script position + state; multiple slots; quick save.
8. **VN conveniences** — backlog/history, skip (read text), auto-advance, text-speed setting.
9. **Audio** — music per scene, SFX, optional voice clips.

## Design knobs

| Knob | Effect | Notes |
|------|--------|-------|
| Text speed / instant | reading comfort | Always allow instant + a skip. |
| Auto-advance delay | hands-free reading | Tunable; pause on choices. |
| Skip scope | re-reading | Skip *read* text only by default. |
| Branch breadth/depth | replay value vs. cost | Branches multiply writing/art work. |
| Flag-gated content | reactivity | Lines/choices that check past decisions. |
| Route structure | story shape | Branch-and-merge vs. distinct routes (refs). |
| Choice visibility | fairness | Show locked choices vs. hide them. |
| Backlog length | convenience | Keep enough to re-read recent context. |

## Patterns

### 1. Script as data the engine walks

```python
# Pseudocode. Lines, choices, and jumps as data — usually authored in Ink/Yarn and stepped
# through by that runtime. The engine asks the script for "the next thing to show".
node = script.current()
if node.kind == "line":
    show_text(node.speaker, node.text)        # wait for advance input
elif node.kind == "choice":
    options = [o for o in node.options if condition_met(o.condition, flags)]  # gate by flags
    show_choices(options)                      # wait for selection
elif node.kind == "set":
    flags[node.var] = eval_expr(node.expr, flags)
script.advance(selected_option_or_none)
```

### 2. Typewriter reveal + advance (skippable)

```python
# Pseudocode. Lay out the whole line once, then reveal it; a press first completes the line.
def show_text(speaker, text):
    name_label.text = speaker
    body_label.text = text                     # full text set up front: wrapping is decided now
    shown = 0.0
    while shown < visible_length(body_label):  # count displayed characters, not markup tags
        if advance_pressed():                   # first press: reveal the whole line instantly
            break
        shown += chars_per_second * frame_dt()
        body_label.visible_characters = int(shown)
        wait_one_frame()
    show_all_characters(body_label)
    backlog.append((speaker, text))             # once, when the line is complete
    wait_for_advance()                          # second press: go to the next line
```

Reveal with the label's visible-character count, not by slicing the string: slicing cuts
markup tags in half and re-wraps the text every frame, so a word starts on one line and jumps
to the next. Godot 4.7: `RichTextLabel.visible_characters` (or `visible_ratio`) with
`visible_characters_behavior = TextServer.VC_CHARS_AFTER_SHAPING`; the default
`VC_CHARS_BEFORE_SHAPING` leaves hidden text out of line breaking, so words still jump. Unity 6.3:
`TMP_Text.maxVisibleCharacters` (TextMeshPro, part of the uGUI package).

### 3. Choice sets a flag that branches later content

```python
# Pseudocode. Choices write flags; later conditions read them — that is "reactivity".
def on_choice(option):
    if option.set: flags[option.set] = True     # e.g. flags["helped_npc"] = True
    script.jump(option.target)                   # follow the branch

# Elsewhere, a line/choice/ending checks the flag:
if flags.get("helped_npc"): play_route("good_ending") else: play_route("neutral_ending")
```

## Pitfalls / failure modes

- **Save that only stores a checkpoint** → VNs need **save-anywhere**. Persist the exact script
  position *and* all flags/variables (and seen-text data) so a load resumes the same line. Check
  what your runtime can restore: Ink saves the exact position, Yarn Spinner only the node
  (refs §4).
- **Typewriter text that jumps between lines or shows raw tags** → the reveal slices the string.
  Set the full text and raise the visible-character count (Pattern 2).
- **Presentation logic baked into the script** → unmaintainable. Keep *content* (text, choices)
  in the script and *how it looks* (sprites, transitions) in the engine layer.
- **No skip/auto/backlog** → readers feel trapped, especially on replays. These are expected
  baseline features, not extras.
- **Skipping unread text** → players miss content. Skip should fast-forward **read** text only.
- **Choices with no consequence** → branches that reconverge instantly feel fake. Set flags that
  visibly change later lines, choices, or endings.
- **Combinatorial branch explosion** → unshippable. Prefer branch-and-merge with a few flagged
  variations over fully distinct trees (refs).
- **Lost reading context** → no backlog to re-read the last lines. Keep a history buffer.
- **Hardcoded language** → no localization path. Keep text in data keyed for translation.

## Composition (build it from these skills)

- **Script engine:** `dialogue-systems` (Ink / Yarn Spinner) — branching, conditions, variables, localization hooks.
- **Presentation:** `game-ui-ux` for text-box/choice-menu layout, scaling, and safe areas; `godot-ui-control` for the concrete text box, choice menu, name plate, and backlog UI.
- **Persistence:** `save-systems` for save-anywhere slots, seen-text/skip data, and settings.
- **Audio:** `audio-design` for per-scene music, SFX, and voice playback.
- **Visuals:** the engine animation/`Tween` skill for sprite/background transitions; `shader-programming` for dissolves.
- **Process:** `prototype-fast` to test the branch structure in plain text before adding art.

## References

- For the branching data model, route structures (branch-and-merge vs. routes), flags/variables,
  save-anywhere + backlog/skip data, and the content/presentation split, read
  `references/script-and-flow.md`.

© gamedev-skills · Apache-2.0 · gamedev-skills/awesome-gamedev-agent-skills

See also

Project sponsors

Companies that keep this analytics open
Gold sponsor

Impressions, clicks and code copies — open statistics. We keep the numbers public for the same reason NeBlask itself is public. Become a sponsor