summaryrefslogtreecommitdiff
path: root/src/components
diff options
context:
space:
mode:
authortroido <troido@protonmail.com>2020-03-01 22:28:02 +0100
committertroido <troido@protonmail.com>2020-03-01 22:28:02 +0100
commit6a7a74e6878ff04e61e6ef21a922e314b9bab271 (patch)
treeb26015955f50856052153019969f7bee8d1cfbd3 /src/components
parentc846e929a88837094d7a5383a306df1fec56c333 (diff)
use generics for message components
Diffstat (limited to 'src/components')
-rw-r--r--src/components/messages.rs52
-rw-r--r--src/components/mod.rs30
2 files changed, 60 insertions, 22 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>;
diff --git a/src/components/mod.rs b/src/components/mod.rs
index 6fae490..3925d85 100644
--- a/src/components/mod.rs
+++ b/src/components/mod.rs
@@ -1,7 +1,12 @@
pub mod item;
+pub mod messages;
pub use item::Item;
+pub use messages::{
+ AttackMessage,
+ AttackInbox
+};
use specs::{
DenseVecStorage,
@@ -9,9 +14,7 @@ use specs::{
HashMapStorage,
FlaggedStorage,
NullStorage,
- Component,
- Entity,
- WriteStorage
+ Component
};
use crate::{
@@ -22,7 +25,6 @@ use crate::{
controls::Control,
Template,
playerstate::RoomPos,
- attack::Attack,
Timestamp
};
@@ -126,22 +128,6 @@ pub struct RoomExit {
pub dest_pos: RoomPos
}
-#[derive(Component, Debug, Clone, Default)]
-pub struct Attacked {
- pub attacks: Vec<Attack>
-}
-
-impl Attacked {
- pub fn add_attack(attacked: &mut WriteStorage<Attacked> , ent: Entity, attack: Attack) {
- attacked
- .entry(ent)
- .unwrap()
- .or_insert_with(Attacked::default)
- .attacks
- .push(attack);
- }
-}
-
#[derive(Default, Component, Debug, Clone)]
#[storage(NullStorage)]
pub struct Entered;
@@ -153,13 +139,13 @@ pub struct Dying;
#[derive(Component, Debug, Clone)]
#[storage(HashMapStorage)]
pub struct Trap {
- pub attack: Attack
+ pub attack: AttackMessage
}
#[derive(Component, Debug, Clone)]
#[storage(HashMapStorage)]
pub struct Fighter {
- pub attack: Attack,
+ pub attack: AttackMessage,
pub cooldown: i64
}