summaryrefslogtreecommitdiff
path: root/src/components/messages.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/components/messages.rs')
-rw-r--r--src/components/messages.rs52
1 files changed, 52 insertions, 0 deletions
diff --git a/src/components/messages.rs b/src/components/messages.rs
new file mode 100644
index 0000000..a2ecd2f
--- /dev/null
+++ b/src/components/messages.rs
@@ -0,0 +1,52 @@
+
+use std::any::Any;
+use specs::{
+ Component,
+ DenseVecStorage,
+ Entity,
+ WriteStorage
+};
+
+
+
+pub trait Message: Send + Sync + Any {}
+
+#[derive(Debug, Clone, Default)]
+pub struct Inbox<M: Message> {
+ pub messages: Vec<M>
+}
+
+impl <M: Message> Component for Inbox<M> {
+ type Storage = DenseVecStorage<Self>;
+}
+
+impl <M: Message> Inbox<M> {
+
+ pub fn add_message(messages: &mut WriteStorage<Self>, ent: Entity, message: M){
+ messages
+ .entry(ent)
+ .unwrap()
+ .or_insert_with(|| Self{messages: Vec::new()})
+ .messages
+ .push(message);
+ }
+}
+
+#[derive(Debug, Clone)]
+pub struct AttackMessage {
+ pub damage: i64,
+ pub attacker: Option<Entity>
+}
+
+impl AttackMessage {
+ pub fn new(damage: i64) -> Self {
+ Self {
+ damage,
+ attacker: None
+ }
+ }
+}
+
+impl Message for AttackMessage {}
+
+pub type AttackInbox = Inbox<AttackMessage>;