veloren/common/src/npc.rs

56 lines
1.3 KiB
Rust
Raw Normal View History

use crate::assets;
use lazy_static::lazy_static;
use rand::seq::SliceRandom;
use serde_json;
2019-06-15 07:54:47 +00:00
use std::str::FromStr;
2019-06-15 11:48:14 +00:00
use std::sync::Arc;
2019-06-15 07:54:47 +00:00
#[derive(Clone, Copy)]
pub enum NpcKind {
2019-06-03 22:38:44 +00:00
Humanoid,
Wolf,
Pig,
}
impl NpcKind {
fn as_str(self) -> &'static str {
match self {
2019-06-03 22:38:44 +00:00
NpcKind::Humanoid => "humanoid",
NpcKind::Wolf => "wolf",
NpcKind::Pig => "pig",
}
}
}
2019-06-15 07:54:47 +00:00
impl FromStr for NpcKind {
type Err = ();
fn from_str(s: &str) -> Result<Self, ()> {
match s {
"humanoid" => Ok(NpcKind::Humanoid),
"wolf" => Ok(NpcKind::Wolf),
"pig" => Ok(NpcKind::Pig),
2019-06-15 11:48:14 +00:00
_ => Err(()),
2019-06-15 07:54:47 +00:00
}
}
}
lazy_static! {
static ref NPC_NAMES_JSON: Arc<serde_json::Value> = assets::load_expect("common.npc_names");
}
pub fn get_npc_name(npc_type: NpcKind) -> String {
let npc_names = NPC_NAMES_JSON
.get(npc_type.as_str())
.expect("accessing json using NPC type provided as key")
.as_array()
.expect("parsing accessed json value into an array");
let npc_name = npc_names
.choose(&mut rand::thread_rng())
.expect("getting a random NPC name")
.as_str()
.expect("parsing NPC name json value into a &str");
String::from(npc_name)
}