Working on a narrative-adjacent game in Godot 4, not a visual novel, but probably 60+ branching conversations by the time I ship. I keep second-guessing my data format choice and I'm at the point where switching is still possible but won't be for much longer.
Currently using custom Godot Resources (.tres files). A DialogueLine resource has the speaker, text, conditions, and an array of next-line IDs. A DialogueGraph groups them. It felt smart at first: everything's typed, no parsing step, autocomplete works. The reality is that editing in the Inspector is miserable. Branching means manually managing integer IDs with zero visibility into the graph structure. I have 40 conversations and I already dread touching the old ones.
I looked hard at Yarn Spinner and Ink. Yarn has a proper Godot add-on now and the authoring syntax is genuinely nice. Ink is more mature and Inkle has a track record. But both mean learning a DSL and maintaining an external toolchain on top of everything else. Solo project, so that context-switch cost is real.
JSON is the obvious middle ground: any editor, readable diffs, two lines to parse. But I lose type safety and conditions become unvalidated strings. A typo in a flag name fails silently at runtime, and I will absolutely write that typo at 2am and spend an hour wondering why the quest didn't trigger.
The part I can't figure out: does this decision actually compound at 200 conversations, or does any reasonable approach hold if you have discipline about it? I keep reading takes from people who shipped dialogue-heavy games and they're all using completely different things and none of them seem to regret it.
What format are you actually using for branching dialogue, and did the choice age well?