1use rand::prelude::*;
2
3fn generate_alias(rng: &mut impl Rng) -> String {
4 let starts = [
5 "ad", "tr", "b", "l", "p", "d", "r", "w", "t", "fr", "s", "l", "ar", "fl", "ch", "ph",
6 "gr", "sn", "k", "sh", "cr", "cl", "v", "j",
7 ];
8 let vowels = ["o", "e", "a", "i", "oo"];
9 let cons = [
10 "m", "d", "st", "n", "y", "gh", "s", "b", "c", "th", "w", "l", "ph", "sh", "p", "rg", "ld",
11 "hn", "g", "v", "rn",
12 ];
13
14 let mut name = String::new();
15
16 name += starts.choose(rng).unwrap();
17
18 for _ in 0..rng.random_range(1..3) {
19 name += vowels.choose(rng).unwrap();
20 name += cons.choose(rng).unwrap();
21 }
22
23 if rng.random_bool(0.25) {
24 name += vowels.choose(rng).unwrap();
25 }
26
27 name.chars()
29 .enumerate()
30 .map(|(i, c)| if i == 0 { c.to_ascii_uppercase() } else { c })
31 .collect()
32}
33
34fn generate_adjective(rng: &mut impl Rng) -> &'static str {
35 [
36 "Wise",
37 "Polite",
38 "Annoyed",
39 "Shy",
40 "Ordinary",
41 "Small",
42 "Bitter",
43 "Scary",
44 "Keen",
45 "Quick",
46 "Strange",
47 "Old",
48 "Younger",
49 "Boring",
50 "Bizarre",
51 "Lowly",
52 "Ugly",
53 "Brave",
54 "Strong",
55 "Able",
56 "Wrong",
57 "Anxious",
58 "Incoherent",
59 "Odd",
60 "Uninvited",
61 "Curious",
62 "Thoughtless",
63 "Existant",
64 "Oafish",
65 "Sincere",
66 "Irrelevant",
67 "Exhausted",
68 "Bored",
69 ]
70 .choose(rng)
71 .unwrap()
72}
73
74pub fn generate_npc(rng: &mut impl Rng) -> String {
75 match rng.random_range(0..3) {
76 0 => generate_alias(rng),
77 1 => format!("{} the {}", generate_alias(rng), generate_adjective(rng)),
78 _ => format!("{} {}", generate_adjective(rng), generate_alias(rng)),
79 }
80}