rust/landgen/src/outline_template_based/outline_template.rs
author unC0Rr
Mon, 13 Feb 2023 12:31:30 +0100
branchtransitional_engine
changeset 15922 da6b67f13c12
parent 15921 5f00829c55ec
permissions -rw-r--r--
Refactor mapgen to allow for easy switching between generators

use integral_geometry::{Point, Rect, Size};

#[derive(Clone, Debug)]
pub struct OutlineTemplate {
    pub islands: Vec<Vec<Rect>>,
    pub fill_points: Vec<Point>,
    pub size: Size,
    pub can_flip: bool,
    pub can_invert: bool,
    pub can_mirror: bool,
    pub is_negative: bool,
}

impl OutlineTemplate {
    pub fn new(size: Size) -> Self {
        OutlineTemplate {
            size,
            islands: Vec::new(),
            fill_points: Vec::new(),
            can_flip: false,
            can_invert: false,
            can_mirror: false,
            is_negative: false,
        }
    }

    pub fn flippable(self) -> Self {
        Self {
            can_flip: true,
            ..self
        }
    }

    pub fn mirrorable(self) -> Self {
        Self {
            can_mirror: true,
            ..self
        }
    }

    pub fn invertable(self) -> Self {
        Self {
            can_invert: true,
            ..self
        }
    }

    pub fn negative(self) -> Self {
        Self {
            is_negative: true,
            ..self
        }
    }

    pub fn with_fill_points(self, fill_points: Vec<Point>) -> Self {
        Self {
            fill_points,
            ..self
        }
    }

    pub fn with_islands(self, islands: Vec<Vec<Rect>>) -> Self {
        Self { islands, ..self }
    }

    pub fn add_fill_points(mut self, points: &[Point]) -> Self {
        self.fill_points.extend_from_slice(points);
        self
    }

    pub fn add_island(mut self, island: &[Rect]) -> Self {
        self.islands.push(island.into());
        self
    }
}