initiative_core/world/npc/species/
tiefling.rs

1use 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..=99)
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..=39,
23            Age::MiddleAged => 40..=69,
24            Age::Elderly => 70..=84,
25            Age::Geriatric => 85..=99,
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 < 40 => Age::Adult,
36            i if i < 70 => Age::MiddleAged,
37            i if i < 85 => 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            [44, 43, 97, 46, 89],
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(39));
115
116        assert_eq!(Age::MiddleAged, Species::age_from_years(40));
117        assert_eq!(Age::MiddleAged, Species::age_from_years(69));
118
119        assert_eq!(Age::Elderly, Species::age_from_years(70));
120        assert_eq!(Age::Elderly, Species::age_from_years(84));
121
122        assert_eq!(Age::Geriatric, Species::age_from_years(85));
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}