tavern_keeper/src/world.rs

107 lines
2.5 KiB
Rust
Raw Normal View History

2023-01-04 18:02:44 +00:00
use std::collections::HashMap;
2022-12-31 07:54:18 +00:00
2023-01-04 18:02:44 +00:00
use crate::{entity::{Location, EntityId}, site::Site};
2022-12-31 07:54:18 +00:00
2022-12-30 20:30:12 +00:00
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
2022-12-30 20:13:35 +00:00
pub enum Terrain {
2022-12-30 20:30:12 +00:00
Void,
2022-12-30 20:13:35 +00:00
DeepOcean,
Ocean,
Beach,
Flats,
Hills,
Mountains,
HighMountains,
}
2022-12-30 20:30:12 +00:00
pub struct WorldCell {
pub terrain: Terrain,
}
2022-12-30 20:13:35 +00:00
pub struct World {
2022-12-30 20:30:12 +00:00
pub map: Vec<Vec<WorldCell>>,
2022-12-30 20:13:35 +00:00
pub size: usize,
2023-01-04 16:52:58 +00:00
pub sites: HashMap<Location, Site>
2022-12-30 20:13:35 +00:00
}
2022-12-30 20:30:12 +00:00
impl WorldCell {
pub fn new(terrain: Terrain) -> WorldCell {
WorldCell {
terrain: terrain,
}
}
}
2022-12-30 20:13:35 +00:00
impl World {
pub fn new(size: usize) -> World {
let mut map = Vec::new();
for _ in 0..size {
let mut row = Vec::new();
for _ in 0..size {
2022-12-30 20:30:12 +00:00
row.push(WorldCell::new(Terrain::Void));
2022-12-30 20:13:35 +00:00
}
map.push(row);
}
World {
map: map,
size: size,
2023-01-04 16:52:58 +00:00
sites: HashMap::new(),
2022-12-30 20:13:35 +00:00
}
}
2022-12-30 20:30:12 +00:00
2023-01-04 16:52:58 +00:00
pub fn add_site(&mut self, mut site: Site) -> EntityId{
let id = self.sites.len() as EntityId;
site.entity.id = id;
self.sites.insert(site.entity.loc, site);
return id;
2022-12-30 20:30:12 +00:00
}
2022-12-31 08:38:01 +00:00
2023-01-04 16:52:58 +00:00
pub fn get_site_location(&self, site_id: EntityId) -> Location {
for (loc, site) in self.sites.iter() {
if site.entity.id == site_id {
return *loc;
2022-12-31 08:38:01 +00:00
}
}
panic!("Town not found");
}
2022-12-31 13:03:24 +00:00
2023-01-04 16:52:58 +00:00
pub fn get_site_at(&self, pos: Location) -> Option<&Site> {
return self.sites.get(&pos);
2022-12-31 15:04:07 +00:00
}
2022-12-30 20:13:35 +00:00
}
impl Terrain {
pub fn from_height(height: f64) -> Terrain {
if height < -2000.0 {
Terrain::DeepOcean
} else if height < 0.0 {
Terrain::Ocean
} else if height < 50.0 {
Terrain::Beach
} else if height < 1000.0 {
Terrain::Flats
} else if height < 2000.0 {
Terrain::Hills
} else if height < 3500.0 {
Terrain::Mountains
} else {
Terrain::HighMountains
}
}
pub fn to_color(self) -> [u8; 3] {
match self {
2022-12-30 20:30:12 +00:00
Terrain::Void => [0, 0, 0],
2022-12-30 20:13:35 +00:00
Terrain::DeepOcean => [20, 60, 255],
Terrain::Ocean => [20, 120, 255],
Terrain::Beach => [255, 255, 100],
Terrain::Flats => [0, 204, 0],
Terrain::Hills => [102, 153, 0],
Terrain::Mountains => [153, 153, 102],
Terrain::HighMountains => [230, 230, 230],
}
}
}