veloren_world/site/
namegen.rs

1use rand::prelude::*;
2
3pub struct NameGen<'a, R: Rng> {
4    // 2..
5    pub approx_syllables: usize,
6    pub approx_syllables_long: usize,
7
8    rng: &'a mut R,
9}
10
11impl<'a, R: Rng> NameGen<'a, R> {
12    pub fn location(rng: &'a mut R) -> Self {
13        Self {
14            approx_syllables: rng.gen_range(1..4),
15            approx_syllables_long: rng.gen_range(2..4),
16
17            rng,
18        }
19    }
20
21    pub fn generate(self) -> String {
22        let cons = vec![
23            "d", "f", "ph", "r", "st", "t", "s", "p", "sh", "th", "br", "tr", "m", "k", "st", "w",
24            "y", "cr", "fr", "dr", "pl", "wr", "sn", "g", "qu", "l",
25        ];
26        let mut start = cons.clone();
27        start.extend(vec![
28            "cr", "thr", "str", "br", "iv", "est", "ost", "ing", "kr", "in", "on", "tr", "tw",
29            "wh", "eld", "ar", "or", "ear", "irr", "mi", "en", "ed", "et", "ow", "fr", "shr", "wr",
30            "gr", "pr",
31        ]);
32        let mut middle = cons.clone();
33        middle.extend(vec!["tt"]);
34        let vowel = ["o", "e", "a", "i", "u", "au", "ee", "ow", "ay", "ey", "oe"];
35        let end = vec![
36            "et", "ige", "age", "ist", "en", "on", "og", "end", "ind", "ock", "een", "edge", "ist",
37            "ed", "est", "eed", "ast", "olt", "ey", "ean", "ead", "onk", "ink", "eon", "er", "ow",
38            "ot", "in", "on", "id", "ir", "or", "in", "ig", "en",
39        ];
40
41        let mut name = String::new();
42
43        name += start.choose(self.rng).unwrap();
44        for _ in 0..self.approx_syllables.saturating_sub(2) {
45            name += vowel.choose(self.rng).unwrap();
46            name += middle.choose(self.rng).unwrap();
47        }
48        name += end.choose(self.rng).unwrap();
49
50        name.chars()
51            .enumerate()
52            .map(|(i, c)| if i == 0 { c.to_ascii_uppercase() } else { c })
53            .collect()
54    }
55
56    // biome naming
57    // generic
58    pub fn generate_biome(self) -> String {
59        let start = [
60            "b", "d", "f", "g", "h", "k", "l", "m", "n", "s", "t", "w", "br", "dr", "gr", "gh",
61            "kh", "kr", "st", "str", "th", "tr", "ar", "ark", "adr", "ath", "an", "el", "elb",
62            "eldr", "estr", "ostr", "ond", "ondr", "ul", "uld", "eld", "eldr",
63        ];
64        let middle = [
65            "br", "d", "dr", "dn", "dm", "fr", "g", "gr", "gl", "k", "kr", "l", "ll", "m", "mm",
66            "n", "nn", "nd", "st", "th", "rw", "nw", "thr", "lk", "nk", "ng", "rd", "rk", "nr",
67            "nth", "rth", "kn", "rl", "gg", "lg", "str", "nb", "lb", "ld", "rm", "sd", "sb", "tt",
68        ];
69        let vowel = ["o", "e", "a", "u", "ae"];
70        let end = [
71            "ul", "um", "un", "uth", "und", "ur", "an", "a", "ar", "a", "amar", "amur", "ath",
72            "or", "on", "oth", "omor", "omur", "omar", "ador", "odor", "en", "end", "eth", "amon",
73            "edur", "aden", "oden", "alas", "elas", "alath", "aloth", "eloth", "eres", "ond",
74            "ondor", "undor", "andor", "od", "ed", "amad", "ud", "amud", "ulud", "alud", "allen",
75            "alad", "and", "an", "as", "es",
76        ];
77
78        let mut name = String::new();
79
80        name += start.choose(self.rng).unwrap();
81        for _ in 0..self.approx_syllables_long.saturating_sub(2) {
82            name += vowel.choose(self.rng).unwrap();
83            name += middle.choose(self.rng).unwrap();
84        }
85        name += end.choose(self.rng).unwrap();
86
87        name.chars()
88            .enumerate()
89            .map(|(i, c)| if i == 0 { c.to_ascii_uppercase() } else { c })
90            .collect()
91    }
92
93    // biome specific options: engl / custom
94    fn generate_engl_from_parts(&mut self, start: &[&str], end: &[&str]) -> String {
95        let mut name = String::new();
96        name += start.choose(self.rng).unwrap();
97        name += end.choose(self.rng).unwrap();
98
99        name.chars()
100            .enumerate()
101            .map(|(i, c)| if i == 0 { c.to_ascii_uppercase() } else { c })
102            .collect()
103    }
104
105    fn generate_custom_from_parts(
106        &mut self,
107        start: &[&str],
108        middle: &[&str],
109        vowel: &[&str],
110        end: &[&str],
111    ) -> String {
112        let mut name = String::new();
113
114        name += start.choose(self.rng).unwrap();
115        for _ in 0..self.approx_syllables.saturating_sub(2) {
116            name += vowel.choose(self.rng).unwrap();
117            name += middle.choose(self.rng).unwrap();
118        }
119        name += end.choose(self.rng).unwrap();
120
121        name.chars()
122            .enumerate()
123            .map(|(i, c)| if i == 0 { c.to_ascii_uppercase() } else { c })
124            .collect()
125    }
126
127    pub fn generate_lake_custom(&mut self) -> String {
128        let start = [
129            "b", "f", "g", "d", "h", "c", "m", "l", "n", "p", "r", "s", "t", "w", "v", "z", "qu",
130            "br", "bl", "ch", "chr", "dr", "dw", "fr", "fl", "gr", "gw", "pr", "pl", "st", "sl",
131            "str", "sn", "sp", "spr", "sw", "tr", "wr", "as", "ast", "en", "end", "eld", "es",
132            "on", "ond", "orn", "un", "und", "undr", "in", "ind",
133        ];
134        let middle = ["b", "g", "d", "ch", "m", "l", "n", "p", "r", "s", "t", "v"];
135        let vowel = ["e", "a", "i", "o", "u"];
136        let end = [
137            "oric", "aric", "eric", "ara", "ira", "ora", "era", "aron", "eron", "oron", "ugan",
138            "igan", "adar", "edar", "agron", "udar", "alar", "ular", "imar", "amar", "iles",
139            "ares", "odor", "odur", "azan", "uzan", "ichor", "olon", "anath", "oloth", "oroth",
140            "isor", "agun", "agon", "egon", "oroc", "orac", "essa", "amma", "emma", "oluth",
141            "anda", "onda", "ondo",
142        ];
143        self.generate_custom_from_parts(&start, &middle, &vowel, &end)
144    }
145
146    pub fn generate_grassland_engl(&mut self) -> String {
147        let start = [
148            "green", "heather", "flower", "blue", "yellow", "vast", "moon", "star", "sun",
149            "bright", "fair", "calm", "mistral", "whisper", "clover", "sooth", "spring", "morrow",
150            "dim", "dusk", "dawn", "night", "shimmer", "silver", "gold", "amber", "quiet", "still",
151            "gleam", "wild", "corm", "mint", "petal", "feather", "silent", "bronze", "bistre",
152            "thistle", "bristle", "dew", "bramble", "sorrel", "broad",
153        ];
154        let end = [
155            "brook", "well", "flight", "more", "heart", "song", "barb", "wort", "hoof", "foot",
156            "herd", "path", "wind", "breeze", "light", "bloom", "rest", "balm", "reach", "flow",
157            "graze", "trail", "fall", "shrub", "bush", "gale", "run", "stem", "glare", "gaze",
158            "rove", "brew", "rise", "glow", "wish", "will", "walk", "wander", "wake", "sky",
159            "burrow", "cross", "roam",
160        ];
161        self.generate_engl_from_parts(&start, &end)
162    }
163
164    pub fn generate_grassland_custom(&mut self) -> String {
165        let start = [
166            "b", "f", "g", "d", "h", "c", "m", "l", "n", "p", "r", "s", "t", "w", "v", "z", "qu",
167            "br", "bl", "ch", "chr", "dr", "dw", "fr", "fl", "gr", "gw", "pr", "pl", "st", "sl",
168            "str", "sn", "sp", "spr", "sw", "tr", "wr", "ab", "abr", "al", "ald", "as", "ast",
169            "amm", "ach", "adr", "en", "end", "eld", "end", "es", "amr", "on", "ond", "ochr",
170            "orn", "ost", "ord",
171        ];
172        let middle = [
173            "b", "g", "d", "c", "m", "l", "n", "p", "r", "s", "t", "v", "br", "ch", "chr", "dr",
174            "gr", "pr", "st", "sl", "sn", "sp", "sw", "tr", "ghr", "mm", "n", "nn", "nd", "ln",
175            "lm", "nr", "r", "rz", "lz", "ld", "rm", "sd", "rn", "ss", "sm", "rv", "lv",
176        ];
177        let vowel = ["e", "a", "i", "o", "ea", "au"];
178        let end = [
179            "on", "oc", "ic", "oric", "aric", "eric", "elten", "alend", "alan", "aven", "elen",
180            "estin", "ostin", "alic", "elic", "alon", "elon", "arac", "erac", "eden", "elen",
181            "owan", "owen", "iel", "ien", "ing", "olm", "ulm", "ilm", "alm", "elm", "oria", "aria",
182            "eria", "elis", "alis", "amor", "emor", "en", "ard", "erd", "ord", "org", "enara",
183            "aran",
184        ];
185        self.generate_custom_from_parts(&start, &middle, &vowel, &end)
186    }
187
188    pub fn generate_ocean_engl(&mut self) -> String {
189        let start = [
190            "dark", "murk", "shimmer", "glimmer", "spirit", "moon", "dead", "bane", "salt",
191            "brine", "glitter", "thunder", "pale", "wail", "star", "dim", "azure", "sky", "rage",
192            "ripple", "gloom", "sun", "gleam", "void", "storm", "death", "silver", "dread",
193            "sorrow", "grim", "spirit",
194        ];
195        let end = [
196            "wave", "shell", "wind", "breeze", "gale", "crash", "grip", "fog", "mirror", "whirl",
197            "whorl", "stream", "current", "drift", "light", "shine", "haze", "tear", "maw", "fang",
198            "surf", "tide", "rush", "surge", "glow", "drop", "drag", "swell", "scale", "song",
199            "shroud", "grasp", "mist",
200        ];
201        self.generate_engl_from_parts(&start, &end)
202    }
203
204    pub fn generate_ocean_custom(&mut self) -> String {
205        let start = [
206            "b", "f", "g", "d", "h", "c", "m", "l", "n", "p", "r", "s", "t", "w", "v", "z", "qu",
207            "br", "bl", "ch", "chr", "dr", "dw", "fr", "fl", "gr", "gw", "pr", "pl", "st", "sl",
208            "str", "sn", "sp", "spr", "sw", "tr", "wr", "as", "ast", "en", "end", "eld", "es",
209            "on", "ond", "orn", "un", "und", "undr", "in", "ind",
210        ];
211        let middle = ["b", "g", "d", "ch", "m", "l", "n", "p", "r", "s", "t", "v"];
212        let vowel = ["e", "a", "i", "o", "u"];
213        let end = [
214            "oric", "aric", "eric", "ara", "ira", "ora", "era", "aron", "eron", "oron", "ugan",
215            "igan", "adar", "edar", "agron", "udar", "alar", "ular", "imar", "amar", "iles",
216            "ares", "odor", "odur", "azan", "uzan", "ichor", "olon", "anath", "oloth", "oroth",
217            "isor", "agun", "agon", "egon", "oroc", "orac", "essa", "amma", "emma", "oluth",
218            "anda", "onda", "ondo",
219        ];
220        self.generate_custom_from_parts(&start, &middle, &vowel, &end)
221    }
222
223    pub fn generate_mountain_engl(&mut self) -> String {
224        let start = [
225            "white", "frost", "ever", "pale", "hoar", "cold", "chill", "shiver", "bitter",
226            "glimmer", "winter", "algor", "grey", "dragon", "thunder", "pallid", "death", "spirit",
227            "crystal", "shimmer", "silver", "grizzle", "quiet", "still", "high", "blind", "silent",
228            "lost", "somber", "silent", "sharp", "somber", "sharp", "rime", "ice", "spear",
229            "hammer", "sword", "war", "sky", "heaven", "dread",
230        ];
231        let end = [
232            "cloud", "veil", "shroud", "fang", "horn", "bite", "more", "howl", "heart", "song",
233            "scream", "draft", "path", "wind", "breeze", "wail", "crag", "bellow", "breach",
234            "rift", "chasm", "climb", "fall", "rise", "grasp", "grip", "gale", "summit", "shard",
235            "pierce", "crush", "shard", "clash", "wish", "will", "wake", "storm", "blade", "hold",
236            "reach", "maw", "lock", "gust", "stone", "fury", "rage", "gorge", "clove",
237        ];
238        self.generate_engl_from_parts(&start, &end)
239    }
240
241    pub fn generate_mountain_custom(&mut self) -> String {
242        let start = [
243            "b", "d", "f", "g", "h", "k", "l", "m", "n", "s", "t", "w", "br", "dr", "gr", "gh",
244            "kh", "kr", "st", "str", "th", "tr", "ar", "ark", "adr", "ath", "an", "el", "elb",
245            "eldr", "estr", "ostr", "ond", "ondr", "ul", "uld", "eld", "eldr",
246        ];
247        let middle = [
248            "br", "d", "dr", "dn", "dm", "fr", "g", "gr", "gl", "k", "kr", "l", "ll", "m", "mm",
249            "n", "nn", "nd", "st", "th", "rw", "nw", "thr", "lk", "nk", "ng", "rd", "rk", "nr",
250            "nth", "rth", "kn", "rl", "gg", "lg", "str", "nb", "lb", "ld", "rm", "sd", "sb",
251        ];
252        let vowel = ["o", "e", "a", "u", "ae"];
253        let end = [
254            "ul", "um", "un", "uth", "und", "ur", "an", "a", "ar", "a", "amar", "amur", "ath",
255            "or", "on", "oth", "omor", "omur", "omar", "ador", "odor", "en", "end", "eth", "amon",
256            "edur", "aden", "oden", "alas", "elas", "alath", "aloth", "eloth", "eres", "ond",
257            "ondor", "undor", "andor", "od", "ed", "amad", "ud", "amud", "ulud", "alud", "allen",
258            "alad", "and", "an", "as", "es",
259        ];
260        self.generate_custom_from_parts(&start, &middle, &vowel, &end)
261    }
262
263    pub fn generate_snowland_engl(&mut self) -> String {
264        let start = [
265            "white", "frost", "ever", "pale", "hoar", "cold", "chill", "shiver", "bitter",
266            "glimmer", "winter", "algor", "grey", "ghost", "pearl", "pallid", "spectre", "spirit",
267            "crystal", "shimmer", "silver", "grizzle", "quiet", "still", "wild", "blind", "silent",
268            "lost", "dire", "somber", "sleet", "silent", "sharp", "somber", "sleet", "sharp",
269            "rime", "ice",
270        ];
271        let end = [
272            "wood", "veil", "shroud", "fang", "horn", "bite", "more", "howl", "heart", "song",
273            "scream", "draft", "path", "wind", "breeze", "wail", "growl", "bellow", "pine", "roam",
274            "rest", "shade", "fall", "fir", "grasp", "grip", "gale", "hunt", "run", "shadow",
275            "hill", "shard", "blood", "wish", "will", "walk", "wander", "wake", "storm", "blade",
276            "hold", "reach", "maw",
277        ];
278        self.generate_engl_from_parts(&start, &end)
279    }
280
281    pub fn generate_snowland_custom(&mut self) -> String {
282        let start = [
283            "b", "d", "f", "g", "h", "k", "l", "m", "n", "s", "t", "w", "br", "dr", "gr", "gh",
284            "kh", "kr", "st", "str", "th", "tr", "ar", "ark", "adr", "ath", "an", "el", "elb",
285            "eldr", "estr", "ostr", "ond", "ondr", "ul", "uld", "eld", "eldr",
286        ];
287        let middle = [
288            "br", "d", "dr", "dn", "dm", "fr", "g", "gr", "gl", "k", "kr", "l", "ll", "m", "mm",
289            "n", "nn", "nd", "st", "th", "rw", "nw", "thr", "lk", "nk", "ng", "rd", "rk", "nr",
290            "nth", "rth", "kn", "rl", "gg", "lg", "str", "nb", "lb", "ld", "rm", "sd", "sb",
291        ];
292        let vowel = ["o", "e", "a", "u", "ae"];
293        let end = [
294            "ul", "um", "un", "uth", "und", "ur", "an", "a", "ar", "a", "amar", "amur", "ath",
295            "or", "on", "oth", "omor", "omur", "omar", "ador", "odor", "en", "end", "eth", "amon",
296            "edur", "aden", "oden", "alas", "elas", "alath", "aloth", "eloth", "eres", "ond",
297            "ondor", "undor", "andor", "od", "ed", "amad", "ud", "amud", "ulud", "alud", "allen",
298            "alad", "and", "an", "as", "es",
299        ];
300        self.generate_custom_from_parts(&start, &middle, &vowel, &end)
301    }
302
303    pub fn generate_desert_engl(&mut self) -> String {
304        let start = [
305            "dry", "sun", "bright", "death", "dread", "sizzle", "scourge", "dearth", "dust",
306            "gold", "amber", "gleam", "dead", "swelter", "arid", "balm", "parch", "demon",
307            "scorch", "sear", "gold", "simmer", "doom", "torrid", "drake", "devil", "spirit",
308            "soul", "singe", "heat", "torch", "bone", "broil", "dragon", "shrivel", "sorrow",
309        ];
310        let end = [
311            "swarm", "claw", "curse", "quill", "spell", "bite", "thorn", "bane", "grasp", "storm",
312            "flare", "wind", "breeze", "howl", "reach", "flow", "sting", "sting", "fang", "blast",
313            "veil", "scale", "glare", "gaze", "skull", "prickle", "reach", "needle", "void",
314            "rise", "maw", "raze", "mirage", "glow", "wander", "roam", "breath", "shard", "scar",
315            "lurk", "cross", "stone", "flash", "dance", "burn", "blaze", "fury", "wound",
316            "blister", "mark", "waste", "blood", "rock", "grip", "blight",
317        ];
318        self.generate_engl_from_parts(&start, &end)
319    }
320
321    pub fn generate_desert_custom(&mut self) -> String {
322        let start = [
323            "j", "k", "m", "l", "n", "h", "t", "z", "f", "sh", "s", "q", "z", "y", "gh", "r", "ed",
324            "abg", "ab", "al", "b", "d", "alm",
325        ];
326        let middle = [
327            "j", "k", "m", "l", "n", "h", "t", "w", "z", "r", "f", "sh", "s", "q", "z", "y", "gh",
328            "b", "d", "lf", "lsh", "zd", "br", "lb", "mr", "th", "bd", "db", "ks", "ksh", "nb",
329            "st", "my", "kh", "khl", "zr", "thr", "hm", "hk", "yb", "hb", "hd",
330        ];
331        let vowel = ["e", "a", "i", "u", "ai", "ua"];
332        let end = [
333            "ejaz", "adaqas", "ahrain", "emen", "ahduri", "abna", "araq", "akhm", "atafan", "alik",
334            "ajd", "uda", "ara", "asqa", "uda", "uha", "amin", "iman", "anis", "ayma", "almud",
335            "ubal", "ammad", "ammud", "amir", "anaf", "afan", "aila", "amma", "ahra", "akhla",
336            "azraj", "anu", "ouk", "aksum", "awbas", "astar", "anah", "aqah", "aryat", "alasa",
337            "athar", "aubas", "anaf", "amash", "ilmun", "uza", "irim", "izeh", "ifah", "inah",
338        ];
339        self.generate_custom_from_parts(&start, &middle, &vowel, &end)
340    }
341
342    pub fn generate_swamp_engl(&mut self) -> String {
343        let start = [
344            "green", "moss", "deep", "moon", "haze", "drizzle", "mizzle", "rain", "bracken",
345            "hollow", "mist", "fog", "haze", "tear", "mud", "lost", "spirit", "venom", "glum",
346            "murk", "dim", "dusk", "night", "quiet", "dark", "brume", "rot", "drench", "sullen",
347            "still", "gleam", "wild", "blind", "gnarl", "silent", "dead", "rust", "soul", "gloom",
348            "bramble", "briar", "thorn", "earth", "wither", "tangle", "twist", "fear", "slither",
349            "vile",
350        ];
351        let end = [
352            "root", "bark", "vine", "brook", "well", "veil", "mantle", "drop", "fang", "beck",
353            "bough", "vale", "whisper", "shroud", "cloak", "muck", "claw", "wane", "call", "glen",
354            "rest", "shade", "fall", "grasp", "grip", "water", "glare", "swarm", "creek", "crawl",
355            "shadow", "glow", "wood", "wander", "river", "pool", "sting", "shriek", "barb", "silt",
356            "clay", "pond", "gorse", "burr", "blight", "wisp", "scale", "rill",
357        ];
358        self.generate_engl_from_parts(&start, &end)
359    }
360
361    pub fn generate_jungle_engl(&mut self) -> String {
362        let start = [
363            "green", "ever", "briar", "thorn", "deep", "sun", "glare", "tangle", "strangle",
364            "twist", "dim", "dark", "shade", "savage", "lost", "mist", "shadow", "red", "scarlet",
365            "fog", "fern", "quiet", "gleam", "wild", "blind", "swift", "gnarl", "venom", "spirit",
366            "dread", "wonder", "drizzle", "coil", "snarl", "skein", "snare", "murk", "moss",
367            "slither",
368        ];
369        let end = [
370            "root", "bark", "vine", "leaf", "more", "bole", "heart", "song", "climb", "talon",
371            "bough", "breeze", "light", "branch", "bloom", "vale", "swarm", "prowl", "fang",
372            "horn", "fall", "bush", "grasp", "grip", "crawl", "run", "sting", "hunt", "pride",
373            "veil", "shroud", "rise", "glow", "will", "wander", "wake", "blossom", "barb", "scale",
374            "claw", "catch", "plume", "dance", "maw", "roar", "howl", "shriek", "reach", "drench",
375            "flower", "snag",
376        ];
377        self.generate_engl_from_parts(&start, &end)
378    }
379
380    pub fn generate_jungle_custom(&mut self) -> String {
381        let start = [
382            "j", "k", "m", "l", "n", "p", "h", "t", "v", "z", "s", "x", "tl", "izt", "qu", "z",
383            "y", "tz", "om", "az", "aztl", "ch", "azt", "aw", "c", "uax", "ax",
384        ];
385        let middle = [
386            "k", "m", "l", "n", "p", "n", "h", "t", "v", "z", "s", "tl", "qu", "z", "y", "tl",
387            "ch", "c", "j", "tz", "lc", "lk", "kt", "cn", "xm", "xp", "mn", "c", "k T", "n Y",
388            "n P", "k P", "k X", "n K", "n H", "h P", "h K", "k J", "k Ch", "n J", "n Ch", "k P",
389            "h J",
390        ];
391        let vowel = ["e", "a", "i", "o", "u", "aa", "ui", "uu", "oa", "ai", "ua"];
392        let end = [
393            "ibalba", "alba", "oztoc", "ictlan", "itlan", "epetl", "opetl", "ocan", "aztlan",
394            "allan", "illan", "atz", "oyoi", "ahau", "azotz", "agual", "acna", "acan", "axtab",
395            "ixtab", "apeku", "ivo", "otec", "oyotl", "oatl", "icue", "aax", "iyalo", "aac",
396            "octli", "ipoca", "aat", "icapan", "irakan", "otzil", "aax", "iyalo", "aac", "octli",
397            "ipoca", "aat", "atec", "aya", "ulkan", "ook", "oox", "akh", "aktun", "iliw", "akal",
398            "ohil", "amna", "ucane", "aize", "itzan", "ontli", "eotl", "olotl",
399        ];
400        self.generate_custom_from_parts(&start, &middle, &vowel, &end)
401    }
402
403    pub fn generate_forest_engl(&mut self) -> String {
404        let start = [
405            "green", "moss", "ever", "briar", "thorn", "oak", "deep", "moon", "star", "sun",
406            "bright", "glare", "fair", "calm", "mistral", "whisper", "clover", "hollow", "spring",
407            "morrow", "dim", "dusk", "dawn", "night", "shimmer", "silver", "gold", "fern", "quiet",
408            "still", "gleam", "wild", "blind", "swift", "gnarl", "flutter", "silent", "honey",
409            "bramble", "rose", "aspen",
410        ];
411        let end = [
412            "root", "bark", "log", "brook", "well", "shire", "leaf", "more", "bole", "heart",
413            "song", "dew", "bough", "path", "wind", "breeze", "light", "branch", "bloom", "vale",
414            "glen", "rest", "shade", "fall", "sward", "shrub", "bush", "grasp", "grip", "gale",
415            "crawl", "run", "shadow", "rise", "glow", "wish", "will", "walk", "wander", "wake",
416            "eye", "blossom", "sprout", "barb",
417        ];
418        self.generate_engl_from_parts(&start, &end)
419    }
420
421    pub fn generate_forest_custom(&mut self) -> String {
422        let start = [
423            "d", "f", "h", "l", "m", "n", "r", "s", "t", "w", "v", "z", "st", "th", "thr", "str",
424            "vr", "wr", "an", "and", "ald", "ath", "as", "all", "amm", "an", "az", "en", "end",
425            "eld", "eldr", "es", "ell", "aldr", "astr", "estr", "on", "ond",
426        ];
427        let middle = [
428            "th", "d", "dr", "sl", "sm", "rw", "rv", "l", "ll", "m", "mm", "n", "nn", "nd", "ndr",
429            "thr", "nth", "ln", "lm", "lz", "nz", "nr", "str", "sth", "ld", "rm", "sd", "rn", "ss",
430            "sn", "lw", "lv", "th", "rw", "nw", "r", "rth", "rz",
431        ];
432        let vowel = ["o", "e", "a", "u", "ae"];
433        let end = [
434            "anir", "enir", "elen", "alen", "ezen", "azen", "yn", "andir", "endir", "ond", "alar",
435            "ales", "eles", "arain", "alain", "anuin", "athuin", "aruin", "yr", "ethuin", "eruin",
436            "athul", "edor", "edes", "edus", "inyr", "eden", "azar", "atiel", "etiel", "etien",
437            "eties", "aties", "aduil", "eduil", "eduin", "aduin", "assil", "iryl", "aryl", "anor",
438            "anes", "en", "es", "ys",
439        ];
440        self.generate_custom_from_parts(&start, &middle, &vowel, &end)
441    }
442
443    pub fn generate_savannah_engl(&mut self) -> String {
444        let start = [
445            "red", "pride", "dry", "copper", "vast", "war", "star", "sun", "bright", "blood",
446            "dawn", "shimmer", "gold", "amber", "gleam", "wild", "rust", "fire", "earth", "spirit",
447            "bronze", "broad", "scorch", "sear", "gold", "rage", "dire", "ghost", "soul",
448            "specter", "scald", "singe", "heat", "torch", "rite", "bone",
449        ];
450        let end = [
451            "dust", "grass", "swarm", "more", "heart", "song", "claw", "fang", "hoof", "foot",
452            "herd", "path", "wind", "breeze", "howl", "sway", "rest", "reach", "flow", "graze",
453            "trail", "sting", "fall", "growl", "mane", "bush", "gale", "run", "field", "glare",
454            "gaze", "wallow", "brew", "rise", "glow", "wade", "wander", "wake", "sky", "roam",
455            "breath", "shard", "scar", "lurk", "hill", "blaze", "fury", "hunt", "prowl", "marl",
456        ];
457        self.generate_engl_from_parts(&start, &end)
458    }
459
460    pub fn generate_savannah_custom(&mut self) -> String {
461        let start = [
462            "b", "d", "nz", "g", "mb", "k", "m", "l", "n", "nt", "ng", "t", "w", "z", "sh", "zw",
463            "gb", "an", "on", "s", "nj", "x", "gb", "mp",
464        ];
465        let middle = [
466            "b", "d", "nz", "g", "mb", "k", "m", "l", "n", "nt", "n", "ng", "t", "w", "z", "qu",
467            "sh", "ngb", "nb", "nd", "np", "gd", "k", "gn", "n", "kt", "nw", "mz", "mp", "md",
468            "kz", "ml", "ns", "j", "y", "nz",
469        ];
470        let vowel = ["e", "a", "i", "o", "u", "ou", "oa", "ai"];
471        let end = [
472            "oko", "apa", "eke", "embe", "okele", "ambi", "oubou", "abwe", "amato", "otho",
473            "iloko", "eloko", "adroa", "ansi", "umba", "ami", "ata", "uluku", "oluku", "ogbo",
474            "odudu", "iwara", "itaka", "anuka", "ukasa", "usisi", "umbe", "anga", "emba", "ambe",
475            "insu", "insi", "igbo", "ebege", "enga", "abali", "engi", "enga", "abali", "anga",
476            "unga", "izazi", "ungulu", "ombe", "ukiti", "izazi", "ombi", "engu", "aberi", "alusi",
477        ];
478        self.generate_custom_from_parts(&start, &middle, &vowel, &end)
479    }
480
481    pub fn generate_taiga_engl(&mut self) -> String {
482        let start = [
483            "green", "blue", "ever", "pale", "needle", "cold", "moon", "star", "chill", "shiver",
484            "bitter", "fair", "calm", "mistral", "whisper", "grey", "hollow", "morrow", "dim",
485            "dusk", "dawn", "night", "shimmer", "silver", "iron", "quill", "grizzle", "quiet",
486            "still", "wild", "blind", "silent", "somber", "sleet", "silent", "sharp", "somber",
487            "sleet", "sharp", "rime", "drizzle", "resin",
488        ];
489        let end = [
490            "root", "bark", "log", "brook", "well", "shire", "more", "bole", "heart", "song",
491            "dew", "bough", "path", "wind", "breeze", "light", "branch", "bloom", "pine", "spruce",
492            "rest", "shade", "fall", "fir", "grasp", "grip", "gale", "hunt", "run", "shadow",
493            "hill", "shadow", "larch", "rise", "bite", "wish", "will", "walk", "wander", "wake",
494            "stone", "howl", "moss",
495        ];
496        self.generate_engl_from_parts(&start, &end)
497    }
498
499    pub fn generate_taiga_custom(&mut self) -> String {
500        let start = [
501            "b", "f", "g", "d", "h", "c", "m", "l", "n", "p", "r", "s", "t", "w", "v", "z", "qu",
502            "br", "bl", "ch", "chr", "dr", "dw", "fr", "fl", "gr", "gw", "pr", "pl", "st", "sl",
503            "str", "sn", "sp", "spr", "sw", "tr", "wr", "ab", "abr", "al", "ald", "as", "ast",
504            "amm", "ach", "adr", "en", "end", "eld", "end", "es", "amr", "on", "ond", "ochr",
505            "orn", "ost", "ord",
506        ];
507        let middle = [
508            "b", "g", "d", "c", "m", "l", "n", "p", "r", "s", "t", "v", "br", "ch", "chr", "dr",
509            "gr", "pr", "st", "sl", "sn", "sp", "sw", "tr", "ghr", "mm", "n", "nn", "nd", "ln",
510            "lm", "nr", "r", "rz", "lz", "ld", "rm", "sd", "rn", "ss", "sm", "rv", "lv",
511        ];
512        let vowel = ["e", "a", "i", "o", "ea", "au"];
513        let end = [
514            "on", "oc", "ic", "oric", "aric", "eric", "elten", "alend", "alan", "aven", "elen",
515            "estin", "ostin", "alic", "elic", "alon", "elon", "arac", "erac", "eden", "elen",
516            "owan", "owen", "iel", "ien", "ing", "olm", "ulm", "ilm", "alm", "elm", "oria", "aria",
517            "eria", "elis", "alis", "amor", "emor", "en", "ard", "erd", "ord", "org", "enara",
518            "aran",
519        ];
520        self.generate_custom_from_parts(&start, &middle, &vowel, &end)
521    }
522
523    pub fn generate_mine(&mut self) -> String {
524        let start = [
525            "d", "f", "h", "l", "m", "n", "r", "s", "t", "w", "v", "z", "st", "th", "thr", "str",
526            "vr", "wr", "an", "and", "ald", "ath", "as", "all", "amm", "an", "az", "en", "end",
527            "eld", "eldr", "es", "ell", "aldr", "astr", "estr", "on", "ond",
528        ];
529        let middle = [
530            "th", "d", "dr", "sl", "sm", "rw", "rv", "l", "ll", "m", "mm", "n", "nn", "nd", "ndr",
531            "thr", "nth", "ln", "lm", "lz", "nz", "nr", "str", "sth", "ld", "rm", "sd", "rn", "ss",
532            "sn", "lw", "lv", "th", "rw", "nw", "r", "rth", "rz",
533        ];
534        let vowel = ["o", "e", "a", "u", "ae"];
535        let end = [
536            "anir", "enir", "elen", "alen", "ezen", "azen", "yn", "andir", "endir", "ond", "alar",
537            "ales", "eles", "arain", "alain", "anuin", "athuin", "aruin", "yr", "ethuin", "eruin",
538            "athul", "edor", "edes", "edus", "inyr", "eden", "azar", "atiel", "etiel", "etien",
539            "eties", "aties", "aduil", "eduil", "eduin", "aduin", "assil", "iryl", "aryl", "anor",
540            "anes", "en", "es", "ys",
541        ];
542        self.generate_custom_from_parts(&start, &middle, &vowel, &end)
543    }
544
545    // themes & sites
546    fn generate_theme_from_parts(
547        &mut self,
548        start: &[&str],
549        middle: &[&str],
550        vowel: &[&str],
551        end: &[&str],
552    ) -> String {
553        let mut name = String::new();
554        name += start.choose(self.rng).unwrap();
555        for _ in 0..self.approx_syllables.saturating_sub(2) {
556            if !vowel.is_empty() {
557                name += vowel.choose(self.rng).unwrap()
558            };
559            if !middle.is_empty() {
560                name += middle.choose(self.rng).unwrap();
561            }
562        }
563        name += end.choose(self.rng).unwrap();
564
565        name.chars()
566            .enumerate()
567            .map(|(i, c)| if i == 0 { c.to_ascii_uppercase() } else { c })
568            .collect()
569    }
570
571    // towns
572    pub fn generate_town(mut self) -> String {
573        let start = [
574            "b", "f", "g", "d", "h", "c", "m", "l", "n", "p", "r", "s", "t", "w", "v", "z", "qu",
575            "br", "bl", "ch", "chr", "dr", "dw", "fr", "fl", "gr", "gw", "pr", "pl", "st", "sl",
576            "str", "sn", "sp", "spr", "sw", "tr", "wr", "ab", "abr", "al", "ald", "as", "ast",
577            "amm", "ach", "adr", "en", "end", "eld", "end", "es", "amr", "on", "ond", "ochr",
578            "orn", "ost", "ord",
579        ];
580        let middle = [
581            "b", "g", "d", "c", "m", "l", "n", "p", "r", "s", "t", "v", "br", "ch", "chr", "dr",
582            "gr", "pr", "st", "sl", "sn", "sp", "sw", "tr", "mm", "n", "nn", "nd", "ln", "lm",
583            "nr", "r", "rz", "lz", "ld", "rm", "sd", "rn", "ss", "sm", "rv", "lv",
584        ];
585        let vowel = ["e", "a", "i", "o", "ea", "au"];
586        let end = [
587            "on", "aton", "enton", "eau", "eaux", "erg", "enberg", "enburg", "oc", "ic", "oric",
588            "aric", "eric", "ach", "aven", "elen", "andam", "endam", "estin", "ostin", "alic",
589            "elic", "alon", "elon", "arac", "erac", "eden", "elen", "owan", "owen", "iel", "ien",
590            "alton", "ing", "iling", "aling", "olm", "ulm", "ough", "ilm", "alm", "elm", "eim",
591            "oria", "aria", "eria", "elis", "alis", "amor", "emor", "en", "edge", "arr", "ard",
592            "erd", "ord", "emberg", "emburg", "org", "alton", "agrad", "ograd", "inton", "imore",
593            "ale",
594        ];
595        self.generate_theme_from_parts(&start, &middle, &vowel, &end)
596    }
597
598    // greek-latin inspired location names for danari
599    pub fn generate_danari(mut self) -> String {
600        let start = [
601            "d", "ph", "r", "st", "t", "s", "p", "th", "br", "tr", "m", "k", "cr", "phr", "dr",
602            "pl", "ch", "l", "ap", "akr", "ak", "ar", "ath", "asp", "al", "aph", "aphr", "oph",
603            "or", "ok", "on", "od", "oth", "om", "ep", "er", "em", "eph", "eth", "yps", "yph",
604            "ach", "amph", "yp", "ik", "is", "iph", "ith", "pr", "as", "asph", "ps", "b", "n", "z",
605            "x", "kr", "kt", "cht", "chr", "thr", "dr", "pr", "pl", "h", "in", "g", "sph", "kr",
606            "tr", "str", "rk", "st", "n", "r", "ph", "phr", "ch", "x", "d", "l", "kt", "pr", "ll",
607            "pp", "ss", "th", "mm", "s", "t", "g", "mn", "rg", "b", "p", "ps", "kl", "dr", "mp",
608            "sp", "cht", "lph",
609        ];
610        let middle = [
611            "d", "ph", "r", "st", "t", "s", "p", "th", "br", "tr", "m", "k", "cr", "phr", "dr",
612            "pl", "ch", "l", "ap", "akr", "ak", "ar", "ath", "asp", "al", "aph", "aphr", "oph",
613            "or", "ok", "on", "od", "oth", "om", "ep", "er", "em", "eph", "eth", "yps", "yph",
614            "ach", "amph", "yp", "ik", "is", "iph", "ith", "pr", "as", "ps", "b", "n", "z", "x",
615            "kr", "kt", "cht", "chr", "thr", "dr", "pr", "pl", "h", "in", "g", "sph",
616        ];
617        let vowel = [
618            "o", "e", "a", "i", "y", "eo", "ae", "ea", "oi", "io", "ia", "aeo",
619        ];
620        let end = [
621            "ilia", "ilios", "os", "oros", "ophos", "elos", "ethos", "athos", "yros", "a", "ares",
622            "aros", "olis", "ophis", "era", "ara", "ora", "antis", "entis", "ead", "aeon", "on",
623            "eon", "oron", "ena", "is", "as", "eris", "eras", "inis", "aros", "in", "orea", "isis",
624            "okles", "akles", "ilion", "anos", "akos", "akon", "enon", "es", "aros", "ikron",
625            "orea", "area", "ilon", "ilos", "aelos", "yron", "iron", "adalos", "anon", "ix", "ox",
626            "alea", "atheas", "eas", "eos", "yros", "ophon",
627        ];
628        self.generate_theme_from_parts(&start, &middle, &vowel, &end)
629    }
630
631    // primitive-orcish inspired location names for gnarling fortification
632    pub fn generate_gnarling(mut self) -> String {
633        let start = ["gn", "kr", "k", "r", "t", "kn", "tr", "kt", "gr"];
634        let middle = [
635            "t", "tt", "k", "kk", "r", "r", "rl", "lm", "km", "tm", "kn", "kr", "tr", "nk", "gn",
636            "kl", "kt", "lt", "arln", "ln", "k't", "k'n", "k'm", "g'm", "l'k", "t'n", "r'k",
637            "n'kr", "k R", "t K", "rl Gn", "rl K", "k Gn", "t M", "t N", "r K", "r N", "k M",
638            "k T", "rl T", "t Kn", "r Kn",
639        ];
640        let vowel = ["e", "a", "i", "o"];
641        let end = [
642            "arak", "orok", "arok", "orak", "attak", "akarl", "okarl", "atok", "anak", "etak",
643            "orek", "arek", "atik", "arik", "etik", "arlak", "arlek", "otek", "almek", "arlnok",
644            "arlnak", "okorl", "eknok", "ottok", "erlek", "akkat", "okkar", "attor", "ittor",
645            "aktor", "okomor", "imor", "inork", "inor", "amakkor", "ikkor", "amarl", "omarl",
646            "ikkarl", "okkarl", "emekk", "akatak", "okatak",
647        ];
648        self.generate_theme_from_parts(&start, &middle, &vowel, &end)
649    }
650
651    // arabic inspired location names for clifftown and desertcity
652    pub fn generate_arabic(mut self) -> String {
653        let start = [
654            "zor", "el", "mas", "yaz", "ra", "boh", "mah", "ah", "lam", "mak", "mol", "wa", "bisk",
655            "moj", "bis", "ay", "sha", "rez", "bakh", "ta", "je", "ki", "mos", "asj", "meh",
656        ];
657        let middle = [
658            "d", "ph", "r", "st", "t", "s", "p", "th", "br", "tr", "m", "k", "cr", "dr", "pl",
659            "ch", "l", "ap", "akr", "ak", "ar", "ath", "asp", "al", "aph", "aphr", "oph", "or",
660            "ok", "on", "od", "om", "ep", "er", "em", "eph", "eth", "yph", "ach", "yp", "ik", "is",
661            "iph", "ith", "pr", "as", "asph", "ps", "b", "n", "z", "x", "kr", "kt", "cht", "chr",
662            "thr", "dr", "pr", "pl", "h", "in", "g",
663        ];
664        let vowel = ["o", "e", "a", "i", "y", "ei", "ai", "io"];
665        let end = [
666            "wad", "tab", "med", "mad", "afa", "man", "oubi", "hir", "baz", "yen", "kh", "ah",
667            "dek", "fir", "ish", "rad", "iri", "am", "if", "van", "rik", "kat", "akan", "ikan",
668            "illah", "ulus", "fard",
669        ];
670        self.generate_theme_from_parts(&start, &middle, &vowel, &end)
671    }
672
673    // japanese inspired location names for haniwa
674    pub fn generate_haniwa(&mut self) -> String {
675        let start = [
676            "a", "e", "o", "i", "u", "ka", "ki", "ku", "ke", "ko", "sa", "shi", "su", "se", "so",
677            "ta", "chi", "tsu", "te", "to", "na", "ne", "no", "ni", "nu", "ha", "hi", "fu", "he",
678            "ho", "ma", "mi", "mu", "me", "mo", "ra", "ri", "ru", "re", "ro", "wa", "ya", "yu",
679            "yo", "ga", "gi", "gu", "ge", "go", "za", "ji", "zu", "ze", "zo", "da", "de", "do",
680            "jo", "ju", "ja", "sho", "shu", "sha", "kya", "kyu", "kyo", "gya", "gyu", "gyo", "ba",
681            "bi", "bu", "be", "bo", "hya", "hyo", "ryu", "ryo",
682        ];
683        let vowel = [];
684        let middle = [
685            "a", "e", "o", "i", "u", "ka", "ki", "ku", "ke", "ko", "sa", "shi", "su", "se", "so",
686            "ta", "chi", "tsu", "te", "to", "na", "ne", "no", "ni", "nu", "ha", "hi", "fu", "he",
687            "ho", "ma", "mi", "mu", "me", "mo", "ra", "ri", "ru", "re", "ro", "wa", "ya", "yu",
688            "yo", "ga", "gi", "gu", "ge", "go", "za", "ji", "zu", "ze", "zo", "da", "de", "do",
689            "n", "jo", "ju", "ja", "sho", "shu", "sha", "pa", "pi", "pu", "pe", "po",
690        ];
691        let end = [
692            "maru", "mura", "machi", "yama", "da", "do", "don", "den", "fun", "taro", "dachi",
693            "mon", "ta", "yo", "chi", "poko", "gami", "ji", "guchi", "gachi", "goku", "gasha",
694            "do", "to", "saka", "zaru", "nami", "numa", "kichi", "juro", "jo", "keshi", "gara",
695            "goro", "tatsu", "tetsu", "niwa", "mo", "no", "nojo", "hachi", "ichi", "san", "saki",
696            "shima", "tsuchi", "gumo", "toko", "zuchi", "shi", "shiro", "jiro", "sho", "shu",
697            "tsu", "hara", "hama", "naga", "kan", "ken", "hage", "tai", "gyo", "kyo", "zo", "gu",
698            "zaki", "dai", "moto", "me", "saki", "kami", "gata", "date", "kawa", "gawa", "garu",
699            "tami", "yoro", "hiro", "ki", "kai", "gato", "mizu", "gin", "gon", "ppu", "matsu",
700            "yake", "koku", "miya", "zawa", "sen", "shiro", "kuro", "ppo", "kata", "riku", "sha",
701            "ishi", "yoko", "su", "gi", "ko", "hagi", "wa",
702        ];
703        self.generate_theme_from_parts(&start, &middle, &vowel, &end)
704    }
705
706    // chinese inspired location names for terracotta ruins
707    pub fn generate_terracotta(&mut self) -> String {
708        let start = [
709            "wang", "li", "zhang", "liu", "chen", "yang", "gong", "zhao", "wu", "zhou", "ming",
710            "jin", "xiao", "feng", "ho", "xiang", "yuan", "yu", "chien", "xi", "qin", "dao", "bao",
711            "ping", "qu", "yan", "deng", "ku", "ko", "la", "ge", "fu", "gao", "yong", "wo", "qi",
712            "mo", "gong", "shi", "xing", "xian", "biao", "kai", "bei", "ga", "zhou", "liu", "ba",
713            "fei", "tui", "de", "teng", "shou", "xiong", "diao", "lei", "shan", "shin", "pin",
714            "gin", "gen", "huen", "san", "hong", "long", "kon", "jing", "meng", "mei",
715        ];
716        let middle = [];
717        let vowel = [];
718        let end = [
719            "tian", "shi", "zhong", "xie", "biao", "neng", "zuo", "ze", "zhi", "hao", "pao",
720            "liang", "yong", "chou", "zhou", "peng", "yang", "huang", "bo", "yao", "fu", "xia",
721            "chen", "ling", "jia", "xu", "gou", "ya", "lang", "he", "ho", "nan", "hua", "xue",
722            "ji", "jian", "jiu", "xi", "ling", "dan", "dian", "shin", "gao", "yi", "zuo", "san",
723            "jie", "hua", "jin", "zhi", "zhe", "sing", "zai", "hun", "fen", "nen", "huan", "bian",
724            "cha", "wu", "wei", "jiao", "hu", "he", "bao", "bi",
725        ];
726        self.generate_theme_from_parts(&start, &middle, &vowel, &end)
727    }
728
729    // inuit inspired location names for adlet stronghold
730    pub fn generate_adlet(mut self) -> String {
731        let start = [
732            "p", "k", "h", "q", "s", "t", "y", "n", "m", "an", "ap", "ang", "am", "at", "arn",
733            "ats", "av", "aj", "in", "ikk", "ig", "im", "iq", "uak", "ual", "uj", "uk", "um", "ul",
734            "unn", "ut", "adl",
735        ];
736        let middle = [
737            "m", "k", "n", "ks", "gl", "ll", "g", "l", "t", "nn", "kt", "tt", "rj", "rl", "ts",
738            "qt", "ng", "gg", "ss", "kk",
739        ];
740        let vowel = ["a", "i", "u", "ia", "ui", "ua", "aa", "uu"];
741        let end = [
742            "uktu", "akut", "ukut", "aakut", "uvit", "avit", "ivit", "anuq", "attiq", "aqtuq",
743            "akka", "ikka", "ipit", "ugit", "agit", "uvusi", "avusi", "ivusi", "aali", "uli",
744            "aluk", "uluk", "alu", "uipit", "unga", "asuna", "uulik", "ivun", "avun", "adlet",
745            "adlit", "anit", "unit", "aluit", "angit", "arluut", "uluut", "araaq", "anait",
746            "uqsuit", "aruq", "ualik", "auti", "aliit", "igiit", "aana", "akkuq", "amali", "igit",
747            "irniq", "aasi", "ashi", "asik", "ukkit", "ajuq", "anook", "ivak", "attiq", "iksik",
748            "aaluk", "anik", "usuuq",
749        ];
750        self.generate_theme_from_parts(&start, &middle, &vowel, &end)
751    }
752
753    // romania inspired location names for vampire castles
754    pub fn generate_vampire(mut self) -> String {
755        let start = [
756            "al", "ban", "bom", "br", "buc", "cl", "con", "cor", "cr", "dr", "ias", "or", "p",
757            "pit", "pl", "ram", "val", "res", "rom", "sat", "mar", "suc", "tar", "mur", "tim",
758            "vas", "zal",
759        ];
760        let middle = [
761            "d", "r", "st", "t", "s", "p", "br", "tr", "m", "k", "cr", "dr", "pl", "ch", "l", "ap",
762            "ak", "ar", "al", "od", "om", "ep", "er", "em",
763        ];
764        let vowel = ["o", "e", "a", "i", "ea", "au", "oa", "ia"];
765        let end = [
766            "ulia", "icau", "are", "eni", "usov", "uj", "ita", "asi", "edea", "etra", "ira",
767            "asti", "cu", "cea", "ita", "utu", "ire", "iva", "igu", "ares", "ara", "elui", "ilau",
768        ];
769        self.generate_theme_from_parts(&start, &middle, &vowel, &end)
770    }
771
772    pub fn generate_tavern(&mut self) -> String {
773        let adjectives = [
774            "Crazy",
775            "Big",
776            "Tiny",
777            "Slimy",
778            "Warm",
779            "Rigid",
780            "Soft",
781            "Wet",
782            "Humid",
783            "Smelly",
784            "Hidden",
785            "Smart",
786            "Fragile",
787            "Strong",
788            "Weak",
789            "Happy",
790            "Sad",
791            "Glad",
792            "Scared",
793            "Embarrassed",
794            "Goofy",
795            "Spicy",
796            "Salty",
797            "Peaceful",
798            "Awful",
799            "Sweet",
800            "Colossal",
801            "Puzzled",
802            "Cheap",
803            "Valuable",
804            "Rich",
805            "Obnoxious",
806            "Puzzled",
807            "Snoring",
808            "Fast",
809            "Quick",
810            "Magical",
811            "Violet",
812            "Red",
813            "Blue",
814            "Green",
815            "Yellow",
816            "Golden",
817            "Shiny",
818            "Tired",
819            "Twin",
820            "Incompetent",
821            "Light",
822            "Dark",
823            "Glorious",
824            "Best",
825            "Free",
826            "Odd",
827            "Juicy",
828            "Shaking",
829            "Tall",
830            "Short",
831            "Precious",
832            "Regular",
833            "Slow",
834            "Anxious",
835            "Naive",
836            "Sore",
837            "Next",
838            "Silver",
839            "Secret",
840            "Honorable",
841            "Rapid",
842            "Sleepy",
843            "Lying",
844            "Zesty",
845            "Fancy",
846            "Stylish",
847            "Thirsty",
848            "Dry",
849            "Dancing",
850            "Singing",
851            "Drunken",
852        ];
853        let tavern_synonyms = ["Tavern", "Bar", "Pub"];
854        let subjectives = [
855            "Apple",
856            "Pumpkin",
857            "Cucumber",
858            "Squash",
859            "Demons",
860            "Mango",
861            "Coconut",
862            "Cats",
863            "Hill",
864            "Mountain",
865            "Squirrel",
866            "Rabbit",
867            "Moose",
868            "Driggle",
869            "Iron",
870            "Velorite",
871            "Plate",
872            "Eagle",
873            "Birds",
874            "Drumstick",
875            "Dog",
876            "Tiger",
877            "Knight",
878            "Leader",
879            "Huntress",
880            "Hunter",
881            "Dwarf",
882            "Toad",
883            "Clams",
884            "Bell",
885            "Avocado",
886            "Egg",
887            "Spade",
888            "Stream",
889            "Cabbage",
890            "Tomato",
891            "Rapier",
892            "Katana",
893            "Whisper",
894            "Hammer",
895            "Axe",
896            "Sword",
897            "Saurok",
898            "Danari",
899            "Elf",
900            "Human",
901            "Draugr",
902            "Orc",
903            "Pie",
904            "Stick",
905            "Rope",
906            "Knife",
907            "Shield",
908            "Bow",
909            "Spear",
910            "Staff",
911            "Crow",
912            "Crown",
913            "Parrot",
914            "Parrots",
915            "Pelican",
916            "Whale",
917            "Cube",
918            "Minotaur",
919            "Oni",
920            "Monster",
921        ];
922        let kind = self.rng.gen_range(0..10);
923        let mut choose = |slice: &[&'static str]| *slice.choose(self.rng).unwrap();
924        match kind {
925            0 => format!("The {} {}", choose(&adjectives), choose(&tavern_synonyms)),
926            1..=7 => format!("The {} {}", choose(&adjectives), choose(&subjectives)),
927            _ => format!(
928                "The {} {} {}",
929                choose(&adjectives),
930                choose(&subjectives),
931                choose(&tavern_synonyms)
932            ),
933        }
934    }
935}