Skip to main content

fish_lib/data/
species_data.rs

1use crate::data::encounter_data::EncounterData;
2use crate::utils::math::float_interpolate;
3use serde::{Deserialize, Serialize};
4
5#[derive(Debug, Default, Serialize, Deserialize, PartialEq)]
6pub struct SpeciesData {
7    #[serde(skip, default)]
8    pub id: i32,
9    pub name: String,
10    /// Minimum possible size at age 0.0
11    pub min_size_baby_mm: u32,
12    /// Maximum possible size at age 0.0
13    pub max_size_baby_mm: u32,
14    /// Minimum possible size at age 1.0
15    pub min_size_adult_mm: u32,
16    /// Maximum possible size at age 1.0
17    pub max_size_adult_mm: u32,
18    /// Minimum possible weight at age 0.0
19    pub min_weight_baby_g: u32,
20    /// Maximum possible weight at age 0.0
21    pub max_weight_baby_g: u32,
22    /// Minimum possible weight at age 1.0
23    pub min_weight_adult_g: u32,
24    /// Maximum possible weight at age 1.0
25    pub max_weight_adult_g: u32,
26    /// Minimum possible lifespan in days
27    pub min_lifespan_days: u32,
28    /// Maximum possible lifespan in days
29    pub max_lifespan_days: u32,
30    /// Time when fish becomes adult (0 to 1)
31    #[serde(default = "default_lifespan_adult_ratio")]
32    pub lifespan_adult_ratio: f32,
33    #[serde(default)]
34    pub encounters: Vec<EncounterData>,
35}
36
37fn default_lifespan_adult_ratio() -> f32 {
38    0.35
39}
40
41impl SpeciesData {
42    pub fn get_baby_size_by_ratio(&self, ratio: f32) -> f32 {
43        float_interpolate(
44            self.min_size_baby_mm as f32,
45            self.max_size_baby_mm as f32,
46            ratio,
47        )
48    }
49
50    pub fn get_adult_size_by_ratio(&self, ratio: f32) -> f32 {
51        float_interpolate(
52            self.min_size_adult_mm as f32,
53            self.max_size_adult_mm as f32,
54            ratio,
55        )
56    }
57
58    pub fn get_baby_weight_by_ratio(&self, ratio: f32) -> f32 {
59        float_interpolate(
60            self.min_weight_baby_g as f32,
61            self.max_weight_baby_g as f32,
62            ratio,
63        )
64    }
65
66    pub fn get_adult_weight_by_ratio(&self, ratio: f32) -> f32 {
67        float_interpolate(
68            self.min_weight_adult_g as f32,
69            self.max_weight_adult_g as f32,
70            ratio,
71        )
72    }
73
74    pub fn get_lifespan_days_by_ratio(&self, ratio: f32) -> f32 {
75        float_interpolate(
76            self.min_lifespan_days as f32,
77            self.max_lifespan_days as f32,
78            ratio,
79        )
80    }
81}