diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/components/ear.rs | 10 | ||||
| -rw-r--r-- | src/components/interactable.rs | 2 | ||||
| -rw-r--r-- | 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::<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) => { |
