1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
use bevy::{
    ecs::system::SystemParam,
    prelude::*,
};

use crate::Item;

pub struct TextDisplayPlugin;

#[rustfmt::skip]
impl Plugin for TextDisplayPlugin {
    fn build(&self, app: &mut App) {
        app
            .add_event::<NewMessage>();
    }
}

/// A struct that represents a message that should be displayed.
#[derive(Clone, Debug)]
pub enum Message {
    /// Free-form text.
    Text(String),

    /// The Item that has just been picked up.
    ItemPickup(Item),

    /// The result of a successful item combination (`source -> destination = result`).
    ItemCombine {
        /// Source Item
        src: Item,

        /// Destination Item
        dst: Item,

        /// Result Item
        result: Item,
    },

    /// The result of an unsuccesful Item combination.
    InvalidItemCombination,

    /// A message sent when the wrong Item is used on an Interactive.
    InvalidItemUsed,
}

impl Message {
    /// Creates a `Message::Text` with the passed string.
    pub fn new(text: &str) -> Self {
        Self::Text(text.to_owned())
    }
}

/// An event that triggers whenever an `Action::Message` is executed.
#[derive(Debug)]
pub struct NewMessage(pub Message);

#[derive(SystemParam)]
pub struct TextDisplay<'w, 's> {
    events: EventWriter<'w, 's, NewMessage>,
}

impl<'w, 's> TextDisplay<'w, 's> {
    pub fn show(&mut self, message: Message) {
        self.events.send(NewMessage(message));
    }
}