2020-11-19 00:23:13 +00:00
|
|
|
use rand::prelude::*;
|
|
|
|
|
|
|
|
pub struct NameGen<'a, R: Rng> {
|
|
|
|
// 2..
|
|
|
|
pub approx_syllables: usize,
|
2022-01-16 20:22:12 +00:00
|
|
|
pub approx_syllables_long: usize,
|
2020-11-19 00:23:13 +00:00
|
|
|
|
|
|
|
rng: &'a mut R,
|
|
|
|
}
|
|
|
|
|
|
|
|
impl<'a, R: Rng> NameGen<'a, R> {
|
|
|
|
pub fn location(rng: &'a mut R) -> Self {
|
|
|
|
Self {
|
2021-01-26 20:23:18 +00:00
|
|
|
approx_syllables: rng.gen_range(1..4),
|
2022-01-16 20:22:12 +00:00
|
|
|
approx_syllables_long: rng.gen_range(3..4),
|
2020-11-19 00:23:13 +00:00
|
|
|
rng,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn generate(self) -> String {
|
|
|
|
let cons = vec![
|
2020-11-23 15:39:03 +00:00
|
|
|
"d", "f", "ph", "r", "st", "t", "s", "p", "sh", "th", "br", "tr", "m", "k", "st", "w",
|
|
|
|
"y", "cr", "fr", "dr", "pl", "wr", "sn", "g", "qu", "l",
|
2020-11-19 00:23:13 +00:00
|
|
|
];
|
|
|
|
let mut start = cons.clone();
|
|
|
|
start.extend(vec![
|
2020-11-23 15:39:03 +00:00
|
|
|
"cr", "thr", "str", "br", "iv", "est", "ost", "ing", "kr", "in", "on", "tr", "tw",
|
|
|
|
"wh", "eld", "ar", "or", "ear", "irr", "mi", "en", "ed", "et", "ow", "fr", "shr", "wr",
|
|
|
|
"gr", "pr",
|
2020-11-19 00:23:13 +00:00
|
|
|
]);
|
|
|
|
let mut middle = cons.clone();
|
|
|
|
middle.extend(vec!["tt"]);
|
|
|
|
let vowel = vec!["o", "e", "a", "i", "u", "au", "ee", "ow", "ay", "ey", "oe"];
|
|
|
|
let end = vec![
|
|
|
|
"et", "ige", "age", "ist", "en", "on", "og", "end", "ind", "ock", "een", "edge", "ist",
|
|
|
|
"ed", "est", "eed", "ast", "olt", "ey", "ean", "ead", "onk", "ink", "eon", "er", "ow",
|
2020-11-20 01:23:13 +00:00
|
|
|
"ot", "in", "on", "id", "ir", "or", "in", "ig", "en",
|
2020-11-19 00:23:13 +00:00
|
|
|
];
|
|
|
|
|
|
|
|
let mut name = String::new();
|
|
|
|
|
|
|
|
name += start.choose(self.rng).unwrap();
|
|
|
|
for _ in 0..self.approx_syllables.saturating_sub(2) {
|
|
|
|
name += vowel.choose(self.rng).unwrap();
|
|
|
|
name += middle.choose(self.rng).unwrap();
|
|
|
|
}
|
|
|
|
name += end.choose(self.rng).unwrap();
|
|
|
|
|
2020-11-23 15:39:03 +00:00
|
|
|
name.chars()
|
2020-11-19 00:23:13 +00:00
|
|
|
.enumerate()
|
2020-11-23 15:39:03 +00:00
|
|
|
.map(|(i, c)| if i == 0 { c.to_ascii_uppercase() } else { c })
|
2020-11-19 00:23:13 +00:00
|
|
|
.collect()
|
|
|
|
}
|
2022-01-16 15:40:22 +00:00
|
|
|
|
|
|
|
pub fn generate_biome(self) -> String {
|
|
|
|
let cons = vec![
|
2022-01-16 20:22:12 +00:00
|
|
|
"b", "d", "f", "g", "h", "k", "l", "m", "n", "s", "t", "w", "br", "dr", "gr", "gh",
|
|
|
|
"kh", "kr", "st", "str", "th", "tr", "ar", "ark", "adr", "ath", "an", "el", "elb",
|
|
|
|
"eldr", "estr", "ostr", "ond", "ondr", "ul", "uld", "eld", "eldr",
|
2022-01-16 15:40:22 +00:00
|
|
|
];
|
2022-01-16 20:22:12 +00:00
|
|
|
let start = cons.clone();
|
|
|
|
let mid = vec![
|
|
|
|
"br", "d", "dr", "dn", "dm", "fr", "g", "gr", "gl", "k", "kr", "l", "ll", "m", "mm",
|
|
|
|
"n", "nn", "nd", "st", "th", "rw", "nw", "thr", "lk", "nk", "ng", "rd", "rk", "nr",
|
|
|
|
"nth", "rth", "kn", "rl", "gg", "lg", "str", "nb", "lb", "ld", "rm", "sd", "sb",
|
|
|
|
];
|
|
|
|
let mut middle = mid.clone();
|
2022-01-16 15:40:22 +00:00
|
|
|
middle.extend(vec!["tt"]);
|
2022-01-16 20:22:12 +00:00
|
|
|
let vowel = vec!["o", "e", "a", "u", "ae"];
|
2022-01-16 15:40:22 +00:00
|
|
|
let end = vec![
|
2022-01-16 20:22:12 +00:00
|
|
|
"ul", "um", "un", "uth", "und", "ur", "an", "a", "ar", "a", "amar", "amur", "ath",
|
|
|
|
"or", "on", "oth", "omor", "omur", "omar", "ador", "odor", "en", "end", "eth", "amon",
|
|
|
|
"edur", "aden", "oden", "alas", "elas", "alath", "aloth", "eloth", "eres", "ond",
|
|
|
|
"ondor", "undor", "andor", "od", "ed", "amad", "ud", "amud", "ulud", "alud", "allen",
|
|
|
|
"alad", "and", "an", "as", "es",
|
2022-01-16 15:40:22 +00:00
|
|
|
];
|
|
|
|
|
|
|
|
let mut name = String::new();
|
|
|
|
|
|
|
|
name += start.choose(self.rng).unwrap();
|
2022-01-16 20:22:12 +00:00
|
|
|
for _ in 0..self.approx_syllables_long.saturating_sub(2) {
|
2022-01-16 15:40:22 +00:00
|
|
|
name += vowel.choose(self.rng).unwrap();
|
|
|
|
name += middle.choose(self.rng).unwrap();
|
|
|
|
}
|
|
|
|
name += end.choose(self.rng).unwrap();
|
|
|
|
|
|
|
|
name.chars()
|
|
|
|
.enumerate()
|
|
|
|
.map(|(i, c)| if i == 0 { c.to_ascii_uppercase() } else { c })
|
|
|
|
.collect()
|
|
|
|
}
|
2020-11-19 00:23:13 +00:00
|
|
|
}
|