summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortroido <troido@protonmail.com>2020-04-03 23:25:20 +0200
committertroido <troido@protonmail.com>2020-04-03 23:25:20 +0200
commit0b17829846adf9482b460e4cc616382ede1df6dd (patch)
tree2f02dd93b1cd4cd7615341644ddeb94ed0dfc422
parentdb473bbab28847bed5f26fb443ef8a1db2d932a3 (diff)
private rooms work!
-rw-r--r--content/maps/_home.json79
-rw-r--r--content/maps/room.json3
-rw-r--r--src/purgatory.rs4
-rw-r--r--src/roomid.rs6
-rw-r--r--src/systems/migrate.rs4
-rw-r--r--src/world.rs17
-rw-r--r--src/worldloader.rs2
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)?;