Nerve Quest

Quest graph editor with a compiler pass, runtime tracking and Blueprint integration.

Shipped a graph-based quest editor that removed hard-coded quest logic, letting designers build branching narratives directly in-editor.

Role: Tools programmer. Team: solo. Duration: 2 months. Platform: Unreal Engine 5. Tools: C++ · Slate · Blueprints.

Problem: Branching narrative lived in hard-coded logic. Every quest change was a code change, a designer could not read what happened after step three, and broken links only surfaced during play.

Approach: A graph asset that feels native to the content browser, validates while you author, and compiles down to flat runtime data.

Result: Designers author branching quests directly in-editor, including nested sub-quests. Invalid connections are refused at edit time rather than discovered in PIE.

Why a graph and not a DataTable. The first version of quest data was a DataTable. It worked in the sense that the game read it, and failed in the sense that nobody could look at it and know what happened after step three. Branching is a graph; storing a graph as rows means every reader rebuilds the shape in their head and every writer keeps row IDs consistent by hand. That mismatch gets paid for in bugs, so the authoring surface had to become the shape of the data.

Two modules, one asset. Editor and runtime are separate modules so Slate and GraphEditor never reach a shipping build. The editor module is a real asset editor rather than a details panel: its own toolkit, editor mode, tab factories, graph schema and node factory, plus asset type actions so quests open on double-click like any native asset.

Validation happens while you author. The validator runs on pins as connections are made, not behind a compile button. A wire that would produce an unreachable objective is refused, so the failure mode is a designer seeing a rejected connection instead of QA filing a ticket two weeks later. Optional pins validate against their owning node, which lets an objective offer a branch without that branch being mandatory.

Six objective types, all extensible. The shipped set covers most quest patterns without a programmer, and each one is subclassable in C++ or Blueprint when it doesn't.

The feature that actually saved time. Selecting a GOTO node draws its acceptable radius in the level viewport. Designers drag the number and watch the circle change without entering play. Of everything in this plugin that is the feature that cut iteration most, and it is four functions behind a WITH_EDITOR guard. The highest-value tooling is rarely the hardest part.

Events, not polling, and a version check. Quests subscribe to gameplay events rather than ticking to ask whether anything changed, so an inactive quest costs nothing. Saved progress carries a version stamp, because the failure I wanted to avoid was a content update silently invalidating someone's save. Rewards are instanced objects granted on completion: override one function and any progression system hooks in without the quest plugin knowing it exists.