initiative_core/world/npc/ethnicity/
human.rs

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}