· 6 min read ·

Why Game Dialogue Keeps Outgrowing Its Editors

Source: lobsters

Game dialogue and script data has a long and uncomfortable relationship with spreadsheets. The appeal is obvious: every team already has Google Sheets or Excel, writers know how to use them, and you can share a file with anyone without installing anything. A writer drops dialogue strings into column B, someone adds branching condition flags in column C, trigger IDs land in column D, and suddenly you have a perfectly functional but deeply fragile game data format that nobody fully understands anymore.

Misty’s post on building a visual game script editor is a good example of a developer deciding that the friction of spreadsheets outweighs their convenience. The post documents building a custom visual editor to manage game scripts in a more structured, navigable way. It is a familiar itch. Enough game developers have scratched it that there is an entire ecosystem of tools designed specifically to prevent this kind of yak shaving, and yet people keep building their own anyway.

Understanding why requires looking at what game scripts actually demand from an editor.

The Branching Problem

A flat spreadsheet can represent a linear sequence of dialogue fine. What it cannot represent cleanly is a tree, and game dialogue is almost always a tree. A player talks to an NPC, gets three response options, and each option leads to a different branch of conversation. Some branches loop back, some gate on game state (have you picked up the sword, spoken to the king, completed the quest?), and some trigger side effects (set a flag, play a sound, move a character).

A row-per-line spreadsheet turns this into a reference problem. Each row gets a “next line ID” column, and branches become multiple rows pointing to different targets. Following a conversation thread means jumping around the sheet by ID, which is exactly the kind of non-linear navigation that spreadsheets resist. The visual structure that makes dialogue legible as a human-authored story is completely invisible.

This is the core argument for node-based or tree-based visual editors. When you represent each dialogue node as a box and draw connections between them, the flow of a conversation becomes navigable at a glance. You can see which branches converge, which are dead ends, and where the complexity concentrates.

Yarn Spinner, one of the most widely used game dialogue systems, provides exactly this kind of editor through its Visual Studio Code extension. Its .yarn file format is plain text, which makes version control tractable. Branching logic, conditionals, and variable checks are expressed in a lightweight scripting syntax that writers can learn without thinking of themselves as programmers.

Ink takes a fundamentally different approach, treating narrative scripts as a programming language with its own syntax for choices, stitches, knots, and conditional logic. Inkle Studios used it to ship Heaven’s Vault and 80 Days, both of which involve enormous branching narrative structures. The Ink format is pure text, and the Inky editor provides a split view of code and rendered output. There is no visual node graph; the language is expressive enough that one is arguably unnecessary, though that depends heavily on who is writing the content.

For Godot projects, Dialogic provides a visual timeline editor built directly into the engine, keeping the authoring workflow inside the same application the programmer uses. For Unity, Fungus has been around since 2015, taking a flowchart approach that non-technical team members can navigate. At the commercial end, articy:draft is a full authoring environment used in production on titles like Disco Elysium, with support for flowcharts, character databases, and structured localization pipelines.

Why People Still Build Their Own

Given all of that, why does someone sit down and write a custom visual game script editor?

Usually because the existing tools make assumptions that do not fit the project. Yarn Spinner’s dialogue model is designed around a specific interaction pattern. Ink’s syntax is elegant but opinionated; if your script format needs to embed structured data that Ink was not designed to express, you end up working against the tool rather than with it. Dialogic is Godot-specific. articy:draft is expensive and requires an import/export step between the editor and the game engine that adds friction to every iteration.

The custom tool solves a narrower problem, but it solves exactly that problem without compromise. A custom editor can be designed around the specific script format the game actually uses, with validation rules specific to the game’s logic, previews specific to its rendering pipeline, and a UI specific to the authors writing the content. The cost is time and the ongoing risk of maintenance; the benefit is a workflow that does not require constant workarounds.

What Goes Into the Editor

Building a visual script editor means making a sequence of non-obvious architectural decisions, and each one has downstream consequences.

The data model underneath the visual representation matters more than the UI. Nodes need to be serializable to some stable format that the game engine can consume. If that format is JSON, the editor is responsible for keeping graph structure representable as a JSON document without losing information that is not visible in the node view. If the format is a custom text DSL, the editor needs a parser and a serializer that round-trip cleanly. When the editor output is the direct source of truth the game engine reads, serialization bugs are game bugs.

The rendering layer is another architectural choice. Node graph editors can be built on canvas APIs, SVG, or DOM elements. Canvas is fast but makes hit testing and accessibility harder. SVG is declarative but can struggle with large graphs. DOM-based approaches are the most accessible and easiest to debug but can slow down with hundreds of nodes. Web-based tools, whether Electron, Tauri, or plain browser, have the advantage of a rich UI component ecosystem and cross-platform reach. Native tools get better OS integration and can perform better on large graphs without the memory overhead of a Chromium instance.

Undo and redo are consistently the most underestimated parts of this kind of editor. A command pattern where every user action is an invertible operation sounds straightforward until you have a graph with shared references, where deleting one node affects connections to several others and possibly invalidates metadata elsewhere. Getting the history stack right for a graph editor takes longer than most people budget for.

Localization support, if the game needs it, adds another layer. Once scripts live in a custom format inside a custom editor, you need to decide how translation strings are extracted, tracked, and reinjected. Spreadsheets become relevant again here: translators generally work in tools like Google Sheets or CAT software that expect tabular string data, not node graphs. The round-trip from visual editor to localization vendor and back is a solved problem in commercial tools like articy:draft and an engineering task that has to be designed from scratch in custom ones.

The Broader Pattern

Custom tooling in game development has a long history. Valve’s Hammer editor, originally built for Quake and extended for Half-Life, became influential enough that its level design conventions shaped an entire generation of first-person games. Blizzard has historically built extensive internal tools for every major title, treating the editor as part of the product alongside the game itself. Smaller studios tend to prototype with spreadsheets and build custom tools when the spreadsheet collapses under the weight of the project’s structure.

What Misty’s post illustrates is that this pattern does not require a large team. A sufficiently motivated solo developer can build an editor that fits their specific problem, ships their specific game, and teaches them more about their data model than any generic tool would. You end up understanding your own script format at a level that working around a third-party tool’s abstractions would never require.

The trade-off is real. Time spent building the editor is time not spent building the game, and every editor feature that does not exist yet is a thing writers have to work around. But spreadsheets impose their own overhead: the cognitive tax of navigating dialogue by ID, the lack of validation, the version control friction of binary formats, and the inevitable moment when someone edits the wrong column and the game breaks in a way that takes an hour to track down.

Spreadsheets are a reasonable starting point for almost any kind of structured game data. They are rarely a good endpoint.

Was this interesting?