diff options
| author | troido <troido@protonmail.com> | 2020-02-21 19:43:43 +0100 |
|---|---|---|
| committer | troido <troido@protonmail.com> | 2020-02-21 19:43:43 +0100 |
| commit | 1f85c11d0ebb0a879b7825b8e78e473a77d8b778 (patch) | |
| tree | a1d4d274bd107bddefa425fdf255cbdc123cd904 | |
| parent | 4ed2d71e76f04c75a214e43363dc1b64e109fe3d (diff) | |
sprites are not strings anymore
| -rw-r--r-- | src/components.rs | 4 | ||||
| -rw-r--r-- | src/componentwrapper.rs | 4 | ||||
| -rw-r--r-- | src/main.rs | 2 | ||||
| -rw-r--r-- | src/playerstate.rs | 5 | ||||
| -rw-r--r-- | src/sprite.rs | 16 | ||||
| -rw-r--r-- | src/systems/view.rs | 12 | ||||
| -rw-r--r-- | src/worldmessages.rs | 9 |
7 files changed, 36 insertions, 16 deletions
diff --git a/src/components.rs b/src/components.rs index 60b32d6..2adddaa 100644 --- a/src/components.rs +++ b/src/components.rs @@ -7,7 +7,7 @@ use specs::{ Component }; -use crate::{Pos, PlayerId, RoomId}; +use crate::{Pos, PlayerId, RoomId, Sprite}; use crate::controls::Control; use crate::template::Template; @@ -28,7 +28,7 @@ impl Component for Position { #[derive(Debug, Clone)] pub struct Visible { - pub sprite: String, + pub sprite: Sprite, pub height: f64 } impl Component for Visible { diff --git a/src/componentwrapper.rs b/src/componentwrapper.rs index 9e98332..8ee4e0b 100644 --- a/src/componentwrapper.rs +++ b/src/componentwrapper.rs @@ -2,7 +2,7 @@ use std::collections::HashMap; use specs::Builder; -use crate::{PlayerId, RoomId}; +use crate::{PlayerId, RoomId, Sprite}; use crate::components::{Visible, Blocking, Player, Floor, Item, Inventory, Health, Serialise, RoomExit}; use crate::parameter::{Parameter, ParameterType}; @@ -86,7 +86,7 @@ macro_rules! components { components!( Visible (sprite: String, height: Float) { Visible { - sprite, + sprite: Sprite{name: sprite}, height } }; diff --git a/src/main.rs b/src/main.rs index 6da6d57..b0ffb77 100644 --- a/src/main.rs +++ b/src/main.rs @@ -30,11 +30,13 @@ mod roomid; mod persistence; mod worldloader; mod world; +mod sprite; pub use self::pos::Pos; pub use self::playerid::PlayerId; pub use self::roomid::RoomId; pub use self::util::Result; +pub use self::sprite::Sprite; use self::gameserver::GameServer; use self::server::unixserver::UnixServer; diff --git a/src/playerstate.rs b/src/playerstate.rs index f167d36..2103f22 100644 --- a/src/playerstate.rs +++ b/src/playerstate.rs @@ -8,7 +8,8 @@ use crate::{ RoomId, components::{Visible, Player, Inventory, Health, Item}, Result, - aerr + aerr, + Sprite }; #[derive(Debug, Clone)] @@ -86,7 +87,7 @@ impl PlayerState { pub fn construct(&self) -> PreEntity { vec![ - ComponentWrapper::Visible(Visible{sprite: "player".to_string(), height: 1.0}), + ComponentWrapper::Visible(Visible{sprite: Sprite{name: "player".to_string()}, height: 1.0}), ComponentWrapper::Player(Player::new(self.id.clone())), ComponentWrapper::Inventory(Inventory{ items: self.inventory.iter().map( diff --git a/src/sprite.rs b/src/sprite.rs new file mode 100644 index 0000000..d6f40ca --- /dev/null +++ b/src/sprite.rs @@ -0,0 +1,16 @@ + +use serde::{Serialize, Serializer}; + +#[derive(Debug, Clone, PartialEq)] +pub struct Sprite { + pub name: String +} + +impl Serialize for Sprite { + fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> + where + S: Serializer, + { + serializer.serialize_str(self.name.as_str()) + } +} diff --git a/src/systems/view.rs b/src/systems/view.rs index c452b2f..f82ae0a 100644 --- a/src/systems/view.rs +++ b/src/systems/view.rs @@ -11,7 +11,7 @@ use specs::{ Entity }; -use crate::Pos; +use crate::{Pos, Sprite}; use crate::components::{Visible, Player, Position, Inventory, New, Moved, Removed, Health}; use crate::resources::{Size, Output, Ground}; use crate::worldmessages::{WorldMessage, WorldUpdate, FieldMessage}; @@ -51,7 +51,7 @@ impl <'a> System<'a> for View { let has_changed: bool = !changed.is_empty(); - let mut changes: Vec<(Pos, Vec<String>)> = Vec::new(); + let mut changes: Vec<(Pos, Vec<Sprite>)> = Vec::new(); for pos in changed { changes.push((pos, cell_sprites(ground.cells.get(&pos).unwrap_or(&HashSet::new()), &visible))); } @@ -87,20 +87,20 @@ impl <'a> System<'a> for View { } } -fn cell_sprites(entities: &HashSet<Entity>, visible: &ReadStorage<Visible>) -> Vec<String> { +fn cell_sprites(entities: &HashSet<Entity>, visible: &ReadStorage<Visible>) -> Vec<Sprite> { let mut visibles: Vec<&Visible> = entities.iter().filter_map(|ent| visible.get(*ent)).collect(); visibles.sort_by(|a, b| b.height.partial_cmp(&a.height).unwrap()); visibles.iter().map(|vis| vis.sprite.clone()).collect() } -fn draw_room(ground: &HashMap<Pos, HashSet<Entity>>, (width, height): (i64, i64), visible: &ReadStorage<Visible>) -> (Vec<usize>, Vec<Vec<String>>){ +fn draw_room(ground: &HashMap<Pos, HashSet<Entity>>, (width, height): (i64, i64), visible: &ReadStorage<Visible>) -> (Vec<usize>, Vec<Vec<Sprite>>){ let size = width * height; let mut values :Vec<usize> = Vec::with_capacity(size as usize); - let mut mapping: Vec<Vec<String>> = Vec::new(); + let mut mapping: Vec<Vec<Sprite>> = Vec::new(); for y in 0..height { for x in 0..width { - let sprites: Vec<String> = match ground.get(&Pos{x, y}) { + let sprites: Vec<Sprite> = match ground.get(&Pos{x, y}) { Some(ents) => {cell_sprites(ents, visible)} None => {vec![]} }; diff --git a/src/worldmessages.rs b/src/worldmessages.rs index 39eee6a..2e80763 100644 --- a/src/worldmessages.rs +++ b/src/worldmessages.rs @@ -1,8 +1,9 @@ use serde_json::{Value, json}; use serde::Serialize; -use super::util::ToJson; -use super::pos::Pos; +use crate::util::ToJson; +use crate::{Pos, Sprite}; + #[derive(Debug, Clone)] pub struct WorldMessage { @@ -20,7 +21,7 @@ impl ToJson for WorldMessage { pub enum WorldUpdate { Field(FieldMessage), Pos(Pos), - Change(Vec<(Pos, Vec<String>)>), + Change(Vec<(Pos, Vec<Sprite>)>), Inventory(Vec<String>), Health(i64, i64) } @@ -42,7 +43,7 @@ pub struct FieldMessage { pub width: i64, pub height: i64, pub field: Vec<usize>, - pub mapping: Vec<Vec<String>> + pub mapping: Vec<Vec<Sprite>> } |
