1use super::{Age, Gender, Generate, GenerateSimple};
2use rand::prelude::*;
3
4pub struct Ethnicity;
5
6impl Ethnicity {
7 const SYLLABLE_FNAME_COUNT_CHILD: &'static [(u8, usize)] = &[(2, 20), (3, 1)];
8}
9
10impl GenerateSimple for Ethnicity {
11 fn syllable_fname_count_f() -> &'static [(u8, usize)] {
12 &[(2, 194), (3, 119), (4, 14), (5, 2)]
13 }
14
15 #[rustfmt::skip]
16 fn syllable_fname_first_f() -> &'static [(&'static str, usize)] {
17 &[
18 ("Ha", 10), ("Ta", 8), ("Sha", 5), ("Me", 4), ("La", 4), ("Da", 4), ("Ki", 4),
19 ("Ja", 4), ("Re", 4), ("Nu", 4), ("Ka", 4), ("Ca", 3), ("Tu", 3), ("Na", 3), ("De", 3),
20 ("My", 3), ("Mi", 3), ("Li", 3), ("Va", 3), ("Ama", 2), ("Za", 2), ("Xa", 2),
21 ("Tha", 2), ("Yas", 2), ("Du", 2), ("Zin", 2), ("Sa", 2), ("Aza", 2), ("Aya", 2),
22 ("Mal", 2), ("Si", 2), ("Aun", 2), ("Ky", 2), ("Ly", 2), ("Erel", 2), ("Ela", 2),
23 ("Fe", 2), ("Le", 2), ("Kes", 2), ("Mae", 2), ("Sin", 2), ("Ce", 1), ("Cas", 1),
24 ("Asba", 1), ("Car", 1), ("Arian", 1), ("Bry", 1), ("Bres", 1), ("Aria", 1),
25 ("Edher", 1),
26 ]
27 }
28
29 #[rustfmt::skip]
30 fn syllable_fname_last_f() -> &'static [(&'static str, usize)] {
31 &[
32 ("ra", 41), ("na", 23), ("la", 14), ("dra", 6), ("tha", 6), ("da", 6), ("sa", 5),
33 ("ma", 5), ("tra", 4), ("lia", 4), ("ri", 4), ("a", 4), ("rae", 4), ("ria", 4),
34 ("via", 3), ("va", 3), ("ril", 3), ("riel", 3), ("lene", 2), ("ka", 2), ("ta", 2),
35 ("za", 2), ("xa", 2), ("sin", 2), ("rell", 2), ("tel", 2), ("sha", 2), ("sis", 2),
36 ("rien", 2), ("rie", 2), ("ther", 2), ("rene", 2), ("fa", 2), ("dyl", 2), ("ni", 2),
37 ("mi", 2), ("cia", 2), ("kal", 1), ("kah", 1), ("dria", 1), ("jin", 1), ("dar", 1),
38 ("heart", 1), ("ha", 1), ("dle", 1), ("light", 1), ("gwais", 1), ("liath", 1),
39 ("liane", 1), ("ghtal", 1),
40 ]
41 }
42
43 fn syllable_fname_count_m() -> &'static [(u8, usize)] {
44 &[(2, 375), (3, 104), (4, 7), (5, 2)]
45 }
46
47 #[rustfmt::skip]
48 fn syllable_fname_first_m() -> &'static [(&'static str, usize)] {
49 &[
50 ("Ta", 7), ("Ma", 6), ("Ce", 6), ("Ka", 6), ("Da", 6), ("Ha", 5), ("Me", 5), ("Ra", 4),
51 ("Del", 4), ("Te", 4), ("Jo", 4), ("To", 3), ("Be", 3), ("Ky", 3), ("Jan", 3),
52 ("Ga", 3), ("Kha", 3), ("Na", 3), ("De", 3), ("Har", 3), ("Ke", 3), ("Ty", 3),
53 ("Tan", 2), ("Si", 2), ("So", 2), ("Pae", 2), ("Ny", 2), ("Myr", 2), ("Ara", 2),
54 ("Dar", 2), ("Mi", 2), ("Ri", 2), ("The", 2), ("Ki", 2), ("Kes", 2), ("Jar", 2),
55 ("Ili", 2), ("Ali", 2), ("Ja", 2), ("Mal", 2), ("Gar", 2), ("Ca", 2), ("Fer", 2),
56 ("Hal", 2), ("Ea", 2), ("Brin", 2), ("Elor", 2), ("Aa", 2), ("My", 2), ("Far", 2),
57 ]
58 }
59
60 #[rustfmt::skip]
61 fn syllable_fname_last_m() -> &'static [(&'static str, usize)] {
62 &[
63 ("ran", 9), ("dar", 7), ("ril", 6), ("lar", 6), ("rian", 5), ("lis", 5), ("lin", 5),
64 ("rin", 5), ("lan", 4), ("gar", 4), ("tar", 4), ("sin", 4), ("nar", 4), ("din", 4),
65 ("rom", 3), ("ro", 3), ("nell", 3), ("ras", 3), ("man", 3), ("fein", 3), ("dor", 3),
66 ("dan", 3), ("rath", 3), ("ten", 3), ("ros", 2), ("rol", 2), ("ryl", 2), ("rion", 2),
67 ("ron", 2), ("dis", 2), ("rith", 2), ("rien", 2), ("rel", 2), ("rim", 2), ("ryn", 2),
68 ("ral", 2), ("nil", 2), ("mir", 2), ("mar", 2), ("mon", 2), ("drach", 2), ("mi", 2),
69 ("dorr", 2), ("lid", 2), ("phys", 2), ("rak", 2), ("lor", 2), ("don", 2), ("gan", 2),
70 ("har", 2),
71 ]
72 }
73
74 fn syllable_fname_count() -> &'static [(u8, usize)] {
75 &[(2, 583), (3, 232), (4, 23), (5, 4)]
76 }
77
78 #[rustfmt::skip]
79 fn syllable_fname_first() -> &'static [(&'static str, usize)] {
80 &[
81 ("Ta", 17), ("Ha", 16), ("Da", 10), ("Ka", 10), ("Me", 9), ("Ma", 7), ("Ce", 7),
82 ("Re", 6), ("Ca", 6), ("De", 6), ("Ja", 6), ("Ki", 6), ("Sha", 6), ("Na", 6),
83 ("Nu", 5), ("Va", 5), ("Mi", 5), ("Del", 5), ("My", 5), ("Te", 5), ("Ky", 5),
84 ("Li", 4), ("La", 4), ("Ke", 4), ("Mal", 4), ("Ra", 4), ("Si", 4), ("Jo", 4),
85 ("Kes", 4), ("Xa", 4), ("So", 4), ("Ga", 4), ("Ara", 3), ("Har", 3), ("Ty", 3),
86 ("Fe", 3), ("Za", 3), ("Ny", 3), ("Be", 3), ("Ela", 3), ("Ali", 3), ("Tu", 3),
87 ("Mae", 3), ("Du", 3), ("Sa", 3), ("Ly", 3), ("Hal", 3), ("Dar", 3), ("Mar", 3),
88 ("To", 3),
89 ]
90 }
91
92 #[rustfmt::skip]
93 fn syllable_fname_last() -> &'static [(&'static str, usize)] {
94 &[
95 ("ra", 43), ("na", 24), ("la", 16), ("dar", 9), ("ran", 9), ("ril", 9), ("tha", 8),
96 ("lar", 7), ("da", 7), ("ri", 6), ("dra", 6), ("sa", 6), ("sin", 6), ("ma", 6),
97 ("lis", 6), ("tar", 5), ("rae", 5), ("rin", 5), ("ria", 5), ("lin", 5), ("rian", 5),
98 ("tra", 5), ("lan", 4), ("lia", 4), ("nar", 4), ("a", 4), ("gar", 4), ("rien", 4),
99 ("din", 4), ("mi", 4), ("rak", 3), ("ryn", 3), ("dyl", 3), ("ro", 3), ("li", 3),
100 ("ten", 3), ("ni", 3), ("dor", 3), ("thir", 3), ("via", 3), ("va", 3), ("dan", 3),
101 ("rith", 3), ("rom", 3), ("dis", 3), ("sha", 3), ("nell", 3), ("ras", 3), ("ryth", 3),
102 ("man", 3),
103 ]
104 }
105
106 #[rustfmt::skip]
107 fn syllable_fname_middle() -> &'static [(&'static str, usize)] {
108 &[
109 ("la", 17), ("li", 12), ("ri", 9), ("ra", 8), ("na", 7), ("re", 6), ("tha", 6),
110 ("lan", 6), ("da", 6), ("va", 5), ("de", 5), ("le", 5), ("lae", 5), ("ma", 4),
111 ("sa", 4), ("lu", 3), ("te", 3), ("rin", 3), ("vi", 3), ("ha", 3), ("rae", 3),
112 ("ryn", 3), ("ve", 3), ("ry", 2), ("ram", 2), ("lag", 2), ("mi", 2), ("laa", 2),
113 ("ka", 2), ("than", 2), ("ria", 2), ("thar", 2), ("lyn", 2), ("fe", 2), ("ver", 2),
114 ("sha", 2), ("fa", 2), ("gar", 2), ("lei", 2), ("a", 2), ("do", 2), ("ca", 2),
115 ("ro", 2), ("ni", 2), ("mal", 2), ("se", 2), ("di", 2), ("ran", 2), ("thoe", 1),
116 ("via", 1),
117 ]
118 }
119
120 fn syllable_lname_count() -> &'static [(u8, usize)] {
121 &[(2, 348), (3, 225), (4, 17)]
122 }
123
124 #[rustfmt::skip]
125 fn syllable_lname_first() -> &'static [(&'static str, usize)] {
126 &[
127 ("al-", 0), ("Sil", 9), ("Moon", 9), ("Du", 8), ("Sta", 7), ("Iri", 7), ("Ta", 6),
128 ("Ca", 6), ("Star", 6), ("Ma", 5), ("Miz", 5), ("Ha", 5), ("Eva", 5), ("Hal", 5),
129 ("Me", 5), ("Dus", 5), ("Ilda", 5), ("Win", 4), ("Wind", 4), ("Gol", 4), ("Hawk", 4),
130 ("Ae", 4), ("Alas", 4), ("Sym", 4), ("Snow", 4), ("Zo", 3), ("Le", 3), ("Van", 3),
131 ("Ko", 3), ("Le'", 3), ("T'", 3), ("Sun", 3), ("Black", 3), ("Tlab", 3), ("Shin", 3),
132 ("Se", 3), ("Sha", 3), ("H'", 3), ("Oblod", 3), ("Green", 3), ("Ri", 3), ("Far", 3),
133 ("Fire", 3), ("Ni", 3), ("Flo", 3), ("Mi", 3), ("Night", 3), ("Lu", 2), ("Bright", 2),
134 ("Kha", 2),
135 ]
136 }
137
138 #[rustfmt::skip]
139 fn syllable_lname_middle() -> &'static [(&'static str, usize)] {
140 &[
141 ("ver", 11), ("la", 8), ("ro", 8), ("na", 7), ("ra", 7), ("wa", 5), ("Ka", 5),
142 ("den", 4), ("mas", 4), ("ter", 4), ("me", 4), ("trar", 3), ("ta", 3), ("ti", 3),
143 ("ryn", 3), ("ryv", 3), ("ri", 3), ("rian", 3), ("Quel", 3), ("laud", 3), ("ma", 3),
144 ("wal", 3), ("va", 2), ("a", 2), ("Ta", 2), ("sar", 2), ("le", 2), ("Bran", 2),
145 ("Sa", 2), ("ven", 2), ("si", 2), ("lar", 2), ("lan", 2), ("ree", 2), ("nor'", 2),
146 ("blos", 2), ("dra", 2), ("Na", 2), ("mer", 2), ("mel", 2), ("ni", 2), ("re", 2),
147 ("ing", 2), ("ar", 2), ("do", 2), ("man", 2), ("no", 2), ("sa", 2), ("sad", 2),
148 ("win", 2),
149 ]
150 }
151
152 #[rustfmt::skip]
153 fn syllable_lname_last() -> &'static [(&'static str, usize)] {
154 &[
155 ("ra", 21), ("thil", 12), ("ter", 11), ("tar", 9), ("song", 9), ("bow", 8), ("thyl", 8),
156 ("rym", 7), ("leaf", 6), ("cer", 6), ("spear", 6), ("dar", 6), ("bar", 5), ("kryn", 5),
157 ("zrym", 5), ("lond", 4), ("rim", 4), ("vin", 4), ("star", 4), ("ker", 4), ("reth", 3),
158 ("sar", 3), ("cloak", 3), ("lis", 3), ("dree", 3), ("larn", 3), ("la", 3), ("shin", 3),
159 ("rin", 3), ("ryn", 3), ("som", 3), ("did", 2), ("breeze", 2), ("rel", 2), ("ren", 2),
160 ("ri", 2), ("phiir", 2), ("branch", 2), ("nuath", 2), ("ner", 2), ("niv", 2),
161 ("orgh", 2), ("ran", 2), ("long", 2), ("lin", 2), ("len", 2), ("liom", 2), ("lor", 2),
162 ("kin", 2), ("math", 2),
163 ]
164 }
165
166 fn compound_word_probability() -> f64 {
167 0.14977477477477477
168 }
169
170 #[rustfmt::skip]
171 fn word_lname_first() -> &'static [(&'static str, usize)] {
172 &[
173 ("Moon", 8), ("Star", 6), ("Winter", 4), ("Wind", 4), ("Silver", 4), ("Snow", 4),
174 ("Golden", 4), ("Night", 3), ("Fire", 3), ("Black", 3), ("Green", 3), ("Far", 2),
175 ("Tree", 2), ("Bay", 2), ("True", 2), ("Dusk", 2), ("Mist", 2), ("Blues", 2),
176 ("Haven", 2), ("White", 2), ("Sun", 2), ("Bright", 2), ("Winds", 2), ("Hawk", 2),
177 ("River", 2), ("Mane", 1), ("Mel", 1), ("Minstrel", 1), ("Miri", 1), ("Morning", 1),
178 ("Nights", 1), ("Oak", 1), ("Pars", 1), ("Quiver", 1), ("Rally", 1), ("Red", 1),
179 ("Reef", 1), ("Rune", 1), ("Sea", 1), ("Shade", 1), ("Shadow", 1), ("Shin", 1),
180 ("Shivers", 1), ("Spell", 1), ("Spring", 1), ("Still", 1), ("Storm", 1), ("Strong", 1),
181 ("Sure", 1), ("Sweet", 1),
182 ]
183 }
184
185 #[rustfmt::skip]
186 fn word_lname_last() -> &'static [(&'static str, usize)] {
187 &[
188 ("song", 7), ("bow", 5), ("leaf", 5), ("star", 4), ("tar", 4), ("spear", 4),
189 ("water", 4), ("walker", 3), ("master", 3), ("cloak", 3), ("spoon", 2), ("blossom", 2),
190 ("down", 2), ("moon", 2), ("hand", 2), ("mantle", 2), ("bars", 2), ("wind", 2),
191 ("winter", 2), ("breeze", 2), ("word", 2), ("harp", 1), ("heart", 1), ("helm", 1),
192 ("horn", 1), ("hound", 1), ("ira", 1), ("kin", 1), ("leap", 1), ("lock", 1),
193 ("long", 1), ("lost", 1), ("maine", 1), ("mane", 1), ("meadow", 1), ("melt", 1),
194 ("mer", 1), ("methyl", 1), ("mis", 1), ("moor", 1), ("pear", 1), ("river", 1),
195 ("root", 1), ("rose", 1), ("runner", 1), ("ruth", 1), ("seal", 1), ("seed", 1),
196 ("shadow", 1), ("sheaf", 1),
197 ]
198 }
199}
200
201impl Generate for Ethnicity {
202 fn gen_name(rng: &mut impl Rng, age: &Age, gender: &Gender) -> String {
203 format!(
204 "{} {}",
205 match age {
206 Age::Infant | Age::Child | Age::Adolescent => {
207 super::gen_name(
208 rng,
209 Self::SYLLABLE_FNAME_COUNT_CHILD,
210 Self::syllable_fname_first(),
211 Self::syllable_fname_middle(),
212 Self::syllable_fname_last(),
213 )
214 }
215 _ => Self::gen_fname_simple(rng, gender),
216 },
217 Self::gen_lname_simple(rng),
218 )
219 }
220}
221
222#[cfg(test)]
223mod test {
224 use super::*;
225 use crate::world::npc::ethnicity::{test_utils as test, Ethnicity};
226
227 use Age::{Adolescent, Adult, Child, Infant};
228 use Ethnicity::Elvish;
229 use Gender::{Feminine, Masculine, NonBinaryThey};
230
231 #[test]
232 fn gen_name_test() {
233 let mut rng = SmallRng::seed_from_u64(0);
234
235 assert_eq!(
236 [
237 "Sharyth Mitasom",
238 "Marlin Shiverstar",
239 "Arani Luversom",
240 "Tagar Evasong",
241 "Taros Dusthyl",
242 "Catel Irirolarn",
243 "Meleri Duleaf",
244 "Taten Shinnomath",
245 "Kina Riwareth",
246 ],
247 [
248 test::gen_name(&mut rng, Elvish, Infant, Masculine),
249 test::gen_name(&mut rng, Elvish, Child, Feminine),
250 test::gen_name(&mut rng, Elvish, Adolescent, NonBinaryThey),
251 test::gen_name(&mut rng, Elvish, Adult, Masculine),
252 test::gen_name(&mut rng, Elvish, Adult, Masculine),
253 test::gen_name(&mut rng, Elvish, Adult, Feminine),
254 test::gen_name(&mut rng, Elvish, Adult, Feminine),
255 test::gen_name(&mut rng, Elvish, Adult, NonBinaryThey),
256 test::gen_name(&mut rng, Elvish, Adult, NonBinaryThey),
257 ],
258 );
259 }
260}