initiative_core/world/npc/ethnicity/
elvish.rs

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}