veloren/world/src/site/namegen.rs

376 lines
18 KiB
Rust
Raw Normal View History

use rand::prelude::*;
pub struct NameGen<'a, R: Rng> {
// 2..
pub approx_syllables: usize,
2022-01-17 18:03:15 +00:00
pub approx_syllables_long: usize,
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-17 18:03:15 +00:00
approx_syllables_long: rng.gen_range(2..4),
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",
];
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",
]);
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",
];
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()
.enumerate()
2020-11-23 15:39:03 +00:00
.map(|(i, c)| if i == 0 { c.to_ascii_uppercase() } else { c })
.collect()
}
2022-01-16 15:40:22 +00:00
// biome naming
// generic
2022-01-16 15:40:22 +00:00
pub fn generate_biome(self) -> String {
let cons = vec![
"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
];
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"]);
let vowel = vec!["o", "e", "a", "u", "ae"];
2022-01-16 15:40:22 +00:00
let end = vec![
"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-17 18:03:15 +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()
}
// biome specific options: engl / custom
fn generate_engl_from_parts(&mut self, start: &[&str], end: &[&str]) -> String {
let mut name = String::new();
name += start.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()
}
fn generate_custom_from_parts(
&mut self,
start: &[&str],
middle: &[&str],
vowel: &[&str],
end: &[&str],
) -> String {
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();
name.chars()
.enumerate()
.map(|(i, c)| if i == 0 { c.to_ascii_uppercase() } else { c })
.collect()
}
pub fn generate_grassland_engl(&mut self) -> String {
let start = [
"green", "heather", "flower", "blue", "yellow", "vast", "moon", "star", "sun",
"bright", "fair", "calm", "mistral", "whisper", "clover", "sooth", "spring", "morrow",
"dim", "dusk", "dawn", "night", "shimmer", "silver", "gold", "amber", "quiet", "still",
"gleam", "wild", "corm", "mint", "petal", "feather", "silent", "bronze", "bistre",
"thistle", "bristle", "dew", "bramble", "sorrel", "broad",
];
let end = [
"brook", "well", "flight", "more", "heart", "song", "barb", "wort", "hoof", "foot",
"herd", "path", "wind", "breeze", "light", "bloom", "rest", "balm", "reach", "flow",
"graze", "trail", "fall", "shrub", "bush", "gale", "run", "stem", "glare", "gaze",
"rove", "brew", "rise", "glow", "wish", "will", "walk", "wander", "wake", "sky",
"burrow", "cross", "roam",
];
self.generate_engl_from_parts(&start, &end)
}
pub fn generate_ocean_engl(&mut self) -> String {
let start = [
"dark", "murk", "shimmer", "glimmer", "spirit", "moon", "dead", "bane", "salt",
"brine", "glitter", "thunder", "pale", "wail", "star", "dim", "azure", "sky", "rage",
"ripple", "gloom", "sun", "gleam", "void", "storm", "death", "silver", "dread",
"sorrow", "grim", "spirit",
];
let end = [
"wave", "shell", "wind", "breeze", "gale", "crash", "grip", "fog", "mirror", "whirl",
"whorl", "stream", "current", "drift", "light", "shine", "haze", "tear", "maw", "fang",
"surf", "tide", "rush", "surge", "glow", "drop", "drag", "swell", "scale", "song",
"shroud", "grasp", "mist",
];
self.generate_engl_from_parts(&start, &end)
}
pub fn generate_mountain_engl(&mut self) -> String {
let start = [
"white", "frost", "ever", "pale", "hoar", "cold", "chill", "shiver", "bitter",
"glimmer", "winter", "algor", "grey", "dragon", "thunder", "pallid", "death", "spirit",
"crystal", "shimmer", "silver", "grizzle", "quiet", "still", "high", "blind", "silent",
"lost", "somber", "silent", "sharp", "somber", "sharp", "rime", "ice", "spear",
"hammer", "sword", "war", "sky", "heaven", "dread",
];
let end = [
"cloud", "veil", "shroud", "fang", "horn", "bite", "more", "howl", "heart", "song",
"scream", "draft", "path", "wind", "breeze", "wail", "crag", "bellow", "breach",
"rift", "chasm", "climb", "fall", "rise", "grasp", "grip", "gale", "summit", "shard",
"pierce", "crush", "shard", "clash", "wish", "will", "wake", "storm", "blade", "hold",
"reach", "maw", "lock", "gust", "stone", "fury", "rage", "jaw", "gorge", "clove",
];
self.generate_engl_from_parts(&start, &end)
}
pub fn generate_snowland_engl(&mut self) -> String {
let start = [
"white", "frost", "ever", "pale", "hoar", "cold", "chill", "shiver", "bitter",
"glimmer", "winter", "algor", "grey", "ghost", "pearl", "pallid", "spectre", "spirit",
"crystal", "shimmer", "silver", "grizzle", "quiet", "still", "wild", "blind", "silent",
"lost", "somber", "sleet", "silent", "sharp", "somber", "sleet", "sharp", "rime",
"ice",
];
let end = [
"wood", "veil", "shroud", "fang", "horn", "bite", "more", "howl", "heart", "song",
"scream", "draft", "path", "wind", "breeze", "wail", "growl", "bellow", "pine", "roam",
"rest", "shade", "fall", "fir", "grasp", "grip", "gale", "hunt", "run", "shadow",
"hill", "shard", "blood", "wish", "will", "walk", "wander", "wake", "storm", "blade",
"hold", "reach", "maw",
];
self.generate_engl_from_parts(&start, &end)
}
pub fn generate_desert_engl(&mut self) -> String {
let start = [
"dry", "sun", "bright", "death", "dread", "sizzle", "scourge", "dearth", "dust",
"gold", "amber", "gleam", "dead", "swelter", "arid", "balm", "parch", "demon",
"scorch", "sear", "gold", "simmer", "doom", "torrid", "drake", "devil", "spirit",
"soul", "singe", "heat", "torch", "bone", "broil", "dragon", "shrivel", "sorrow",
];
let end = [
"swarm", "claw", "curse", "quill", "spell", "bite", "thorn", "bane", "grasp", "storm",
"flare", "wind", "breeze", "howl", "reach", "flow", "sting", "sting", "fang", "blast",
"veil", "scale", "glare", "gaze", "skull", "prickle", "reach", "needle", "void",
"rise", "maw", "raze", "mirage", "glow", "wander", "roam", "breath", "shard", "scar",
"lurk", "cross", "stone", "flash", "dance", "burn", "blaze", "fury", "wound",
"blister", "mark", "waste", "blood", "rock", "grip", "blight",
];
self.generate_engl_from_parts(&start, &end)
}
pub fn generate_swamp_engl(&mut self) -> String {
let start = [
"green", "moss", "deep", "moon", "haze", "drizzle", "mizzle", "rain", "bracken",
"hollow", "mist", "fog", "haze", "tear", "mud", "lost", "spirit", "venom", "glum",
"murk", "dim", "dusk", "night", "quiet", "dark", "brume", "rot", "drench", "sullen",
"still", "gleam", "wild", "blind", "gnarl", "silent", "dead", "rust", "soul", "gloom",
"bramble", "briar", "thorn", "earth", "wither", "tangle", "twist", "fear", "slither",
];
let end = [
"root", "bark", "vine", "brook", "well", "veil", "mantle", "drop", "fang", "beck",
"bough", "vale", "whisper", "shroud", "cloak", "muck", "claw", "wane", "call", "glen",
"rest", "shade", "fall", "grasp", "grip", "water", "glare", "swarm", "creek", "crawl",
"shadow", "glow", "wood", "wander", "river", "pool", "sting", "shriek", "barb", "silt",
"clay", "pond", "gorse", "burr", "blight", "wisp", "scale", "rill",
];
self.generate_engl_from_parts(&start, &end)
}
pub fn generate_jungle_engl(&mut self) -> String {
let start = [
"green", "ever", "briar", "thorn", "deep", "sun", "glare", "tangle", "strangle",
"twist", "dim", "dark", "shade", "savage", "lost", "mist", "shadow", "red", "scarlet",
"fog", "fern", "quiet", "gleam", "wild", "blind", "swift", "gnarl", "venom", "spirit",
"dread", "wonder", "drizzle", "coil", "snarl", "skein", "snare", "murk", "moss",
"slither",
];
let end = [
"root", "bark", "vine", "leaf", "more", "bole", "heart", "song", "climb", "talon",
"bough", "breeze", "light", "branch", "bloom", "vale", "swarm", "prowl", "fang",
"horn", "fall", "bush", "grasp", "grip", "crawl", "run", "sting", "hunt", "pride",
"veil", "shroud", "rise", "glow", "will", "wander", "wake", "blossom", "barb", "scale",
"claw", "catch", "plume", "dance", "maw", "roar", "howl", "shriek", "reach", "drench",
"flower", "snag",
];
self.generate_engl_from_parts(&start, &end)
}
pub fn generate_forest_engl(&mut self) -> String {
let start = [
"green", "moss", "ever", "briar", "thorn", "oak", "deep", "moon", "star", "sun",
"bright", "glare", "fair", "calm", "mistral", "whisper", "clover", "hollow", "spring",
2022-01-26 13:58:48 +00:00
"morrow", "dim", "dusk", "dawn", "night", "shimmer", "silver", "gold", "fern", "quiet",
"still", "gleam", "wild", "blind", "swift", "gnarl", "flutter", "silent", "honey",
"bramble", "rose", "aspen",
];
let end = [
"root", "bark", "log", "brook", "well", "shire", "leaf", "more", "bole", "heart",
"song", "dew", "bough", "path", "wind", "breeze", "light", "branch", "bloom", "vale",
2022-01-26 13:58:48 +00:00
"glen", "rest", "shade", "fall", "sward", "shrub", "bush", "grasp", "grip", "gale",
"crawl", "run", "shadow", "rise", "glow", "wish", "will", "walk", "wander", "wake",
"eye", "blossom", "sprout", "barb",
];
self.generate_engl_from_parts(&start, &end)
}
pub fn generate_forest_custom(&mut self) -> String {
let cons = vec![
"d", "f", "h", "l", "m", "n", "r", "s", "t", "w", "v", "z", "st", "th", "thr", "str",
"vr", "wr", "an", "and", "ald", "ath", "as", "all", "amm", "an", "az", "en", "end",
"eld", "eldr", "es", "ell", "aldr", "astr", "estr", "on", "ond",
];
let start = cons.clone();
let middle = vec![
"th", "d", "dr", "sl", "sm", "rw", "rv", "l", "ll", "m", "mm", "n", "nn", "nd", "ndr",
"thr", "nth", "ln", "lm", "lz", "nz", "nr", "str", "sth", "ld", "rm", "sd", "rn", "ss",
"sn", "lw", "lv", "th", "rw", "nw", "r", "rth", "rz",
2022-01-26 13:58:48 +00:00
];
let vowel = vec!["o", "e", "a", "u", "ae"];
let end = vec![
"anir", "enir", "elen", "alen", "ezen", "azen", "yn", "andir", "endir", "ond", "alar",
"ales", "eles", "arain", "alain", "anuin", "athuin", "aruin", "yr", "ethuin", "eruin",
"athul", "edor", "edes", "edus", "inyr", "eden", "azar", "atiel", "etiel", "etien",
"eties", "aties", "aduil", "eduil", "eduin", "aduin", "assil", "iryl", "aryl", "anor",
"anes", "en", "es", "ys",
];
self.generate_custom_from_parts(&start, &middle, &vowel, &end)
2022-01-26 13:58:48 +00:00
}
pub fn generate_savannah_engl(&mut self) -> String {
let start = [
2022-01-26 13:58:48 +00:00
"red", "pride", "dry", "copper", "vast", "war", "star", "sun", "bright", "blood",
"dawn", "shimmer", "gold", "amber", "gleam", "wild", "rust", "fire", "earth", "spirit",
"bronze", "broad", "scorch", "sear", "gold", "prowl", "marl", "rage", "ghost", "soul",
"specter", "scald", "singe", "heat", "torch", "rite", "bone",
2022-01-26 13:58:48 +00:00
];
let end = [
2022-01-26 13:58:48 +00:00
"dust", "grass", "swarm", "more", "heart", "song", "claw", "fang", "hoof", "foot",
"herd", "path", "wind", "breeze", "howl", "sway", "rest", "reach", "flow", "graze",
"trail", "sting", "fall", "growl", "mane", "bush", "gale", "run", "field", "glare",
"gaze", "wallow", "brew", "rise", "glow", "wade", "wander", "wake", "sky", "roam",
"breath", "shard", "scar", "lurk", "hill", "blaze", "fury", "hunt",
];
self.generate_engl_from_parts(&start, &end)
2022-01-26 13:58:48 +00:00
}
pub fn generate_taiga_engl(&mut self) -> String {
let start = [
2022-01-26 13:58:48 +00:00
"green", "blue", "ever", "pale", "needle", "cold", "moon", "star", "chill", "shiver",
"bitter", "fair", "calm", "mistral", "whisper", "grey", "hollow", "morrow", "dim",
"dusk", "dawn", "night", "shimmer", "silver", "iron", "quill", "grizzle", "quiet",
"still", "wild", "blind", "silent", "somber", "sleet", "silent", "sharp", "somber",
"sleet", "sharp", "rime", "drizzle", "resin",
2022-01-26 13:58:48 +00:00
];
let end = [
2022-01-26 13:58:48 +00:00
"root", "bark", "log", "brook", "well", "shire", "more", "bole", "heart", "song",
"dew", "bough", "path", "wind", "breeze", "light", "branch", "bloom", "pine", "spruce",
"rest", "shade", "fall", "fir", "grasp", "grip", "gale", "hunt", "run", "shadow",
"hill", "shadow", "larch", "rise", "bite", "wish", "will", "walk", "wander", "wake",
"stone", "howl", "moss",
];
self.generate_engl_from_parts(&start, &end)
}
// themes / sites
// greek/latin inspired location names for danari
pub fn generate_danari(self) -> String {
let cons = vec![
"d", "ph", "r", "st", "t", "s", "p", "th", "br", "tr", "m", "k", "cr", "phr", "dr",
"pl", "ch", "l", "ap", "akr", "ak", "ar", "ath", "asp", "al", "aph", "aphr", "oph",
"or", "ok", "on", "od", "oth", "om", "ep", "er", "em", "eph", "eth", "yps", "yph",
"ach", "amph", "yp", "ik", "is", "iph", "ith", "pr", "as", "asph", "ps", "b", "n", "z",
"x", "kr", "kt", "cht", "chr", "thr", "dr", "pr", "pl", "h", "in", "g", "sph",
];
let mut start = cons.clone();
start.extend(vec![
"kr", "tr", "str", "rk", "st", "n", "r", "ph", "phr", "ch", "x", "d", "l", "kt", "pr",
"ll", "pp", "ss", "th", "mm", "s", "t", "g", "mn", "rg", "b", "p", "ps", "kl", "dr",
"mp", "sp", "cht", "lph",
]);
let mut middle = cons.clone();
middle.extend(vec!["tt"]);
let vowel = vec![
"o", "e", "a", "i", "y", "eo", "ae", "ea", "oi", "io", "ia", "aeo",
];
let end = vec![
"ilia", "ilios", "os", "oros", "ophos", "elos", "ethos", "athos", "yros", "a", "ares",
"aros", "olis", "ophis", "era", "ara", "ora", "antis", "entis", "ead", "aeon", "on",
"eon", "oron", "ena", "is", "as", "eris", "eras", "inis", "aros", "in", "orea", "isis",
"okles", "akles", "ilion", "anos", "akos", "akon", "enon", "es", "aros", "ikron",
"orea", "area", "ilon", "ilos", "aelos", "yron", "iron", "adalos", "anon", "ix", "ox",
"alea", "atheas", "eas", "eos", "yros", "ophon",
];
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();
name.chars()
.enumerate()
.map(|(i, c)| if i == 0 { c.to_ascii_uppercase() } else { c })
.collect()
}
}