use std::marker::PhantomData;
use bevy::input::InputSystems;
use bevy::prelude::*;
use crate::balloon::{BalloonScale, DefaultBalloonSkin, expire_bubbles, track_bubbles};
use crate::conversation::{
Bark, BarkQueue, BarkSettings, ChoicePicked, ConversationEnded, DialogueNodeEntered,
DialogueScript, Presenter, Speakers, StartConversation, advance_line, choice_hotkeys,
open_conversation, present_current, queue_barks, release_bark, resolve_choice,
};
use crate::dialog_box::{
ChoiceFocus, animate_box, caret_blink, choice_focus_input, paint_choices, present_dialog_box,
typewriter_tick,
};
#[derive(SystemSet, Debug, Clone, PartialEq, Eq, Hash)]
pub struct DialogInputSet;
pub struct SpeechBubblesPlugin<C: Component>(PhantomData<fn() -> C>);
impl<C: Component> Default for SpeechBubblesPlugin<C> {
fn default() -> Self {
Self(PhantomData)
}
}
impl<C: Component> Plugin for SpeechBubblesPlugin<C> {
fn build(&self, app: &mut App) {
app.add_message::<StartConversation>()
.add_message::<ChoicePicked>()
.add_message::<ConversationEnded>()
.add_message::<DialogueNodeEntered>()
.add_message::<Bark>()
.init_resource::<Speakers>()
.init_resource::<DialogueScript>()
.init_resource::<BarkQueue>()
.init_resource::<BarkSettings>()
.init_resource::<DefaultBalloonSkin>()
.init_resource::<BalloonScale>()
.init_resource::<ChoiceFocus>()
.insert_resource(Presenter::Balloons)
.add_systems(
PreUpdate,
(
open_conversation,
choice_hotkeys,
choice_focus_input,
resolve_choice,
advance_line,
present_current,
present_dialog_box,
queue_barks,
release_bark,
)
.chain()
.in_set(DialogInputSet)
.after(InputSystems),
)
.add_systems(
Update,
(
typewriter_tick,
paint_choices,
caret_blink,
animate_box,
track_bubbles::<C>,
expire_bubbles,
)
.chain(),
);
}
}