
Dialogues are a little tricky, complex and unintuitive to setup in Story Framework, so here’s an overview that will aid my (and perhaps your) memory.
The hierarchy goes like this, no wonder I’m confused about it:
- Dialogue Sets (we need at least one)
- Dialogue (each index is an option wrapper)
- Replies (either the redirect from a reply, or {initial} for the first dialogue)
- Reply Options (actual dialogue choices)
- Subtitles (response lines from the NPC)
Basic Conversations
Each index in the Dialogue represents an independent conversation. We need at least one section, while others can be linked to using consequential tags.

Each index in a dialogue section comes up as a page with items on that page. For example with three entries, we’d have three potential pages of questions to ask, each of which with individual entries per page. The SelectOnReply is either {initial} for the first page in the dialogue, or whatever this dialogue is a response to. For example, if you had asked “What is your name” in a previous option, this entry would be the NPC’s reaction to that question.

The ReplyOptions are the entries presented on the dialogue page and can be handled in another entry using the SelectOnReply field, as explained above. This means that we can bring up the same dialogue option multiple times, but we only have to handle it once as a separate index.

Under Subtitles we can define the lines of dialogue our NPC responds with. Right now we have to do the timing and line splitting ourselves.

IsLastReply will end the dialogue (per option), whereas RestartConversation will go back to {initial} after each option (per set).
Consequential Tags
NPCs can share consequential tags, which means we can branch dialogues depending on conditions. If we add a consequential tag on a dialogue option for NPC A, we can then create a new Dialogue with the same name on NPC B, which in turn would only unlock if the option has been used on NPC A. Or we can attach a tag to an item we pick up, which in turn would unlock a different dialogue on the NPC.
For example, NPC A could have a dialogue option like “Have you asked Fred?” (AskFred). Such choices appear blue in the menu by default. When called, NPC B could have its own separate dialogue (also named AskFred) with separate entries. These would be brought up only if the blue dialogue choice had been made on NPC A beforehand.

In this example I’ve added the tag “Has Bone” to an item I’ve been asked to pick up, so when I return to my NPC he will use the “Has Bone” dialogue rather than the “General” one. When I do tell him that I’ve found a bone, the tag is removed and the previous dialogue is used. Alternatively, add another consequential tag (like “GivenBone”), create a new dialogue set with a single response like “thanks for the bone” ending interactions with this NPC.
On this note, to add consequential tags via custom logic, for example when picking up an item like our bone, we can use something like this. Event Destroyed will be called just before the object is removed from the viewport.

Note that all entries in a dialogue are self-contained, they’re not added to the previous (non-consequential) dialogue. If that was intended, all options must be entered and handled again separately.
Relation to Memoirs
Story Framework has a Memoir option to remind players what they’ve come across on their journey. These can be triggered by consequential tags. All we need to do is add the relevant data to the existing Data Table as a new row with the tag, and as soon as it is added, the Memoir gets cued (in MemoirEntryList_DT under StoryFramework/Core/Blueprints/DataTables/)
To bring up an effect telling players that a new Memoir has been added, we can use this (from the monitor example):
