diff options
| author | troido <troido@protonmail.com> | 2020-04-03 23:25:20 +0200 |
|---|---|---|
| committer | troido <troido@protonmail.com> | 2020-04-03 23:25:20 +0200 |
| commit | 0b17829846adf9482b460e4cc616382ede1df6dd (patch) | |
| tree | 2f02dd93b1cd4cd7615341644ddeb94ed0dfc422 | |
| parent | db473bbab28847bed5f26fb443ef8a1db2d932a3 (diff) | |
private rooms work!
| -rw-r--r-- | content/maps/_home.json | 79 | ||||
| -rw-r--r-- | content/maps/room.json | 3 | ||||
| -rw-r--r-- | src/purgatory.rs | 4 | ||||
| -rw-r--r-- | src/roomid.rs | 6 | ||||
| -rw-r--r-- | src/systems/migrate.rs | 4 | ||||
| -rw-r--r-- | src/world.rs | 17 | ||||
| -rw-r--r-- | src/worldloader.rs | 2 |
7 files changed, 104 insertions, 11 deletions
diff --git a/content/maps/_home.json b/content/maps/_home.json new file mode 100644 index 0000000..656ad94 --- /dev/null +++ b/content/maps/_home.json @@ -0,0 +1,79 @@ +{ + "width": 64, + "height": 64, + "spawn": [63,0], + "places": {}, + "field":[ + ",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%", + ",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,", + ",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,", + ",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,", + ",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,", + ",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,", + ",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,", + ",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,", + ",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,", + ",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,", + ",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,", + ",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,", + ",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,", + ",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,", + ",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,", + ",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,", + ",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,", + ",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,", + ",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,", + ",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,", + ",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,", + ",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,", + ",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,", + ",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,", + ",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,", + ",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,", + ",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,", + ",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,", + ",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,", + ",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,", + ",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,", + ",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,", + ",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,", + ",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,", + ",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,", + ",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,", + ",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,", + ",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,", + ",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,", + ",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,", + ",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,", + ",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,", + ",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,", + ",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,", + ",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,", + ",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,", + ",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,", + ",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,", + ",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,", + ",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,", + ",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,", + ",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,", + ",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,", + ",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,", + ",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,", + ",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,", + ",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,", + ",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,", + ",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,", + ",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,", + ",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,", + ",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,", + ",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,", + ",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," + ], + "mapping": { + ",": ["grass"], + "%": [{ + "type": "portal", + "kwargs": {"destination": "room"} + }, "ground"] + } +} diff --git a/content/maps/room.json b/content/maps/room.json index cbf7bdc..275100f 100644 --- a/content/maps/room.json +++ b/content/maps/room.json @@ -22,7 +22,7 @@ "X,oo,,.,,,d,,,,,,,~~~~,,,,,,,,,,f,,,,f,,,X", "X,,*,,.,,,,,,,,,,,~~~''''''''''''''''f'''X", "X*,,,,.,,,d,VVV,,,~~~'''''''''''f''''f'''X", - "X,,,,,.,,,,,VVV,,,~~~'''''''''''ffffff'''X", + "1,,,,,.,,,,,VVV,,,~~~'''''''''''ffffff'''X", "X/,,,,.,,,,,VVV,,,~~~''''''''''''''''''''X", "XXXXX,.,XXXXXXXXXX~~~XXXXXXXXXXXXXXXXXXXXX", " %%% " @@ -41,6 +41,7 @@ "*": ["grass", {"type": "spawner", "kwargs": {"template": {"type": "pebble"}, "delay": 600}}], "o": ["grass", {"type": "spawner", "kwargs": {"template": {"type": "stone"}, "delay": 600}}], "%": {"type": "portal", "kwargs": {"destination": "broom", "dest_pos": "northentry"}}, + "1": {"type": "portal", "kwargs": {"destination": "_home+{player}"}}, "^": ["grass", "spiketrap"], "d": ["grass", {"type": "spawner", "kwargs": {"template": {"type": "dummy"}, "delay": 100}}], "r": ["grass", {"type": "spawner", "kwargs": {"template": {"type": "rat"}, "amount": 3, "clan": "rats", "delay": 200}}], diff --git a/src/purgatory.rs b/src/purgatory.rs index b4d8666..04024db 100644 --- a/src/purgatory.rs +++ b/src/purgatory.rs @@ -26,7 +26,7 @@ pub fn purgatory_id() -> RoomId { RoomId{name: String::from("+")} } -pub fn create_purgatory<'a, 'b>(encyclopedia: Encyclopedia) -> Room<'a, 'b> { +pub fn create_purgatory<'a, 'b>(encyclopedia: &Encyclopedia) -> Room<'a, 'b> { let dispatcher = DispatcherBuilder::new() .with(Volate, "volate", &[]) .with(RegisterNew::default(), "registernew", &[]) @@ -38,7 +38,7 @@ pub fn create_purgatory<'a, 'b>(encyclopedia: Encyclopedia) -> Room<'a, 'b> { .with(Create, "create", &["view"]) .with(Remove, "remove", &["view", "move"]) .build(); - let mut room = Room::new(purgatory_id(), encyclopedia, dispatcher); + let mut room = Room::new(purgatory_id(), encyclopedia.clone(), dispatcher); room.load_from_template(&RoomTemplate::from_json(&json!({ "width": 15, "height": 20, diff --git a/src/roomid.rs b/src/roomid.rs index 1f356fa..d3c0b17 100644 --- a/src/roomid.rs +++ b/src/roomid.rs @@ -1,4 +1,6 @@ +use std::collections::HashMap; + #[derive(Debug, PartialEq, Eq, Clone, Hash)] pub struct RoomId { pub name: String @@ -11,5 +13,9 @@ impl RoomId { pub fn to_string(&self) -> String { self.name.clone() } + pub fn format(&self, dict: HashMap<&str, &str>) -> Self { + let name = dict.into_iter().fold(self.name.clone(), |name, (from, to)| name.replace(from, to)); + Self {name} + } } diff --git a/src/systems/migrate.rs b/src/systems/migrate.rs index 80690f3..f9019d8 100644 --- a/src/systems/migrate.rs +++ b/src/systems/migrate.rs @@ -1,4 +1,5 @@ +use crate::hashmap; use specs::{ ReadStorage, Read, @@ -27,7 +28,8 @@ impl <'a> System<'a> for Migrate { for (player, position, _moved) in (&players, &positions, &moved).join() { for ent in ground.cells.get(&position.pos).unwrap() { if let Some(exit) = exits.get(*ent) { - emigration.emigrants.push((player.id.clone(), exit.destination.clone(), exit.dest_pos.clone())); + let destination = exit.destination.format(hashmap!("{player}" => player.id.name.as_str())); + emigration.emigrants.push((player.id.clone(), destination, exit.dest_pos.clone())); break; } } diff --git a/src/world.rs b/src/world.rs index cdcbff1..71a4eb7 100644 --- a/src/world.rs +++ b/src/world.rs @@ -1,6 +1,5 @@ use std::collections::HashMap; -use crate::hashmap; use crate::{ PlayerId, @@ -39,7 +38,7 @@ impl <'a, 'b>World<'a, 'b> { default_room, encyclopedia: encyclopedia.clone(), players: HashMap::new(), - rooms: hashmap!(purgatory::purgatory_id() => purgatory::create_purgatory(encyclopedia)), + rooms: HashMap::new(), room_age: HashMap::new() } } @@ -55,12 +54,17 @@ impl <'a, 'b>World<'a, 'b> { fn get_room_mut_(&mut self, id: &RoomId) -> Result<&mut Room<'a, 'b>> { if !self.rooms.contains_key(id){ - let template = self.template_loader.load_room(id.clone())?; - let mut room: Room = Room::create(id.clone(), &self.encyclopedia, &template); + println!("loading room '{}'", id.name); + let mut room: Room = if id == &purgatory::purgatory_id() { + purgatory::create_purgatory(&self.encyclopedia) + } else { + let template = self.template_loader.load_room(id.clone())?; + Room::create(id.clone(), &self.encyclopedia, &template) + }; if let Ok(state) = self.persistence.load_room(id.clone()){ room.load_saved(&state); } - let last_time = self.time - 1; + let last_time = self.time - 1; if room.get_time() < last_time { room.update(last_time); } @@ -180,12 +184,13 @@ impl <'a, 'b>World<'a, 'b> { } else { let age = *self.room_age.get(&roomid).unwrap_or(&0) + 1; self.room_age.insert(roomid.clone(), age); - if age > 10 { + if age > 2 { to_remove.push(roomid.clone()); } } } for roomid in to_remove { + println!("unloading room '{}'", roomid.name); self.rooms.remove(&roomid); } } diff --git a/src/worldloader.rs b/src/worldloader.rs index 2d7ae69..683a310 100644 --- a/src/worldloader.rs +++ b/src/worldloader.rs @@ -22,7 +22,7 @@ impl WorldLoader { } pub fn load_room(&self, id: RoomId) -> Result<RoomTemplate> { - let fname = id.to_string() + ".json"; + let fname = id.name.splitn(2, '+').next().unwrap().to_string() + ".json"; let path = self.directory.join(fname); let text = fs::read_to_string(path)?; let json: Value = serde_json::from_str(&text)?; |
