summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortroido <troido@protonmail.com>2020-04-21 18:14:52 +0200
committertroido <troido@protonmail.com>2020-04-21 18:14:52 +0200
commit36dc11d82fdc7b5db965f0c33c1ee5da9aa1818c (patch)
treeb90286433f8d129db69d0dc15c213b938392cc65
parent99e3ad27e075ccf327d0f399bfa73d75be66d13d (diff)
added options notification
-rw-r--r--src/components/ear.rs10
-rw-r--r--src/components/interactable.rs2
-rw-r--r--src/systems/interact.rs68
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::<Vec<String>>().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::<Vec<String>>()),
- 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::<Vec<&str>>();
+ 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::<Vec<&str>>();
- 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 <player>", "visit <player>. Only possible if they have allowed you"),
+ ("allow <player>", "allow <player> to visit you"),
+ ("disallow <player>", "disallow <player> 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) => {