From afd1317197d1346626c58736defbbdf8aee7da68 Mon Sep 17 00:00:00 2001 From: troido Date: Fri, 10 Apr 2020 00:16:39 +0200 Subject: send out notifications when fighting --- src/components/ear.rs | 87 ++++++++++++++++++++++++++++++++++++++++++++++----- src/components/mod.rs | 2 +- 2 files changed, 81 insertions(+), 8 deletions(-) (limited to 'src/components') diff --git a/src/components/ear.rs b/src/components/ear.rs index 4bfc87b..1432164 100644 --- a/src/components/ear.rs +++ b/src/components/ear.rs @@ -2,23 +2,96 @@ use specs::{ HashMapStorage, Component, + Entity, + WriteStorage }; #[derive(Debug, Clone)] -pub struct Sound { - pub source: Option, - pub text: String +pub enum HealthNotification { + Attack, + Damage, + Heal } -impl Sound { - pub fn as_message(self) -> (Option, String) { - (None, format!("{}: {}", self.source.unwrap_or("".to_string()), self.text)) +use HealthNotification::*; + +#[derive(Debug, Clone)] +pub enum Notification { + Sound{ + source: Option, + text: String + }, + Health { + actor: String, + target: String, + amount: i64, + typ: HealthNotification + }, + Kill { + actor: String, + target: String + }, + Die { + actor: String, + target: String + } +} + +use Notification::*; + + +impl Notification { + + + pub fn type_name(&self) -> String { + (match self { + Sound{source: _, text: _} => "sound", + Health{actor: _, target: _, amount: _, typ} => match typ { + Attack => "attack", + Damage => "damage", + Heal => "heal" + }, + Kill{actor: _, target: _} => "kill", + Die{actor: _, target: _} => "die" + }).to_string() + } + + pub fn as_message(&self) -> (String, String) { + let body = match self { + Sound{source, text} => { + if let Some(name) = &source { + format!("{}: {}", name, &text) + } else { + text.clone() + } + } + Health{actor, target, amount, typ} => { + match typ { + Attack | Damage => format!("{} attacks {} for {} damage", actor, target, amount), + Heal => format!("{} heals {} for {} health", actor, target, amount) + } + }, + Kill{actor, target} => { + format!("{} kills {}", actor, target) + }, + Die{actor, target} => { + format!("{} was killed by {}", target, actor) + } + }; + (self.type_name(), body) } } #[derive(Component, Debug, Clone, Default)] #[storage(HashMapStorage)] pub struct Ear{ - pub sounds: Vec + pub sounds: Vec +} + +pub fn say(ears: &mut WriteStorage, ent: Entity, msg: Notification){ + if let Some(ear) = ears.get_mut(ent) { + ear.sounds.push(msg); + } } + diff --git a/src/components/mod.rs b/src/components/mod.rs index 4065cc2..cb28c4b 100644 --- a/src/components/mod.rs +++ b/src/components/mod.rs @@ -23,7 +23,7 @@ pub use flags::{ Flags }; pub use ear::{ - Sound, + Notification, Ear }; -- cgit