Skip to main content

bevy_talks/
lib.rs

1//! `bevy_talks`: a plugin to write dialogues for your characters to say and do things. The Dialogue System for Bevy.
2
3use bevy::prelude::*;
4
5use data::DialogueDatabase;
6use loader::DialogueDatabaseLoader;
7
8pub mod prelude;
9
10pub mod data;
11pub mod loader;
12pub mod persist;
13pub mod runtime;
14pub mod saver;
15pub mod scripting;
16
17/// The plugin that provides dialogue and conversation handling.
18pub struct TalksPlugin;
19
20impl Plugin for TalksPlugin {
21    fn build(&self, app: &mut App) {
22        app.init_asset::<DialogueDatabase>()
23            .register_type::<DialogueDatabase>()
24            .init_asset_loader::<DialogueDatabaseLoader>()
25            .init_resource::<runtime::Variables>()
26            .init_resource::<runtime::Visits>()
27            .init_resource::<runtime::SequencerSettings>()
28            .init_resource::<scripting::DialogueSystems>()
29            .init_resource::<scripting::SequencerCommands>()
30            .init_resource::<scripting::ScriptEngine>()
31            .init_resource::<scripting::CompiledScripts>()
32            .init_resource::<scripting::cues::PendingCues>()
33            .add_systems(
34                Update,
35                (
36                    scripting::rebuild_engine.run_if(
37                        resource_changed::<scripting::DialogueSystems>
38                            .or_eager(resource_changed::<scripting::SequencerCommands>),
39                    ),
40                    runtime::variables::seed_variables
41                        .run_if(on_message::<AssetEvent<DialogueDatabase>>),
42                    scripting::compile_scripts.run_if(on_message::<AssetEvent<DialogueDatabase>>),
43                    runtime::runner::drive_runners
44                        .run_if(any_with_component::<runtime::DialogueRunner>),
45                    runtime::sequencer::drive_sequences
46                        .run_if(any_with_component::<runtime::PlayingSequence>),
47                )
48                    .chain(),
49            )
50            .add_observer(runtime::runner::on_advance)
51            .add_observer(runtime::runner::on_choose)
52            .add_observer(runtime::sequencer::on_finish_cue)
53            .add_observer(runtime::sequencer::on_skip_line);
54    }
55}