bevy_adventure/
textdisplay.rs

1use std::marker::PhantomData;
2
3use bevy::{
4    ecs::system::SystemParam,
5    prelude::*,
6};
7
8use crate::Item;
9
10pub struct TextDisplayPlugin;
11
12impl Plugin for TextDisplayPlugin {
13    fn build(&self, app: &mut App) {
14        app ////
15            .add_event::<NewMessage>();
16    }
17}
18
19/// A struct that represents a message that should be displayed.
20#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
21#[derive(Clone, Debug)]
22pub enum Message {
23    /// Free-form text.
24    Text(String),
25
26    /// The Item that has just been picked up.
27    ItemPickup(Item),
28
29    /// The result of a successful item combination (`source -> destination = result`).
30    ItemCombine {
31        /// Source Item
32        src: Item,
33
34        /// Destination Item
35        dst: Item,
36
37        /// Result Item
38        result: Item,
39    },
40
41    /// The result of an unsuccesful Item combination.
42    InvalidItemCombination,
43
44    /// A message sent when the wrong Item is used on an Interactive.
45    InvalidItemUsed,
46}
47
48impl Message {
49    /// Creates a `Message::Text` with the passed string.
50    pub fn new(text: &str) -> Self {
51        Self::Text(text.to_owned())
52    }
53}
54
55/// An event that triggers whenever an `Action::Message` is executed.
56#[derive(Debug, Event)]
57pub struct NewMessage(pub Message);
58
59#[derive(SystemParam)]
60pub struct TextDisplay<'w, 's> {
61    events: EventWriter<'w, NewMessage>,
62
63    #[system_param(ignore)]
64    _marker: PhantomData<&'s ()>,
65}
66
67impl<'w, 's> TextDisplay<'w, 's> {
68    pub fn show(&mut self, message: Message) {
69        self.events.send(NewMessage(message));
70    }
71}