From 36dc11d82fdc7b5db965f0c33c1ee5da9aa1818c Mon Sep 17 00:00:00 2001 From: troido Date: Tue, 21 Apr 2020 18:14:52 +0200 Subject: added options notification --- src/components/ear.rs | 10 ++++++- src/components/interactable.rs | 2 +- src/systems/interact.rs | 68 +++++++++++++++++++++++------------------- 3 files changed, 48 insertions(+), 32 deletions(-) diff --git a/src/components/ear.rs b/src/components/ear.rs index 1432164..4aafa72 100644 --- a/src/components/ear.rs +++ b/src/components/ear.rs @@ -35,6 +35,10 @@ pub enum Notification { Die { actor: String, target: String + }, + Options { + description: String, + options: Vec<(String, String)> } } @@ -53,7 +57,8 @@ impl Notification { Heal => "heal" }, Kill{actor: _, target: _} => "kill", - Die{actor: _, target: _} => "die" + Die{actor: _, target: _} => "die", + Options{description: _, options: _} => "options" }).to_string() } @@ -77,6 +82,9 @@ impl Notification { }, Die{actor, target} => { format!("{} was killed by {}", target, actor) + }, + Options{description, options} => { + format!("{}. Options: {}", description, options.iter().map(|(command, desc)| format!("'{}': {};", command, desc)).collect::>().join(" ")) } }; (self.type_name(), body) diff --git a/src/components/interactable.rs b/src/components/interactable.rs index f48fb9d..757e27e 100644 --- a/src/components/interactable.rs +++ b/src/components/interactable.rs @@ -69,7 +69,7 @@ impl Interactable { if let Some(txt) = arg { txt.starts_with("visit ") || txt.starts_with("disallow ") || txt.starts_with("allow ") || txt.starts_with("whitelist") } else { - false + true } } Mine(_) => arg.is_none() diff --git a/src/systems/interact.rs b/src/systems/interact.rs index 735bee4..b377a7a 100644 --- a/src/systems/interact.rs +++ b/src/systems/interact.rs @@ -102,43 +102,51 @@ impl <'a> System<'a> for Interact { say(ear, format!("Invalid option: {}", action), name); } } - } else { - say( - ear, - format!("options: {:?}", exchanges.iter().map(|(id, exchange)| - format!("{}{}: {}", prefix, id, exchange.show()) - ).collect::>()), - name - ); + } else if let Some(ear) = ear { + ear.sounds.push(Notification::Options{ + description: "".to_string(), + options: exchanges.iter().map(|(id, exchange)| (format!("{}{}", prefix, id), exchange.show())).collect() + }) } } Interactable::Visit(dest) => { - if let (Some(player), Some(whitelist)) = (players.get(actor), whitelists.get_mut(ent)){ - let argument = arg.unwrap(); - if let Some(playername) = strip_prefix(&argument, "visit ") { - let destination = dest.format(hashmap!("{player}" => playername)); - if let Some(set) = whitelist.allowed.get(&destination.name) { - if set.contains(&player.id){ - emigration.emigrants.push((player.id.clone(), destination, RoomPos::Unknown)); + if let Some(argument) = arg { + if let (Some(player), Some(whitelist)) = (players.get(actor), whitelists.get_mut(ent)){ + if let Some(playername) = strip_prefix(&argument, "visit ") { + let destination = dest.format(hashmap!("{player}" => playername)); + if let Some(set) = whitelist.allowed.get(&destination.name) { + if set.contains(&player.id){ + emigration.emigrants.push((player.id.clone(), destination, RoomPos::Unknown)); + } else { + say(ear, format!("not allowed to visit {}", playername), name); + } } else { - say(ear, format!("not allowed to visit {}", playername), name); + say(ear, format!("unknown destination {}", playername), name); } - } else { - say(ear, format!("unknown destination {}", playername), name); + } else if let Some(playername) = strip_prefix(&argument, "allow ") { + let destination = dest.format(hashmap!("{player}" => player.id.name.as_str())); + whitelist.allowed.entry(destination.name).or_insert_with(HashSet::new).insert(PlayerId{name: playername.to_string()}); + say(ear, format!("allowed {} to enter your home", playername), name); + } else if let Some(playername) = strip_prefix(&argument, "disallow ") { + let destination = dest.format(hashmap!("{player}" => player.id.name.as_str())); + whitelist.allowed.entry(destination.name).or_insert_with(HashSet::new).remove(&PlayerId{name: playername.to_string()}); + say(ear, format!("disallowed {} to enter your home", playername), name); + } else if argument.starts_with("whitelist") { + let destination = dest.format(hashmap!("{player}" => player.id.name.as_str())); + let allowed = whitelist.allowed.entry(destination.name).or_insert_with(HashSet::new).iter().map(|id| id.name.as_str()).collect::>(); + say(ear, format!("allowed players: {}", allowed.join(", ")), name); } - } else if let Some(playername) = strip_prefix(&argument, "allow ") { - let destination = dest.format(hashmap!("{player}" => player.id.name.as_str())); - whitelist.allowed.entry(destination.name).or_insert_with(HashSet::new).insert(PlayerId{name: playername.to_string()}); - say(ear, format!("allowed {} to enter your home", playername), name); - } else if let Some(playername) = strip_prefix(&argument, "disallow ") { - let destination = dest.format(hashmap!("{player}" => player.id.name.as_str())); - whitelist.allowed.entry(destination.name).or_insert_with(HashSet::new).remove(&PlayerId{name: playername.to_string()}); - say(ear, format!("disallowed {} to enter your home", playername), name); - } else if argument.starts_with("whitelist") { - let destination = dest.format(hashmap!("{player}" => player.id.name.as_str())); - let allowed = whitelist.allowed.entry(destination.name).or_insert_with(HashSet::new).iter().map(|id| id.name.as_str()).collect::>(); - say(ear, format!("allowed players: {}", allowed.join(", ")), name); } + } else if let Some(ear) = ear { + ear.sounds.push(Notification::Options{ + description: "Portal".to_string(), + options: vec![ + ("visit ", "visit . Only possible if they have allowed you"), + ("allow ", "allow to visit you"), + ("disallow ", "disallow to visit you"), + ("whitelist", "show the list of players allowed to visit you") + ].iter().map(|(a, b)| (a.to_string(), b.to_string())).collect() + }) } } Interactable::Mine(skill) => { -- cgit