| Crates.io | bevy_map_dialogue |
| lib.rs | bevy_map_dialogue |
| version | 0.3.1 |
| created_at | 2025-12-21 07:21:10.492839+00 |
| updated_at | 2026-01-20 11:16:44.98914+00 |
| description | Dialogue tree types and runtime for bevy_map_editor |
| homepage | |
| repository | https://github.com/jbuehler23/bevy_map_editor |
| max_upload_size | |
| id | 1997636 |
| size | 160,684 |
Dialogue tree system for the bevy_map_editor ecosystem.
Part of bevy_map_editor.
| Type | Description |
|---|---|
Text |
NPC speaks, then continues to next node |
Choice |
Player selects from options |
Condition |
Branch based on game state |
Action |
Trigger game actions (give item, start quest) |
End |
Dialogue terminates |
| Type | Description |
|---|---|
DialogueTree |
Complete dialogue with all nodes |
DialogueNode |
Single node in the tree |
DialogueChoice |
Player choice option |
DialogueRunner |
Resource tracking active dialogue |
DialogueHandle |
Component holding dialogue asset |
| Event | Description |
|---|---|
StartDialogueEvent |
Begin a dialogue |
DialogueChoiceEvent |
Player made a choice |
DialogueEndEvent |
Dialogue finished |
use bevy_map::dialogue::{DialogueTree, DialogueNode, DialogueChoice};
let mut tree = DialogueTree::new("merchant_greeting");
// Add a choice node
let mut start = DialogueNode::new_choice("Merchant", "Welcome! What would you like?");
start.choices = vec![
DialogueChoice::new("Buy items", "shop"),
DialogueChoice::new("Sell items", "sell"),
DialogueChoice::new("Goodbye", "end"),
];
tree.add_node(start);
The Dialogue Editor panel provides:
use bevy::prelude::*;
use bevy_map::prelude::*;
fn interact(
mut start_events: MessageWriter<StartDialogueEvent>,
dialogue_assets: Res<Assets<DialogueTree>>,
query: Query<(Entity, &DialogueHandle)>,
) {
for (entity, handle) in query.iter() {
start_events.write(StartDialogueEvent {
speaker_entity: entity,
dialogue: handle.0.clone(),
});
}
}
use bevy_map::prelude::*;
fn show_dialogue_ui(
runner: Res<DialogueRunner>,
dialogues: Res<Assets<DialogueTree>>,
) {
if !runner.is_active() { return; }
let Some(handle) = &runner.dialogue_handle else { return };
let Some(tree) = dialogues.get(handle) else { return };
let Some(node_id) = &runner.current_node_id else { return };
let Some(node) = tree.get_node(node_id) else { return };
// Display node.speaker, node.text, node.choices
}
use bevy_map::runtime::DialogueTreeHandle;
commands.spawn(DialogueTreeHandle::new(
asset_server.load("maps/game.map.json"),
"merchant_greeting",
));
Add DialoguePlugin for dialogue handling:
use bevy_map::prelude::*;
app.add_plugins(DialoguePlugin);
Note: MapRuntimePlugin includes this automatically.
MIT OR Apache-2.0