use std::collections::HashMap;
use screeps::{LocalRoomTerrain, RoomName};
#[derive(Debug, Clone)]
pub struct TerrainCache {
cache: HashMap<RoomName, LocalRoomTerrain>,
}
impl Default for TerrainCache {
fn default() -> Self {
Self::new()
}
}
impl TerrainCache {
pub fn new() -> Self {
Self {
cache: HashMap::new(),
}
}
pub fn get_cached_terrain(&self, room_name: &RoomName) -> Option<&LocalRoomTerrain> {
self.cache.get(room_name)
}
pub fn is_terrain_cached(&self, room_name: &RoomName) -> bool {
self.cache.contains_key(room_name)
}
pub fn get_terrain(&mut self, room_name: &RoomName) -> Option<&LocalRoomTerrain> {
if !self.is_terrain_cached(room_name) {
let js_terrain_opt = screeps::objects::RoomTerrain::new(*room_name);
if let Some(js_terrain) = js_terrain_opt {
let local_terrain = screeps::local::LocalRoomTerrain::from(js_terrain);
let _ = self.cache.insert(*room_name, local_terrain);
}
}
self.get_cached_terrain(room_name)
}
pub fn update_cached_terrain(&mut self, room_name: RoomName, local_terrain: LocalRoomTerrain) {
let _ = self.cache.insert(room_name, local_terrain);
}
pub fn remove_cached_terrain(&mut self, room_name: &RoomName) {
self.cache.remove(room_name);
}
}