summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/systems/interact.rs31
-rw-r--r--src/util.rs8
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<T: Ord>(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 ),* ) => {{