fish_lib/data/
species_data.rs1use 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 pub min_size_baby_mm: u32,
12 pub max_size_baby_mm: u32,
14 pub min_size_adult_mm: u32,
16 pub max_size_adult_mm: u32,
18 pub min_weight_baby_g: u32,
20 pub max_weight_baby_g: u32,
22 pub min_weight_adult_g: u32,
24 pub max_weight_adult_g: u32,
26 pub min_lifespan_days: u32,
28 pub max_lifespan_days: u32,
30 #[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}