summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/main.rs14
-rw-r--r--src/persistence.rs17
-rw-r--r--src/playerid.rs8
-rw-r--r--src/playerstate.rs35
-rw-r--r--src/room.rs22
-rw-r--r--src/roomid.rs15
6 files changed, 72 insertions, 39 deletions
diff --git a/src/main.rs b/src/main.rs
index 73c26ca..6b92077 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -24,13 +24,15 @@ mod encyclopedia;
mod template;
mod roomtemplate;
mod savestate;
+mod playerid;
mod defaultencyclopedia;
mod playerstate;
-mod playerid;
+mod roomid;
mod persistence;
pub use self::pos::Pos;
pub use self::playerid::PlayerId;
+pub use self::roomid::RoomId;
use self::gameserver::GameServer;
use self::server::unixserver::UnixServer;
@@ -63,7 +65,7 @@ fn main() {
let mut room = gen_room();
let storage = FileStorage::new(FileStorage::savedir().expect("couldn't find any save directory"));
- if let Ok(state) = storage.load_room("room".to_string()) {
+ if let Ok(state) = storage.load_room(RoomId::from_str("room")) {
room.load_saved(&state);
println!("loaded saved state successfully");
} else {
@@ -83,9 +85,9 @@ fn main() {
Action::Join(player) => {
let state = match storage.load_player(player.clone()) {
Ok(state) => state,
- Err(_) => PlayerState::new(player.name.clone())
+ Err(_) => PlayerState::new(player.clone())
};
- room.add_player(player.clone(), &state);
+ room.add_player(&state);
}
Action::Leave(player) => {
if let Err(err) = storage.save_player(player.clone(), room.remove_player(player).unwrap()) {
@@ -97,7 +99,7 @@ fn main() {
room.set_input(inputs);
room.update();
if count % 50 == 0 {
- if let Err(err) = storage.save_room(room.name.clone(), room.save()) {
+ if let Err(err) = storage.save_room(room.id.clone(), room.save()) {
println!("{:?}",err);
} else {
println!("{}", room.save().to_json());
@@ -122,7 +124,7 @@ fn main() {
fn gen_room<'a, 'b>() -> Room<'a, 'b> {
let assemblages = default_encyclopedia();
- let mut room = Room::new("room", assemblages);
+ let mut room = Room::new(RoomId::from_str("room"), assemblages);
let roomtemplate = RoomTemplate::from_json(&json!({
"width": 42,
diff --git a/src/persistence.rs b/src/persistence.rs
index 7c15ec0..07ff89b 100644
--- a/src/persistence.rs
+++ b/src/persistence.rs
@@ -6,6 +6,7 @@ use serde_json;
use serde_json::Value;
use crate::{
PlayerId,
+ RoomId,
savestate::SaveState,
playerstate::PlayerState,
util::Result,
@@ -14,11 +15,11 @@ use crate::{
pub trait PersistentStorage {
- fn load_room(&self, name: String) -> Result<SaveState>;
+ fn load_room(&self, id: RoomId) -> Result<SaveState>;
fn load_player(&self, id: PlayerId) -> Result<PlayerState>;
- fn save_room(&self, name: String, state: SaveState) -> Result<()>;
+ fn save_room(&self, id: RoomId, state: SaveState) -> Result<()>;
fn save_player(&self, id: PlayerId, sate: PlayerState) -> Result<()>;
@@ -57,10 +58,10 @@ impl FileStorage {
impl PersistentStorage for FileStorage {
- fn load_room(&self, name: String) -> Result<SaveState> {
+ fn load_room(&self, id: RoomId) -> Result<SaveState> {
let mut path = self.directory.clone();
path.push("rooms");
- let fname = name + ".save.json";
+ let fname = id.to_string() + ".save.json";
path.push(fname);
let text = fs::read_to_string(path)?;
let json: Value = serde_json::from_str(&text)?;
@@ -70,18 +71,18 @@ impl PersistentStorage for FileStorage {
fn load_player(&self, id: PlayerId) -> Result<PlayerState> {
let mut path = self.directory.clone();
path.push("players");
- let fname = id.name + ".save.json";
+ let fname = id.to_string() + ".save.json";
path.push(fname);
let text = fs::read_to_string(path)?;
let json: Value = serde_json::from_str(&text)?;
PlayerState::from_json(&json).ok_or(aerr!("not a valid save state"))
}
- fn save_room(&self, name: String, state: SaveState) -> Result<()> {
+ fn save_room(&self, id: RoomId, state: SaveState) -> Result<()> {
let mut path = self.directory.clone();
path.push("rooms");
fs::create_dir_all(&path)?;
- let fname = name + ".save.json";
+ let fname = id.to_string() + ".save.json";
path.push(fname);
let text = state.to_json().to_string();
// todo: write to a temp file first
@@ -93,7 +94,7 @@ impl PersistentStorage for FileStorage {
let mut path = self.directory.clone();
path.push("players");
fs::create_dir_all(&path)?;
- let fname = id.name + ".save.json";
+ let fname = id.to_string() + ".save.json";
path.push(fname);
let text = state.to_json().to_string();
// todo: write to a temp file first
diff --git a/src/playerid.rs b/src/playerid.rs
index 8402a1c..dcb1f40 100644
--- a/src/playerid.rs
+++ b/src/playerid.rs
@@ -4,3 +4,11 @@ pub struct PlayerId {
pub name: String
}
+impl PlayerId {
+ pub fn from_str(name: &str) -> Self {
+ Self {name: name.to_string()}
+ }
+ pub fn to_string(&self) -> String {
+ self.name.clone()
+ }
+}
diff --git a/src/playerstate.rs b/src/playerstate.rs
index e68e890..d06e3e7 100644
--- a/src/playerstate.rs
+++ b/src/playerstate.rs
@@ -5,13 +5,14 @@ use crate::template::Template;
use crate::{
componentwrapper::{ComponentWrapper, PreEntity},
PlayerId,
+ RoomId,
components::{Visible, Player, Inventory, Health, Item}
};
#[derive(Debug, Clone)]
pub struct PlayerState {
- pub name: String,
- pub room: String,
+ pub id: PlayerId,
+ pub room: Option<RoomId>,
pub inventory_capacity: usize,
pub inventory: Vec<Template>,
pub health: i64,
@@ -20,10 +21,10 @@ pub struct PlayerState {
impl PlayerState {
- pub fn new(name: String) -> Self {
+ pub fn new(id: PlayerId) -> Self {
Self{
- name: name,
- room: String::new(),
+ id: id,
+ room: None,
inventory: Vec::new(),
inventory_capacity: 10,
health: 9,
@@ -31,10 +32,10 @@ impl PlayerState {
}
}
- pub fn create(name: String, room: String, inventory: Vec<Template>, inventory_capacity: usize, health: i64, maximum_health: i64) -> Self {
+ pub fn create(id: PlayerId, room: RoomId, inventory: Vec<Template>, inventory_capacity: usize, health: i64, maximum_health: i64) -> Self {
Self {
- name,
- room,
+ id,
+ room: Some(room),
inventory,
health,
inventory_capacity,
@@ -44,8 +45,11 @@ impl PlayerState {
pub fn to_json(&self) -> Value {
json!({
- "name": self.name,
- "roomname": self.room,
+ "name": self.id.name,
+ "roomname": match &self.room {
+ Some(id) => json!(id.to_string()),
+ None => json!(null)
+ },
"inventory": {
"capacity": self.inventory_capacity,
"items": self.inventory.iter().map(Template::to_json).collect::<Vec<Value>>()
@@ -66,8 +70,11 @@ impl PlayerState {
items.push(Template::from_json(item)?);
}
Some(Self {
- name: val.get("name")?.as_str()?.to_string(),
- room: val.get("roomname")?.as_str()?.to_string(),
+ id: PlayerId{name: val.get("name")?.as_str()?.to_string()},
+ room: match val.get("roomname")? {
+ Value::String(name) => Some(RoomId::from_str(name)),
+ _ => None
+ },
inventory: items,
health: val.get("health")?.as_i64()?,
inventory_capacity: inventory.get("capacity")?.as_i64()? as usize,
@@ -75,10 +82,10 @@ impl PlayerState {
})
}
- pub fn construct(&self, id: PlayerId) -> PreEntity {
+ pub fn construct(&self) -> PreEntity {
vec![
ComponentWrapper::Visible(Visible{sprite: "player".to_string(), height: 1.0}),
- ComponentWrapper::Player(Player::new(id)),
+ ComponentWrapper::Player(Player::new(self.id.clone())),
ComponentWrapper::Inventory(Inventory{
items: self.inventory.iter().map(
|template| Item{ent: template.clone(), name: template.name.clone()}
diff --git a/src/room.rs b/src/room.rs
index 83702fe..00decce 100644
--- a/src/room.rs
+++ b/src/room.rs
@@ -44,7 +44,7 @@ use crate::roomtemplate::RoomTemplate;
use crate::savestate::SaveState;
use crate::template::Template;
use crate::playerstate::PlayerState;
-use crate::{Pos, PlayerId, aerr};
+use crate::{Pos, PlayerId, RoomId, aerr};
use crate::util::Result;
@@ -52,12 +52,12 @@ use crate::util::Result;
pub struct Room<'a, 'b> {
world: World,
dispatcher: Dispatcher<'a, 'b>,
- pub name: String
+ pub id: RoomId
}
impl <'a, 'b>Room<'a, 'b> {
- pub fn new(name: &str, encyclopedia: Encyclopedia) -> Room<'a, 'b> {
+ pub fn new(id: RoomId, encyclopedia: Encyclopedia) -> Room<'a, 'b> {
let mut world = World::new();
world.insert(NewEntities::new(encyclopedia));
world.insert(Players::default());
@@ -80,7 +80,7 @@ impl <'a, 'b>Room<'a, 'b> {
Room {
world,
dispatcher,
- name: name.to_string()
+ id
}
}
@@ -115,8 +115,8 @@ impl <'a, 'b>Room<'a, 'b> {
self.world.fetch_mut::<Input>().actions = actions;
}
- pub fn add_player(&mut self, id: PlayerId, state: &PlayerState){
- let pre_player = state.construct(id.clone());
+ pub fn add_player(&mut self, state: &PlayerState){
+ let pre_player = state.construct();
let spawn = self.world.fetch::<Spawn>().pos;
let mut builder = self.world.create_entity();
let ent = builder.entity;
@@ -124,7 +124,7 @@ impl <'a, 'b>Room<'a, 'b> {
builder = comp.build(builder);
}
builder.with(Position::new(spawn)).with(New).build();
- self.world.fetch_mut::<Players>().entities.insert(id, ent);
+ self.world.fetch_mut::<Players>().entities.insert(state.id.clone(), ent);
}
pub fn remove_player(&mut self, id: PlayerId) -> Result<PlayerState>{
@@ -158,8 +158,8 @@ impl <'a, 'b>Room<'a, 'b> {
let mut saved = HashMap::new();
for (player, inventory, health) in (&players, &inventories, &healths).join() {
saved.insert(player.id.clone(), PlayerState::create(
- player.id.name.clone(),
- self.name.clone(),
+ player.id.clone(),
+ self.id.clone(),
inventory.items.iter().map(|item| item.ent.clone()).collect(),
inventory.capacity,
health.health,
@@ -177,8 +177,8 @@ impl <'a, 'b>Room<'a, 'b> {
let healths = self.world.read_component::<Health>();
let health = healths.get(ent)?;
Some(PlayerState::create(
- player.id.name.clone(),
- self.name.clone(),
+ player.id.clone(),
+ self.id.clone(),
inventory.items.iter().map(|item| item.ent.clone()).collect(),
inventory.capacity,
health.health,
diff --git a/src/roomid.rs b/src/roomid.rs
new file mode 100644
index 0000000..1f356fa
--- /dev/null
+++ b/src/roomid.rs
@@ -0,0 +1,15 @@
+
+#[derive(Debug, PartialEq, Eq, Clone, Hash)]
+pub struct RoomId {
+ pub name: String
+}
+
+impl RoomId {
+ pub fn from_str(name: &str) -> Self {
+ Self {name: name.to_string()}
+ }
+ pub fn to_string(&self) -> String {
+ self.name.clone()
+ }
+}
+