oxygengine_visual_novel/
dialogue.rs

1use anim::transition::{SwitchTransition, Transition};
2use core::{prefab::Prefab, Scalar};
3use serde::{Deserialize, Serialize};
4
5pub type ActiveDialogue = Transition<Option<Dialogue>>;
6
7#[derive(Debug, Default, Clone, Serialize, Deserialize)]
8pub struct Dialogue {
9    pub character: String,
10    pub text: String,
11    #[serde(default)]
12    pub options: Vec<DialogueOption>,
13}
14
15impl Prefab for Dialogue {}
16
17impl Dialogue {
18    pub fn is_dirty(&self) -> bool {
19        self.options.iter().any(|option| option.is_dirty())
20    }
21
22    pub fn process(&mut self, delta_time: Scalar) {
23        for option in &mut self.options {
24            option.process(delta_time);
25        }
26    }
27}
28
29#[derive(Debug, Default, Clone, Serialize, Deserialize)]
30pub struct DialogueOption {
31    pub text: String,
32    pub action: DialogueAction,
33    #[serde(default)]
34    pub focused: SwitchTransition,
35}
36
37impl Prefab for DialogueOption {}
38
39impl DialogueOption {
40    pub fn is_dirty(&self) -> bool {
41        self.focused.in_progress()
42    }
43
44    pub fn process(&mut self, delta_time: Scalar) {
45        self.focused.process(delta_time);
46    }
47}
48
49#[derive(Debug, Clone, Serialize, Deserialize)]
50pub enum DialogueAction {
51    None,
52    JumpToLabel(String),
53    JumpToChapter(String),
54}
55
56impl Default for DialogueAction {
57    fn default() -> Self {
58        Self::None
59    }
60}
61
62impl Prefab for DialogueAction {}