1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
use core::borrow::Borrow; use screeps::RoomName; pub struct Colony { _source: screeps::Room, spawns: Vec<String>, name: RoomName, stage: ColonyStage, } impl Colony { pub fn from(room: screeps::Room) -> Colony { let _source = room.borrow(); let name: RoomName = _source.name(); let memory = room.memory().dict_or_create("colony").unwrap(); if !memory.bool("stage") { memory.set("stage", ColonyStage::Bootstrap.as_str()) } Colony { _source: room, spawns: vec![], name, stage: ColonyStage::from_string(memory.string("stage").unwrap().unwrap()), } } pub fn register_spawn(&mut self, spawn_id: String) { self.spawns.push(spawn_id); } pub fn name(&self) -> &RoomName { self.name.borrow() } pub fn stage(&self) -> &ColonyStage { self.stage.borrow() } pub fn room(&self) -> &screeps::Room { self._source.borrow() } pub fn spawns(&self) -> &Vec<String> { self.spawns.borrow() } } pub enum ColonyStage { Bootstrap, Running, } impl ColonyStage { pub fn from_string(stage: String) -> ColonyStage { match stage.as_str() { "bootstrap" => ColonyStage::Bootstrap, "running" => ColonyStage::Running, _ => ColonyStage::Bootstrap, } } pub fn as_str(&self) -> &str { match self { ColonyStage::Bootstrap => "bootstrap", ColonyStage::Running => "running", } } }