use crate::internal::*;
use crate::prelude::*;
pub mod generator;
#[derive(
Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug, SmartDefault, Serialize, Deserialize,
)]
pub struct GalacticMapDivision {
#[default("default")]
pub name: Rc<str>,
pub region: GalacticRegion,
pub level: u8,
pub x: u8,
pub y: u8,
pub z: u8,
pub index: SpaceCoordinates,
size: SpaceCoordinates,
}
impl GalacticMapDivision {
pub fn new(
name: Rc<str>,
region: GalacticRegion,
level: u8,
x: u8,
y: u8,
z: u8,
index: SpaceCoordinates,
) -> Self {
Self {
name,
region,
level,
x,
y,
z,
index,
size: SpaceCoordinates::new(-1, -1, -1),
}
}
pub fn get_top_left_up(&self, galaxy: &Galaxy) -> SpaceCoordinates {
self.index.rel(galaxy.get_galactic_start())
}
pub fn get_center(&mut self, galaxy: &Galaxy) -> SpaceCoordinates {
self.get_top_left_up(galaxy)
+ (self.get_bottom_right_down(galaxy) - self.get_top_left_up(galaxy))
.abs(galaxy.get_galactic_start())
/ SpaceCoordinates::new(2, 2, 2)
}
pub fn get_bottom_right_down(&mut self, galaxy: &Galaxy) -> SpaceCoordinates {
self.index.rel(galaxy.get_galactic_start()) + self.get_size(galaxy)
}
pub fn get_width(&mut self, galaxy: &Galaxy) -> i64 {
self.get_size(galaxy).x
}
pub fn get_height(&mut self, galaxy: &Galaxy) -> i64 {
self.get_size(galaxy).y
}
pub fn get_depth(&mut self, galaxy: &Galaxy) -> i64 {
self.get_size(galaxy).z
}
pub fn get_size(&mut self, galaxy: &Galaxy) -> SpaceCoordinates {
if self.size.x < 1 || self.size.y < 1 || self.size.z < 1 {
let mut size = SpaceCoordinates::new(1, 1, 1);
galaxy
.division_levels
.clone()
.iter()
.filter(|l| l.level <= self.level)
.for_each(|l| {
size = size
* SpaceCoordinates::new(
l.x_subdivisions as i64,
l.y_subdivisions as i64,
l.z_subdivisions as i64,
);
});
self.size = size;
}
self.size
}
}