Metadata allows you to attach arbitrary custom data to dialogue entries. This is useful for storing information like actor names, emotional states, camera instructions, sound effects, animations, or any other data your game needs to present dialogue correctly.
Metadata is stored as key-value pairs on each DialogueEntry:
var entry = add_text_entry("Hello, traveler!")# Set metadata using any key-value pairentry.set_metadata("actor", "merchant")entry.set_metadata("emotion", "friendly")entry.set_metadata("portrait", "res://portraits/merchant_smile.png")entry.set_metadata("voice_pitch", 1.2)
You can use any type for keys and values - strings, numbers, objects, etc.
Retrieve metadata in your UI code when processing dialogue:
dialogue_engine.dialogue_continued.connect(func(entry: DialogueEntry) -> void: var text = entry.get_text() # Get metadata with optional default value var actor = entry.get_metadata("actor", "unknown") var emotion = entry.get_metadata("emotion", "neutral") var portrait = entry.get_metadata("portrait") # Update UI based on metadata $NameLabel.text = actor $PortraitSprite.texture = load(portrait) if portrait else null # Display the dialogue $DialogueLabel.text = text)
You can check if metadata exists before retrieving it:
var entry = dialogue_engine.get_current_entry()if entry.has_metadata("actor"): var actor = entry.get_metadata("actor") print("Actor: ", actor)else: print("No actor specified")
var entry = add_text_entry("Get out of my way!")entry.set_metadata("emotion", "angry")entry.set_metadata("volume", 1.5) # Louderentry.set_metadata("animation", "fist_shake")
var entry = add_text_entry("Look at that!")entry.set_metadata("camera_target", "castle")entry.set_metadata("camera_zoom", 1.5)entry.set_metadata("screen_shake", true)
extends DialogueEnginefunc _setup() -> void: # Use DialogueEntry.set_metadata for data that must be available # through DialogueEngine.dialogue_continued signal. # The metadata handling per DialogueEntry must be implemented by the user. add_text_entry("[i]We won! Let's goooo!![/i]").set_metadata("author", "Gary") add_text_entry("Press <Enter> or <Space> to exit.")
And in the UI code:
extends RichTextLabelfunc _ready() -> void: var dialogue_engine: DialogueEngine = HandlingMetadataDialogue.new() dialogue_engine.dialogue_continued.connect(_print_entry) dialogue_engine.advance()func _print_entry(p_dialogue_entry: DialogueEntry) -> void: var text: String = p_dialogue_entry.get_text() # Check for author metadata if p_dialogue_entry.has_metadata("author"): var author: String = p_dialogue_entry.get_metadata("author") text = author + ": " + text append_text(text + "\n")
You can also work with the metadata dictionary directly:
var entry = add_text_entry("Sample text")# Get the metadata dictionary referencevar metadata = entry.get_metadata_data()# Modify it directlymetadata["actor"] = "knight"metadata["emotion"] = "determined"# Or set an entire metadata dictionary at oncevar character_data = { "actor": "wizard", "portrait": "res://portraits/wizard.png", "voice": "res://voices/wizard.ogg"}entry.set_metadata_data(character_data)
var entry = add_text_entry("Thank you for helping me!")entry.set_metadata("quest_update", { "quest_id": "help_farmer", "stage": "complete", "reward_gold": 100, "reward_xp": 50})# Process in UIif entry.has_metadata("quest_update"): var quest_data = entry.get_metadata("quest_update") update_quest(quest_data["quest_id"], quest_data["stage"]) player.add_gold(quest_data["reward_gold"]) player.add_xp(quest_data["reward_xp"])