From f47034bdf86e7ddc831ecb8f50689b9b07a0f6ca Mon Sep 17 00:00:00 2001 From: troido Date: Thu, 21 May 2020 12:45:44 +0200 Subject: actually added talk system and removed reply interaction --- src/components/interactable.rs | 6 ----- src/systems/interact.rs | 6 ----- src/systems/talk.rs | 56 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 56 insertions(+), 12 deletions(-) create mode 100644 src/systems/talk.rs (limited to 'src') diff --git a/src/components/interactable.rs b/src/components/interactable.rs index 636953f..ab1ac29 100644 --- a/src/components/interactable.rs +++ b/src/components/interactable.rs @@ -17,8 +17,6 @@ use crate::{ #[storage(HashMapStorage)] pub enum Interactable { Trigger(Trigger), - Say(String), - Reply(String), Exchange(String, HashMap), Visit(RoomId), Mine(Stat) @@ -32,8 +30,6 @@ impl Interactable { let arg = val.get(1)?; Some(match typ.as_str()? { "trigger" => Trigger(Trigger::from_str(arg.as_str()?)?), - "say" => Say(arg.as_str()?.to_string()), - "reply" => Reply(arg.as_str()?.to_string()), "exchange" => { let (prefix, change) = serde_json::value::from_value::< (String, HashMap, Vec)>) @@ -54,8 +50,6 @@ impl Interactable { pub fn accepts_arg(&self, arg: &Option) -> bool { match self { Trigger(_) => arg.is_none(), - Say(_) => arg.is_none(), - Reply(_) => arg.is_some(), Exchange(prefix, _exchanges) => { if let Some(txt) = arg { txt.starts_with(prefix) diff --git a/src/systems/interact.rs b/src/systems/interact.rs index b377a7a..2090f6f 100644 --- a/src/systems/interact.rs +++ b/src/systems/interact.rs @@ -82,12 +82,6 @@ impl <'a> System<'a> for Interact { Interactable::Trigger(trigger) => { TriggerBox::add_message(&mut triggerbox, ent, *trigger); } - Interactable::Say(text) => { - say(ear, text.clone(), name); - } - Interactable::Reply(text) => { - say(ear, text.replace("{}", &arg.unwrap()), name); - } Interactable::Exchange(prefix, exchanges) => { if let Some(txt) = arg { if let (Some(inventory), Some(action)) = (inventories.get_mut(actor), strip_prefix(&txt, prefix)) { diff --git a/src/systems/talk.rs b/src/systems/talk.rs new file mode 100644 index 0000000..4bb898a --- /dev/null +++ b/src/systems/talk.rs @@ -0,0 +1,56 @@ + +use std::collections::HashSet; + +use specs::{ + ReadStorage, + WriteStorage, + System, + Join, + Read +}; + +use crate::{ + components::{ + Controller, + Position, + Talkable, + Notification, + Ear, + Visible + }, + controls::{Control}, + resources::{Ground}, +}; + +pub struct Talk; +impl <'a> System<'a> for Talk { + type SystemData = ( + ReadStorage<'a, Controller>, + ReadStorage<'a, Position>, + Read<'a, Ground>, + ReadStorage<'a, Talkable>, + WriteStorage<'a, Ear>, + ReadStorage<'a, Visible> + ); + + fn run(&mut self, (controllers, positions, ground, talkables, mut ears, visibles): Self::SystemData) { + for (controller, position, ear) in (&controllers, &positions, &mut ears).join(){ + match &controller.control { + Control::Interact(directions, None) => { + 'targets: for direction in directions { + let pos = position.pos + direction.to_position(); + for ent in ground.cells.get(&pos).unwrap_or(&HashSet::new()) { + if let Some(Talkable{text}) = talkables.get(*ent) { + let name = visibles.get(*ent).map(|v| v.name.clone()); + ear.sounds.push(Notification::Sound{text: text.clone(), source: name}); + break 'targets; + } + } + } + } + _ => {} + } + } + } +} + -- cgit