oxygengine_visual_novel/
dialogue.rs1use 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 {}