use std::collections::HashMap;
use self::property::Property;
pub use self::property::Size;
pub use self::tile::Tile;
#[macro_use]
pub mod tile;
mod property;
pub struct World<T> {
tiles: Vec<Tile<T>>,
size: Size
}
impl<T> Default for World<T> {
fn default() -> World<T> {
World {
tiles: Vec::new(),
size: Default::default()
}
}
}
impl<T: Clone> World<T> {
pub fn new() -> World<T> {
World {
tiles: Vec::new(),
..Default::default()
}
}
pub fn add(self, tile: Tile<T>) -> World<T> {
let mut new = self;
new.tiles.push(tile);
new
}
pub fn set<P: Property>(self, property: P) -> World<T> {
property.set_to(self)
}
pub fn set_size(self, size: Size) -> World<T> {
let mut new = self;
new.size = size;
new
}
pub fn generate(&self, chunk_x: i64, chunk_y: i64) -> Option<Vec<Vec<T>>> {
let mut nms = HashMap::new();
(chunk_y * self.size.h .. (chunk_y + 1) * self.size.h).map(|y|
(chunk_x * self.size.w .. (chunk_x + 1) * self.size.w).map(|x| {
match self.tiles.iter().find(|tile| tile.satisfied_by(x, y, self.size, chunk_x, chunk_y, &mut nms)) {
Some(tile) => Some(tile.value()),
None => None
}
}
).collect()
).collect()
}
}