use crate::internal::*;
use crate::prelude::*;
pub mod generator;
pub mod types;
#[derive(Clone, PartialEq, PartialOrd, Debug, SmartDefault, Serialize, Deserialize)]
pub struct Star {
#[default("default")]
pub name: Rc<str>,
pub mass: f64,
pub luminosity: f32,
pub radius: f64,
pub age: f32,
pub temperature: u32,
pub population: StellarEvolution,
pub spectral_type: StarSpectralType,
pub luminosity_class: StarLuminosityClass,
pub orbital_point_id: u32,
pub orbit: Option<Orbit>,
pub zones: Vec<StarZone>,
pub special_traits: Vec<StarPeculiarity>,
}
impl Star {
pub fn new(
name: Rc<str>,
mass: f64,
luminosity: f32,
radius: f64,
age: f32,
temperature: u32,
population: StellarEvolution,
spectral_type: StarSpectralType,
luminosity_class: StarLuminosityClass,
special_traits: Vec<StarPeculiarity>,
orbital_point_id: u32,
orbit: Option<Orbit>,
zones: Vec<StarZone>,
) -> Self {
Self {
name,
mass,
luminosity,
radius,
age,
temperature,
population,
spectral_type,
luminosity_class,
special_traits,
orbital_point_id,
orbit,
zones,
}
}
pub fn is_main_sequence_dwarf(&self) -> bool {
(self.luminosity_class == StarLuminosityClass::V
|| self.luminosity_class == StarLuminosityClass::IV)
&& self.is_more_luminous_than_brown_dwarf()
}
pub fn is_main_sequence_or_giant(&self) -> bool {
(self.luminosity_class == StarLuminosityClass::O
|| self.luminosity_class == StarLuminosityClass::Ia
|| self.luminosity_class == StarLuminosityClass::Ib
|| self.luminosity_class == StarLuminosityClass::II
|| self.luminosity_class == StarLuminosityClass::III
|| self.luminosity_class == StarLuminosityClass::IV
|| self.luminosity_class == StarLuminosityClass::V
|| self.luminosity_class == StarLuminosityClass::IV)
&& self.is_more_luminous_than_brown_dwarf()
}
pub fn is_more_luminous_than_brown_dwarf(&self) -> bool {
discriminant(&self.spectral_type) == discriminant(&StarSpectralType::WR(0))
|| discriminant(&self.spectral_type) == discriminant(&StarSpectralType::O(0))
|| discriminant(&self.spectral_type) == discriminant(&StarSpectralType::B(0))
|| discriminant(&self.spectral_type) == discriminant(&StarSpectralType::A(0))
|| discriminant(&self.spectral_type) == discriminant(&StarSpectralType::F(0))
|| discriminant(&self.spectral_type) == discriminant(&StarSpectralType::G(0))
|| discriminant(&self.spectral_type) == discriminant(&StarSpectralType::K(0))
|| discriminant(&self.spectral_type) == discriminant(&StarSpectralType::M(0))
}
pub fn get_minimum_orbital_separation(&self) -> f64 {
((1.0
- self
.orbit
.clone()
.unwrap_or(Orbit {
..Default::default()
})
.eccentricity) as f64
* self.radius) as f64
}
pub fn get_maximum_orbital_separation(&self) -> f64 {
((1.0
+ self
.orbit
.clone()
.unwrap_or(Orbit {
..Default::default()
})
.eccentricity) as f64
* self.radius) as f64
}
}
pub(crate) fn get_star_color_code(star: &Star) -> &'static str {
match star.spectral_type {
StarSpectralType::WR(_) | StarSpectralType::O(_) => "\x1b[34m", StarSpectralType::B(_) => "\x1b[1;34m", StarSpectralType::A(_) => "\x1b[1;37m", StarSpectralType::F(_) => "\x1b[1;33m", StarSpectralType::G(_) => "\x1b[33m", StarSpectralType::K(_) => "\x1b[1;31m", StarSpectralType::M(_) => "\x1b[31m", StarSpectralType::L(_) | StarSpectralType::T(_) | StarSpectralType::Y(_) => "\x1b[31m", StarSpectralType::DA
| StarSpectralType::DB
| StarSpectralType::DC
| StarSpectralType::DO
| StarSpectralType::DZ
| StarSpectralType::DQ
| StarSpectralType::DX => "\x1b[1;37m", StarSpectralType::XNS => "\x1b[1;34m", _ => "",
}
}