From 99e3ad27e075ccf327d0f399bfa73d75be66d13d Mon Sep 17 00:00:00 2001 From: troido Date: Tue, 21 Apr 2020 17:42:43 +0200 Subject: use own strip_prefix function for interaction arguments --- src/systems/interact.rs | 31 +++++++++++++------------------ src/util.rs | 8 ++++++++ 2 files changed, 21 insertions(+), 18 deletions(-) diff --git a/src/systems/interact.rs b/src/systems/interact.rs index ff41b71..735bee4 100644 --- a/src/systems/interact.rs +++ b/src/systems/interact.rs @@ -31,7 +31,8 @@ use crate::{ resources::{Ground, NewEntities, Emigration}, hashmap, playerstate::RoomPos, - PlayerId + PlayerId, + util::strip_prefix }; pub struct Interact; @@ -89,19 +90,16 @@ impl <'a> System<'a> for Interact { } Interactable::Exchange(prefix, exchanges) => { if let Some(txt) = arg { - if let Some(inventory) = inventories.get_mut(actor) { - if txt.starts_with(prefix){ - let action = txt.split_at(prefix.len()).1; - if let Some(exchange) = exchanges.get(action) { - if exchange.can_trade(inventory){ - exchange.trade(inventory, &new.encyclopedia); - say(ear, format!("Success! '{}' ({})", txt, exchange.show()), name); - } else { - say(ear, format!("You do not have the required items or inventory space for '{}' ({})", txt, exchange.show()), name); - } + if let (Some(inventory), Some(action)) = (inventories.get_mut(actor), strip_prefix(&txt, prefix)) { + if let Some(exchange) = exchanges.get(action) { + if exchange.can_trade(inventory){ + exchange.trade(inventory, &new.encyclopedia); + say(ear, format!("Success! '{}' ({})", txt, exchange.show()), name); } else { - say(ear, format!("Invalid option: {}", action), name); + say(ear, format!("You do not have the required items or inventory space for '{}' ({})", txt, exchange.show()), name); } + } else { + say(ear, format!("Invalid option: {}", action), name); } } } else { @@ -117,8 +115,7 @@ impl <'a> System<'a> for Interact { Interactable::Visit(dest) => { if let (Some(player), Some(whitelist)) = (players.get(actor), whitelists.get_mut(ent)){ let argument = arg.unwrap(); - if argument.starts_with("visit ") { - let playername = argument.split_at("visit ".len()).1; + 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){ @@ -129,13 +126,11 @@ impl <'a> System<'a> for Interact { } else { say(ear, format!("unknown destination {}", playername), name); } - } else if argument.starts_with("allow ") { - let playername = argument.split_at("allow ".len()).1; + } 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 argument.starts_with("disallow ") { - let playername = argument.split_at("disallow ".len()).1; + } 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); diff --git a/src/util.rs b/src/util.rs index c9557b2..6a22031 100644 --- a/src/util.rs +++ b/src/util.rs @@ -6,6 +6,14 @@ pub fn clamp(val: T, lower: T, upper: T) -> T{ } +pub fn strip_prefix<'a>(txt: &'a str, prefix: &'a str) -> Option<&'a str> { + if txt.starts_with(prefix) { + Some(txt.split_at(prefix.len()).1) + } else { + None + } +} + #[macro_export] macro_rules! hashmap { ( $($key:expr => $value:expr ),* ) => {{ -- cgit