1use super::{Age, Gender, Generate, GenerateSimple};
2use rand::prelude::*;
3
4pub struct Ethnicity;
5
6impl GenerateSimple for Ethnicity {
7 fn syllable_fname_count_f() -> &'static [(u8, usize)] {
8 &[(2, 717), (3, 357), (4, 27), (5, 1)]
9 }
10
11 #[rustfmt::skip]
12 fn syllable_fname_first_f() -> &'static [(&'static str, usize)] {
13 &[
14 ("Ja", 19), ("Ta", 18), ("Ha", 16), ("Sha", 14), ("Sa", 14), ("Na", 14), ("Fa", 11),
15 ("Ka", 10), ("Be", 8), ("Ma", 8), ("Ba", 8), ("Se", 8), ("Da", 8), ("La", 7),
16 ("Mar", 7), ("Mi", 6), ("Ne", 6), ("Mu", 5), ("Ra", 5), ("Ca", 5), ("Ri", 5),
17 ("Shar", 5), ("Za", 5), ("Me", 5), ("Ya", 5), ("Dar", 5), ("Li", 5), ("Ju", 5),
18 ("De", 5), ("Bel", 5), ("Co", 5), ("Ki", 5), ("Del", 5), ("So", 5), ("Te", 4),
19 ("Lu", 4), ("He", 4), ("Myr", 4), ("Shan", 4), ("Jan", 4), ("Nu", 4), ("Ara", 4),
20 ("Hel", 4), ("Mo", 4), ("Shei", 4), ("Ky", 4), ("Alu", 4), ("Va", 4), ("Jha", 4),
21 ("Ko", 4),
22 ]
23 }
24
25 #[rustfmt::skip]
26 fn syllable_fname_last_f() -> &'static [(&'static str, usize)] {
27 &[
28 ("ra", 123), ("na", 88), ("la", 61), ("sa", 35), ("da", 33), ("tha", 25), ("dra", 19),
29 ("ta", 18), ("lia", 13), ("tra", 12), ("ri", 12), ("sha", 11), ("ni", 11), ("nya", 11),
30 ("ma", 8), ("ria", 8), ("thra", 8), ("ris", 7), ("ka", 6), ("ko", 6), ("lah", 5),
31 ("rah", 5), ("san", 4), ("wyn", 4), ("cia", 4), ("rin", 4), ("the", 4), ("ja", 4),
32 ("lynn", 4), ("len", 4), ("za", 4), ("lin", 4), ("non", 3), ("va", 3), ("nia", 3),
33 ("shi", 3), ("nor", 3), ("si", 3), ("rie", 3), ("nar", 3), ("naa", 3), ("riel", 3),
34 ("dia", 3), ("ga", 3), ("sia", 3), ("lyn", 3), ("wa", 2), ("set", 2), ("ly", 2),
35 ("ca", 2),
36 ]
37 }
38
39 fn syllable_fname_count_m() -> &'static [(u8, usize)] {
40 &[(2, 2684), (3, 561), (4, 61), (5, 5)]
41 }
42
43 #[rustfmt::skip]
44 fn syllable_fname_first_m() -> &'static [(&'static str, usize)] {
45 &[
46 ("Ha", 38), ("Ma", 34), ("Ta", 30), ("Ka", 27), ("Na", 24), ("Sa", 24), ("Ja", 23),
47 ("Ra", 23), ("Ho", 20), ("Be", 18), ("Ba", 18), ("To", 17), ("Ga", 17), ("Go", 17),
48 ("Ni", 15), ("Har", 15), ("Mar", 15), ("Ko", 15), ("Bel", 15), ("Da", 15), ("Re", 14),
49 ("Fa", 13), ("La", 13), ("Hi", 12), ("Jo", 12), ("Bar", 11), ("Mi", 11), ("Hel", 11),
50 ("Dar", 11), ("Ca", 11), ("Dun", 11), ("Te", 10), ("Car", 10), ("Gar", 10), ("Ya", 10),
51 ("Tor", 10), ("Ki", 9), ("Mu", 9), ("Za", 9), ("Tha", 9), ("Ro", 9), ("Hal", 9),
52 ("Del", 9), ("De", 9), ("Mor", 9), ("Va", 9), ("Rein", 9), ("Du", 8), ("Pa", 8),
53 ("Dra", 8),
54 ]
55 }
56
57 #[rustfmt::skip]
58 fn syllable_fname_last_m() -> &'static [(&'static str, usize)] {
59 &[
60 ("dar", 25), ("gar", 23), ("ter", 22), ("ro", 21), ("rin", 20), ("der", 20),
61 ("lar", 19), ("ran", 18), ("ren", 17), ("man", 16), ("to", 15), ("mar", 15),
62 ("ra", 14), ("len", 14), ("ji", 14), ("ron", 13), ("mo", 13), ("rik", 13), ("rak", 13),
63 ("dor", 13), ("ther", 13), ("ri", 13), ("mon", 12), ("lan", 12), ("lo", 12),
64 ("ton", 12), ("gan", 12), ("da", 12), ("don", 12), ("run", 11), ("ril", 11),
65 ("tar", 11), ("jo", 11), ("ros", 11), ("kar", 10), ("har", 10), ("wa", 10), ("ko", 10),
66 ("ric", 10), ("bar", 10), ("do", 10), ("lin", 10), ("son", 10), ("nar", 10),
67 ("rim", 9), ("nan", 9), ("go", 9), ("rus", 9), ("reth", 9), ("ki", 8),
68 ]
69 }
70
71 fn syllable_fname_count() -> &'static [(u8, usize)] {
72 &[(2, 3502), (3, 945), (4, 90), (5, 6)]
73 }
74
75 #[rustfmt::skip]
76 fn syllable_fname_first() -> &'static [(&'static str, usize)] {
77 &[
78 ("Ha", 56), ("Ta", 49), ("Ma", 42), ("Ja", 42), ("Na", 40), ("Sa", 38), ("Ka", 37),
79 ("Ra", 30), ("Ba", 27), ("Be", 26), ("Fa", 25), ("Da", 23), ("Mar", 22), ("Ho", 22),
80 ("La", 21), ("Bel", 21), ("Sha", 21), ("Ko", 20), ("Ga", 19), ("Har", 19), ("Go", 19),
81 ("Mi", 18), ("To", 18), ("Ni", 17), ("Ca", 17), ("Re", 16), ("Dar", 16), ("Hel", 16),
82 ("Se", 16), ("Za", 15), ("Ya", 15), ("De", 15), ("Mu", 14), ("Ki", 14), ("Del", 14),
83 ("Hi", 14), ("Te", 14), ("Jo", 14), ("Tha", 13), ("Ne", 13), ("Va", 13), ("Car", 13),
84 ("Co", 12), ("Ri", 12), ("Bar", 12), ("Mor", 12), ("Me", 11), ("He", 11), ("Ro", 11),
85 ("Yu", 11),
86 ]
87 }
88
89 #[rustfmt::skip]
90 fn syllable_fname_last() -> &'static [(&'static str, usize)] {
91 &[
92 ("ra", 145), ("na", 92), ("la", 63), ("da", 46), ("sa", 37), ("ri", 28), ("dar", 27),
93 ("tha", 26), ("rin", 24), ("gar", 23), ("ta", 23), ("ter", 22), ("lar", 22),
94 ("ren", 21), ("der", 21), ("ro", 21), ("dra", 19), ("mar", 19), ("ran", 19),
95 ("ni", 18), ("len", 18), ("to", 18), ("man", 17), ("ko", 16), ("ka", 15), ("don", 14),
96 ("sha", 14), ("ji", 14), ("ril", 14), ("ma", 14), ("lin", 14), ("mon", 14),
97 ("lan", 13), ("ther", 13), ("dor", 13), ("nar", 13), ("rak", 13), ("ris", 13),
98 ("ron", 13), ("lia", 13), ("rik", 13), ("gan", 13), ("lo", 13), ("tra", 13),
99 ("mo", 13), ("run", 12), ("nya", 12), ("son", 12), ("san", 12), ("jo", 12),
100 ]
101 }
102
103 #[rustfmt::skip]
104 fn syllable_fname_middle() -> &'static [(&'static str, usize)] {
105 &[
106 ("la", 47), ("li", 34), ("ra", 32), ("na", 31), ("da", 27), ("ta", 24), ("ri", 22),
107 ("lan", 21), ("ma", 20), ("ni", 20), ("sa", 18), ("do", 18), ("ran", 17), ("de", 16),
108 ("ti", 16), ("lo", 16), ("ka", 14), ("mi", 14), ("re", 13), ("ga", 13), ("ro", 12),
109 ("a", 12), ("mo", 11), ("ki", 11), ("le", 11), ("va", 10), ("si", 10), ("to", 10),
110 ("ko", 10), ("tha", 9), ("ris", 9), ("las", 8), ("se", 8), ("hi", 7), ("za", 7),
111 ("shi", 7), ("lin", 7), ("les", 7), ("go", 7), ("ha", 6), ("lae", 5), ("bi", 5),
112 ("ba", 5), ("man", 5), ("rin", 5), ("bu", 5), ("te", 5), ("ne", 5), ("no", 5),
113 ("chi", 5),
114 ]
115 }
116
117 fn syllable_lname_count() -> &'static [(u8, usize)] {
118 &[(2, 2195), (3, 824), (4, 99), (5, 1)]
119 }
120
121 #[rustfmt::skip]
122 fn syllable_lname_first() -> &'static [(&'static str, usize)] {
123 &[
124 ("al-", 0), ("Obar", 81), ("Ta", 28), ("Ha", 27), ("Ka", 26), ("Har", 23), ("Ma", 23),
125 ("Ra", 21), ("Ca", 20), ("Hel", 18), ("Na", 17), ("Mar", 15), ("De", 15), ("Sa", 15),
126 ("Cor", 15), ("Sil", 15), ("Black", 14), ("Ja", 14), ("Da", 14), ("Me", 13),
127 ("Be", 13), ("Storm", 13), ("Mi", 13), ("Moon", 12), ("Ba", 12), ("Se", 12),
128 ("Tan", 12), ("Tha", 10), ("Del", 9), ("Ill", 9), ("Dark", 9), ("Ki", 8), ("Su", 8),
129 ("Au", 8), ("Dag", 8), ("Dra", 8), ("Red", 8), ("Blood", 8), ("Ne", 8), ("Thorn", 8),
130 ("Ken", 8), ("Sha", 8), ("Thun", 8), ("Fa", 7), ("Mel", 7), ("Star", 7), ("Iron", 7),
131 ("Harp", 7), ("Olaun", 7), ("La", 7),
132 ]
133 }
134
135 #[rustfmt::skip]
136 fn syllable_lname_middle() -> &'static [(&'static str, usize)] {
137 &[
138 ("ra", 33), ("sil", 19), ("ta", 18), ("sa", 17), ("na", 17), ("lan", 14), ("la", 14),
139 ("to", 14), ("ma", 14), ("cas", 12), ("ri", 12), ("go", 12), ("ver", 12), ("mae", 12),
140 ("der", 11), ("de", 11), ("da", 11), ("man", 10), ("ger", 9), ("ven", 9), ("ka", 9),
141 ("li", 9), ("win", 8), ("hi", 8), ("su", 8), ("ro", 8), ("mas", 8), ("shi", 7),
142 ("mer", 7), ("lo", 7), ("no", 7), ("ing", 7), ("va", 7), ("a", 7), ("ter", 7),
143 ("ti", 7), ("le", 6), ("Ja", 6), ("ha", 6), ("Ka", 6), ("ne", 6), ("ki", 6), ("Ga", 6),
144 ("Za", 6), ("mi", 6), ("vern", 6), ("gas", 5), ("tham", 5), ("do", 5), ("feat", 5),
145 ]
146 }
147
148 #[rustfmt::skip]
149 fn syllable_lname_last() -> &'static [(&'static str, usize)] {
150 &[
151 ("skyr", 81), ("ter", 43), ("ra", 25), ("ver", 24), ("tle", 23), ("tar", 22),
152 ("hand", 19), ("ro", 16), ("dar", 15), ("lin", 15), ("mer", 15), ("mar", 14),
153 ("star", 14), ("ril", 14), ("horn", 14), ("son", 13), ("ri", 13), ("la", 13),
154 ("na", 13), ("lar", 12), ("li", 12), ("man", 12), ("ka", 12), ("tharn", 11),
155 ("wood", 11), ("ren", 11), ("to", 11), ("der", 11), ("ther", 10), ("da", 10),
156 ("ger", 10), ("gar", 10), ("ker", 10), ("ton", 9), ("ru", 9), ("ance", 9), ("ris", 9),
157 ("ven", 9), ("mo", 8), ("ji", 8), ("shield", 8), ("ki", 8), ("ryn", 8), ("blade", 7),
158 ("bar", 7), ("ras", 7), ("mane", 7), ("dran", 7), ("nok", 7), ("tree", 7),
159 ]
160 }
161
162 fn compound_word_probability() -> f64 {
163 0.08863080684596578
164 }
165
166 #[rustfmt::skip]
167 fn word_lname_first() -> &'static [(&'static str, usize)] {
168 &[
169 ("Black", 12), ("Storm", 12), ("Moon", 8), ("Blood", 8), ("Thorn", 7), ("Red", 7),
170 ("Silver", 6), ("Green", 6), ("Dark", 6), ("Iron", 5), ("Thunder", 5), ("Hawk", 5),
171 ("Far", 4), ("Ten", 4), ("White", 4), ("Raven", 4), ("Fire", 4), ("Gold", 4),
172 ("Star", 4), ("Grey", 3), ("Ser", 3), ("Long", 3), ("Night", 3), ("Bright", 3),
173 ("Keen", 3), ("Dagger", 3), ("Shadow", 2), ("Dry", 2), ("Good", 2), ("Scat", 2),
174 ("Tall", 2), ("Horns", 2), ("Talon", 2), ("Deep", 2), ("High", 2), ("Flame", 2),
175 ("Winds", 2), ("Thin", 2), ("Moss", 2), ("Bow", 2), ("Stone", 2), ("Falcon", 2),
176 ("Grain", 2), ("Del", 2), ("Mirror", 2), ("Stout", 2), ("Wood", 2), ("Gray", 2),
177 ("Frost", 2), ("Wind", 2),
178 ]
179 }
180
181 #[rustfmt::skip]
182 fn word_lname_last() -> &'static [(&'static str, usize)] {
183 &[
184 ("hand", 13), ("horn", 8), ("tar", 7), ("son", 7), ("mantle", 7), ("castle", 6),
185 ("wind", 6), ("her", 6), ("sword", 5), ("tree", 5), ("wood", 5), ("silver", 5),
186 ("feat", 5), ("winter", 5), ("blade", 5), ("fist", 5), ("mane", 4), ("helm", 4),
187 ("pent", 4), ("star", 3), ("kin", 3), ("shar", 3), ("eye", 3), ("hawk", 3),
188 ("singer", 3), ("gar", 3), ("crown", 3), ("seer", 3), ("word", 3), ("bough", 3),
189 ("stone", 3), ("hair", 3), ("shield", 3), ("bane", 3), ("bridge", 3), ("dale", 3),
190 ("man", 3), ("dark", 2), ("ara", 2), ("shine", 2), ("runner", 2), ("crest", 2),
191 ("wing", 2), ("dusk", 2), ("wild", 2), ("hale", 2), ("wise", 2), ("cloak", 2),
192 ("breaker", 2), ("sar", 2),
193 ]
194 }
195}
196
197impl Generate for Ethnicity {
198 fn gen_name(rng: &mut impl Rng, _age: &Age, gender: &Gender) -> String {
199 format!(
200 "{} {}",
201 Self::gen_fname_simple(rng, gender),
202 Self::gen_lname_simple(rng),
203 )
204 }
205}
206
207#[cfg(test)]
208mod test {
209 use super::*;
210 use crate::world::npc::ethnicity::{test_utils as test, Ethnicity};
211
212 use Age::Adult;
213 use Ethnicity::Human;
214 use Gender::{Feminine, Masculine, NonBinaryThey};
215
216 #[test]
217 fn gen_name_test() {
218 let mut rng = SmallRng::seed_from_u64(0);
219
220 assert_eq!(
221 [
222 "Gorik Aulandran",
223 "Carleder Helkidran",
224 "Selania Maren",
225 "Delrasa Marton",
226 "Rina Tater",
227 "Mini Obarlin",
228 ],
229 [
230 test::gen_name(&mut rng, Human, Adult, Masculine),
231 test::gen_name(&mut rng, Human, Adult, Masculine),
232 test::gen_name(&mut rng, Human, Adult, Feminine),
233 test::gen_name(&mut rng, Human, Adult, Feminine),
234 test::gen_name(&mut rng, Human, Adult, NonBinaryThey),
235 test::gen_name(&mut rng, Human, Adult, NonBinaryThey),
236 ],
237 );
238 }
239}