Labels are markers within your dialogue that you can start from and jump to. They define entry points and destinations for dialogue flow.Labels start with ~ followed by a name (without spaces):
Use labels to organize your dialogue into logical sections:
~ startNathan: Welcome! What would you like to do?- Talk about the quest => quest_info- Ask about the shop => shop_info- Leave => END~ quest_infoNathan: The quest is to find the ancient artifact.Nathan: Are you interested?- Yes => accept_quest- No => start~ accept_questNathan: Excellent! Good luck!=> END~ shop_infoNathan: We sell potions and equipment.=> start
~ startNathan: Well?- First one Nathan: You picked the first. => END- Another one => another_label- Start again => start~ another_labelNathan: Another one?=> END
When a response has an inline jump (=> label), any indented content below that response is ignored. The jump takes precedence.
Use “jump and return” syntax to redirect flow temporarily and then return to the original location. These use =>< (with both > and <):
~ startNathan: I'm about to call a subroutine.=>< subroutineNathan: I'm back from the subroutine!=> END~ subroutineNathan: This is the subroutine.Nathan: When it ends, we return to where we jumped from.=> END
~ startNathan: Starting.=>< first_subroutineNathan: All done!=> END~ first_subroutineNathan: In first subroutine.=>< second_subroutineNathan: Back in first subroutine.=> END~ second_subroutineNathan: In second subroutine.=> END
Execution order:
start → “Starting”
Jump to first_subroutine → “In first subroutine”
Jump to second_subroutine → “In second subroutine”
Return to first_subroutine → “Back in first subroutine”
The expression must resolve to a valid label name as a string.
Use expression jumps with caution! The dialogue compiler cannot verify that expression values match actual labels at compile time. If the expression returns an invalid label name, you’ll get runtime errors.
You can import dialogue from other files and jump to their labels:
import "res://snippets.dialogue" as snippets~ startNathan: The next line will be from the snippets file:=>< snippets/banterNathan: That was some banter!=> END
In snippets.dialogue:
~ banterNathan: Blah blah blah.=> END
Use the format namespace/label where namespace is the import alias.
Import syntax details
Import statement:
import "res://path/to/file.dialogue" as namespace_name
Here’s a complete example demonstrating labels, jumps, and returns:
import "res://common_dialogue.dialogue" as common~ start=>< common/greetingNathan: Welcome to my shop! What brings you here?- Tell me about quests => quest_menu- I want to trade => shop_menu- Goodbye => goodbye~ quest_menuNathan: I have several quests available.- Main quest => main_quest_info- Side quest => side_quest_info- Back => start~ main_quest_infoNathan: The main quest involves finding the ancient relic.- Accept it set has_main_quest = true Nathan: Excellent! Good luck! => END- Not interested => quest_menu~ side_quest_infoNathan: The side quest is to collect 10 herbs.- Accept it set has_side_quest = true Nathan: Great! The herbs grow near the forest. => quest_menu- Not interested => quest_menu~ shop_menuNathan: Here's what I have in stock.=>< common/shop_displayNathan: Anything else?- Yes => start- No => goodbye~ goodbyeNathan: Safe travels!=> END
This example shows:
Multiple labels organizing different conversation sections