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, 19), (3, 12), (4, 1), (7, 1)]
9 }
10
11 #[rustfmt::skip]
12 fn syllable_fname_first_f() -> &'static [(&'static str, usize)] {
13 &[
14 ("Se", 2), ("Wa", 2), ("Blin", 1), ("Da", 1), ("Del", 1), ("Gel", 1), ("Gin", 1),
15 ("Ha", 1), ("Hen", 1), ("Jal", 1), ("Jam", 1), ("Joyel", 1), ("Lan", 1), ("Ma", 1),
16 ("Mav", 1), ("Mrel", 1), ("Nai", 1), ("No", 1), ("Ruk", 1), ("Sen", 1), ("Sto", 1),
17 ("Tap", 1), ("Toh", 1), ("Vil", 1), ("Ya", 1), ("Yan", 1), ("Yo", 1), ("Angha", 1),
18 ("Za", 1), ("Aria", 1),
19 ]
20 }
21
22 #[rustfmt::skip]
23 fn syllable_fname_last_f() -> &'static [(&'static str, usize)] {
24 &[
25 ("la", 6), ("na", 3), ("ni", 2), ("ki", 2), ("kkal", 1), ("leed", 1), ("less", 1),
26 ("lie", 1), ("mi", 1), ("moth", 1), ("nah", 1), ("net", 1), ("nia", 1), ("py", 1),
27 ("ra", 1), ("ran", 1), ("tha", 1), ("thee", 1), ("a", 1), ("tow", 1), ("del", 1),
28 ("drin", 1), ("isle", 1),
29 ]
30 }
31
32 fn syllable_fname_count_m() -> &'static [(u8, usize)] {
33 &[(2, 71), (3, 19), (4, 2)]
34 }
35
36 #[rustfmt::skip]
37 fn syllable_fname_first_m() -> &'static [(&'static str, usize)] {
38 &[
39 ("Fil", 2), ("Gur", 2), ("Dor", 2), ("Pe", 2), ("Ha", 2), ("Bar", 1), ("Ben", 1),
40 ("Bils", 1), ("Bod", 1), ("Bof", 1), ("Bran", 1), ("Bric", 1), ("Bu", 1), ("Da", 1),
41 ("Dir", 1), ("Elis", 1), ("Fal", 1), ("Fit", 1), ("Fla", 1), ("Gim", 1), ("Gly", 1),
42 ("Grab", 1), ("Grob", 1), ("Gus", 1), ("Hei", 1), ("Ho", 1), ("Jim", 1), ("Jou", 1),
43 ("Ka", 1), ("Kar", 1), ("Kor", 1), ("Krie", 1), ("Lur", 1), ("Ma", 1), ("Mak", 1),
44 ("Mig", 1), ("Mu", 1), ("Nan", 1), ("Nor", 1), ("Peeb", 1), ("Pin", 1), ("Prit", 1),
45 ("Pur", 1), ("Ra", 1), ("Ril", 1), ("Ror", 1), ("Rug", 1), ("Rund", 1), ("San", 1),
46 ("Skee", 1),
47 ]
48 }
49
50 #[rustfmt::skip]
51 fn syllable_fname_last_m() -> &'static [(&'static str, usize)] {
52 &[
53 ("ka", 2), ("den", 2), ("rinn", 2), ("lin", 2), ("ry", 2), ("cere", 1), ("chard", 1),
54 ("cus", 1), ("darn", 1), ("das", 1), ("des", 1), ("do", 1), ("dor", 1), ("dyn", 1),
55 ("fal", 1), ("fbin", 1), ("fiz", 1), ("fo", 1), ("foodle", 1), ("garth", 1),
56 ("ger", 1), ("gien", 1), ("gor", 1), ("grog", 1), ("gtu", 1), ("gus", 1), ("har", 1),
57 ("jar", 1), ("kers", 1), ("kik", 1), ("krist", 1), ("kyl", 1), ("lan", 1), ("les", 1),
58 ("lian", 1), ("liyun", 1), ("lo", 1), ("lob", 1), ("mas", 1), ("min", 1), ("mir", 1),
59 ("mo", 1), ("nar", 1), ("net", 1), ("nik", 1), ("no", 1), ("nock", 1), ("phic", 1),
60 ("pin", 1), ("roo", 1),
61 ]
62 }
63
64 fn syllable_fname_count() -> &'static [(u8, usize)] {
65 &[(2, 96), (3, 33), (4, 3), (7, 1)]
66 }
67
68 #[rustfmt::skip]
69 fn syllable_fname_first() -> &'static [(&'static str, usize)] {
70 &[
71 ("Ha", 3), ("Ma", 3), ("Wa", 2), ("Dor", 2), ("Pe", 2), ("Ka", 2), ("Fil", 2),
72 ("Gur", 2), ("Ben", 2), ("Se", 2), ("Da", 2), ("Bod", 1), ("Bof", 1), ("Brae", 1),
73 ("Bran", 1), ("Bric", 1), ("Bu", 1), ("Del", 1), ("Dir", 1), ("Elis", 1), ("Fal", 1),
74 ("Fan", 1), ("Fit", 1), ("Fla", 1), ("Gel", 1), ("Gim", 1), ("Gin", 1), ("Gly", 1),
75 ("Grab", 1), ("Grob", 1), ("Gus", 1), ("Hei", 1), ("Hen", 1), ("Ho", 1), ("Jal", 1),
76 ("Jam", 1), ("Jim", 1), ("Jou", 1), ("Joyel", 1), ("Kar", 1), ("Kor", 1), ("Krie", 1),
77 ("Lan", 1), ("Lur", 1), ("Mak", 1), ("Mav", 1), ("Mig", 1), ("Mrel", 1), ("Mu", 1),
78 ("Nai", 1),
79 ]
80 }
81
82 #[rustfmt::skip]
83 fn syllable_fname_last() -> &'static [(&'static str, usize)] {
84 &[
85 ("la", 6), ("lin", 3), ("na", 3), ("rinn", 2), ("ka", 2), ("ry", 2), ("ni", 2),
86 ("net", 2), ("den", 2), ("ki", 2), ("daer", 1), ("darn", 1), ("das", 1), ("del", 1),
87 ("der", 1), ("des", 1), ("do", 1), ("dor", 1), ("drin", 1), ("dyn", 1), ("fal", 1),
88 ("fbin", 1), ("fiz", 1), ("fo", 1), ("foodle", 1), ("garth", 1), ("ger", 1),
89 ("gien", 1), ("gor", 1), ("grog", 1), ("gtu", 1), ("gus", 1), ("har", 1), ("isle", 1),
90 ("jar", 1), ("kers", 1), ("kik", 1), ("kkal", 1), ("krist", 1), ("kyl", 1), ("lah", 1),
91 ("lan", 1), ("leed", 1), ("les", 1), ("less", 1), ("lian", 1), ("lie", 1),
92 ("liyun", 1), ("lo", 1), ("lob", 1),
93 ]
94 }
95
96 #[rustfmt::skip]
97 fn syllable_fname_middle() -> &'static [(&'static str, usize)] {
98 &[
99 ("na", 3), ("ra", 3), ("la", 2), ("de", 2), ("ri", 2), ("ble", 2), ("he", 1),
100 ("hel", 1), ("i", 1), ("jus", 1), ("ka", 1), ("ko", 1), ("krom", 1), ("lak", 1),
101 ("li", 1), ("lis", 1), ("lo", 1), ("lus", 1), ("ly", 1), ("mad", 1), ("mi", 1),
102 ("ner", 1), ("nol", 1), ("sul", 1), ("ta", 1), ("tad", 1), ("tian", 1), ("to", 1),
103 ("ven", 1), ("ban", 1), ("zmil", 1), ("da", 1), ("di'", 1), ("dyk", 1), ("ga", 1),
104 ("ge", 1),
105 ]
106 }
107
108 fn syllable_lname_count() -> &'static [(u8, usize)] {
109 &[(2, 43), (3, 45), (4, 10), (5, 1), (6, 1)]
110 }
111
112 #[rustfmt::skip]
113 fn syllable_lname_first() -> &'static [(&'static str, usize)] {
114 &[
115 ("Mir", 3), ("Fid", 2), ("Burr", 2), ("Lead", 2), ("Dig", 2), ("Gar", 2), ("Bit", 1),
116 ("Bright", 1), ("Bul", 1), ("Bus", 1), ("Cher", 1), ("Clam", 1), ("Coax", 1),
117 ("Cos", 1), ("Crac", 1), ("Daer", 1), ("Dis", 1), ("Doog", 1), ("Dream", 1),
118 ("Drip", 1), ("Faya", 1), ("Fi", 1), ("Flint", 1), ("Foam", 1), ("Gleam", 1),
119 ("Glinc", 1), ("Glit", 1), ("Gnar", 1), ("Gnome", 1), ("Gra", 1), ("Grea", 1),
120 ("Haerl", 1), ("Har", 1), ("Het", 1), ("ibn-", 1), ("Iron", 1), ("Jas", 1),
121 ("Knob", 1), ("Kov", 1), ("Kres", 1), ("Lar", 1), ("Le", 1), ("Me", 1), ("Min", 1),
122 ("Morn", 1), ("Muc", 1), ("Nat", 1), ("Nog", 1), ("Path", 1), ("Pe", 1),
123 ]
124 }
125
126 #[rustfmt::skip]
127 fn syllable_lname_middle() -> &'static [(&'static str, usize)] {
128 &[
129 ("der", 3), ("ror", 3), ("ben", 2), ("dle", 2), ("war", 2), ("mat", 2), ("stop", 2),
130 ("dner", 2), ("bar", 2), ("ger", 2), ("hun", 1), ("ing", 1), ("je", 1), ("kan", 1),
131 ("ke", 1), ("ke", 1), ("ked", 1), ("ket", 1), ("kled", 1), ("knap", 1), ("knoc", 1),
132 ("ktap", 1), ("kun", 1), ("li", 1), ("lwub", 1), ("ly", 1), ("man", 1), ("mer", 1),
133 ("mi", 1), ("na", 1), ("per", 1), ("re", 1), ("ros", 1), ("row", 1), ("sen", 1),
134 ("shut", 1), ("sil", 1), ("sin", 1), ("skil", 1), ("sten", 1), ("tel", 1), ("ten", 1),
135 ("ters", 1), ("tlef", 1), ("vel", 1), ("ven", 1), ("wea", 1), ("wil", 1), ("woc", 1),
136 ("ber", 1),
137 ]
138 }
139
140 #[rustfmt::skip]
141 fn syllable_lname_last() -> &'static [(&'static str, usize)] {
142 &[
143 ("son", 5), ("per", 4), ("tle", 3), ("stone", 3), ("tock", 2), ("lo", 2), ("der", 2),
144 ("ver", 2), ("rock", 2), ("ter", 2), ("den", 2), ("shade", 2), ("light", 2),
145 ("ger", 2), ("grove", 1), ("gulp", 1), ("hand", 1), ("hands", 1), ("ka", 1),
146 ("ker", 1), ("ket", 1), ("klar", 1), ("kle", 1), ("la", 1), ("lane", 1), ("let", 1),
147 ("li", 1), ("liamne", 1), ("lice", 1), ("ling", 1), ("lutz", 1), ("mi", 1),
148 ("monk", 1), ("nez", 1), ("piece", 1), ("quartz", 1), ("ram", 1), ("rel", 1),
149 ("ri", 1), ("rick", 1), ("rim", 1), ("ritt", 1), ("rooj", 1), ("sham", 1),
150 ("shine", 1), ("skeel", 1), ("song", 1), ("strap", 1), ("tat", 1), ("ten", 1),
151 ]
152 }
153
154 fn compound_word_probability() -> f64 {
155 0.2483221476510067
156 }
157
158 #[rustfmt::skip]
159 fn word_lname_first() -> &'static [(&'static str, usize)] {
160 &[
161 ("Mirror", 2), ("Bright", 1), ("Burr", 1), ("Coax", 1), ("Cos", 1), ("Cracked", 1),
162 ("Digger", 1), ("Dream", 1), ("Drip", 1), ("Fiddle", 1), ("Foam", 1), ("Gleam", 1),
163 ("Glitters", 1), ("Gnome", 1), ("Gravel", 1), ("Harrow", 1), ("Iron", 1),
164 ("Jasper", 1), ("Lead", 1), ("Lena", 1), ("Min", 1), ("Morning", 1), ("Path", 1),
165 ("Pick", 1), ("Randy", 1), ("Scrape", 1), ("Shadow", 1), ("Shive", 1), ("Spider", 1),
166 ("Stone", 1), ("Tap", 1), ("Thunder", 1), ("True", 1), ("Weird", 1), ("Auld", 1),
167 ("Wood", 1),
168 ]
169 }
170
171 #[rustfmt::skip]
172 fn word_lname_last() -> &'static [(&'static str, usize)] {
173 &[
174 ("rock", 2), ("blood", 1), ("bonk", 1), ("bottle", 1), ("castle", 1), ("dust", 1),
175 ("finger", 1), ("gate", 1), ("grove", 1), ("hand", 1), ("hands", 1), ("hunter", 1),
176 ("jewel", 1), ("kettle", 1), ("lice", 1), ("light", 1), ("ling", 1), ("mattock", 1),
177 ("monk", 1), ("per", 1), ("quartz", 1), ("shade", 1), ("shine", 1), ("shut", 1),
178 ("silver", 1), ("singer", 1), ("skillet", 1), ("song", 1), ("stone", 1), ("stop", 1),
179 ("strap", 1), ("ter", 1), ("toe", 1), ("tone", 1), ("tor", 1), ("warden", 1),
180 ("bender", 1), ("weaver", 1),
181 ]
182 }
183}
184
185impl Generate for Ethnicity {
186 fn gen_name(rng: &mut impl Rng, _age: &Age, gender: &Gender) -> String {
187 format!(
188 "{} {}",
189 Self::gen_fname_simple(rng, gender),
190 Self::gen_lname_simple(rng),
191 )
192 }
193}
194
195#[cfg(test)]
196mod test {
197 use super::*;
198 use crate::world::npc::ethnicity::{test_utils as test, Ethnicity};
199
200 use Age::Adult;
201 use Ethnicity::Gnomish;
202 use Gender::{Feminine, Masculine, NonBinaryThey};
203
204 #[test]
205 fn gen_name_test() {
206 let mut rng = SmallRng::seed_from_u64(0);
207
208 assert_eq!(
209 [
210 "Gimger Glitkedjerel",
211 "Sankrist Weirdgrove",
212 "Ginzmilki Mirskilkerick",
213 "Jalni Harshade",
214 "Jimna Cosgershade",
215 "Malian Cosstone",
216 ],
217 [
218 test::gen_name(&mut rng, Gnomish, Adult, Masculine),
219 test::gen_name(&mut rng, Gnomish, Adult, Masculine),
220 test::gen_name(&mut rng, Gnomish, Adult, Feminine),
221 test::gen_name(&mut rng, Gnomish, Adult, Feminine),
222 test::gen_name(&mut rng, Gnomish, Adult, NonBinaryThey),
223 test::gen_name(&mut rng, Gnomish, Adult, NonBinaryThey),
224 ],
225 );
226 }
227}