initiative_core/world/npc/species/
half_elf.rs1use super::human::Species as Human;
2use super::{Age, Gender, Generate, Size};
3use rand::prelude::*;
4
5pub struct Species;
6
7impl Generate for Species {
8 fn gen_gender(rng: &mut impl Rng) -> Gender {
9 Human::gen_gender(rng)
10 }
11
12 fn gen_age_years(rng: &mut impl Rng) -> u16 {
13 rng.gen_range(0..=200)
14 }
15
16 fn gen_years_from_age(rng: &mut impl Rng, age: &Age) -> u16 {
17 rng.gen_range(match age {
18 Age::Infant => 0..=1,
19 Age::Child => 2..=9,
20 Age::Adolescent => 10..=19,
21 Age::YoungAdult => 20..=29,
22 Age::Adult => 30..=79,
23 Age::MiddleAged => 80..=139,
24 Age::Elderly => 140..=179,
25 Age::Geriatric => 180..=200,
26 })
27 }
28
29 fn age_from_years(years: u16) -> Age {
30 match years {
31 i if i < 2 => Age::Infant,
32 i if i < 10 => Age::Child,
33 i if i < 20 => Age::Adolescent,
34 i if i < 30 => Age::YoungAdult,
35 i if i < 80 => Age::Adult,
36 i if i < 140 => Age::MiddleAged,
37 i if i < 180 => Age::Elderly,
38 _ => Age::Geriatric,
39 }
40 }
41
42 fn gen_size(rng: &mut impl Rng, age_years: u16, gender: &Gender) -> Size {
43 Human::gen_size(rng, age_years, gender)
44 }
45}
46
47#[cfg(test)]
48mod test_generate_for_species {
49 use super::*;
50
51 #[test]
52 fn gen_gender_test() {
53 let (mut rng1, mut rng2) = (SmallRng::seed_from_u64(0), SmallRng::seed_from_u64(0));
54
55 for _ in 0..10 {
56 assert_eq!(Species::gen_gender(&mut rng1), Human::gen_gender(&mut rng2));
57 }
58 }
59
60 #[test]
61 fn gen_age_years_test() {
62 let mut rng = SmallRng::seed_from_u64(0);
63
64 assert_eq!(
65 [89, 88, 196, 92, 180],
66 [
67 Species::gen_age_years(&mut rng),
68 Species::gen_age_years(&mut rng),
69 Species::gen_age_years(&mut rng),
70 Species::gen_age_years(&mut rng),
71 Species::gen_age_years(&mut rng),
72 ],
73 );
74 }
75
76 #[test]
77 fn gen_years_from_age_test() {
78 let ages = [
79 Age::Infant,
80 Age::Child,
81 Age::Adolescent,
82 Age::YoungAdult,
83 Age::Adult,
84 Age::MiddleAged,
85 Age::Elderly,
86 Age::Geriatric,
87 ];
88
89 for age in ages {
90 let mut rng = SmallRng::seed_from_u64(0);
91
92 for _ in 0..10 {
93 let age_years = Species::gen_years_from_age(&mut rng, &age);
94 assert_eq!(age, Species::age_from_years(age_years));
95 }
96 }
97 }
98
99 #[test]
100 fn age_from_years_test() {
101 assert_eq!(Age::Infant, Species::age_from_years(0));
102 assert_eq!(Age::Infant, Species::age_from_years(1));
103
104 assert_eq!(Age::Child, Species::age_from_years(2));
105 assert_eq!(Age::Child, Species::age_from_years(9));
106
107 assert_eq!(Age::Adolescent, Species::age_from_years(10));
108 assert_eq!(Age::Adolescent, Species::age_from_years(19));
109
110 assert_eq!(Age::YoungAdult, Species::age_from_years(20));
111 assert_eq!(Age::YoungAdult, Species::age_from_years(29));
112
113 assert_eq!(Age::Adult, Species::age_from_years(30));
114 assert_eq!(Age::Adult, Species::age_from_years(79));
115
116 assert_eq!(Age::MiddleAged, Species::age_from_years(80));
117 assert_eq!(Age::MiddleAged, Species::age_from_years(139));
118
119 assert_eq!(Age::Elderly, Species::age_from_years(140));
120 assert_eq!(Age::Elderly, Species::age_from_years(179));
121
122 assert_eq!(Age::Geriatric, Species::age_from_years(180));
123 assert_eq!(Age::Geriatric, Species::age_from_years(u16::MAX));
124 }
125
126 #[test]
127 fn gen_size_test() {
128 let (mut rng1, mut rng2) = (SmallRng::seed_from_u64(0), SmallRng::seed_from_u64(0));
129
130 for _ in 0..10 {
131 assert_eq!(
132 Species::gen_size(&mut rng1, 0, &Gender::NonBinaryThey),
133 Human::gen_size(&mut rng2, 0, &Gender::NonBinaryThey),
134 );
135 }
136 }
137}