diff options
| author | troido <troido@protonmail.com> | 2020-02-03 15:50:36 +0100 |
|---|---|---|
| committer | troido <troido@protonmail.com> | 2020-02-03 15:50:36 +0100 |
| commit | 4bb710c6c6df8a24a2efa8033ad3c17663345dbd (patch) | |
| tree | 0803959069b625882223fdc765d353adc2b18f32 | |
| parent | 4cf72119121f1b6d3f85a5f4279b6fffaf8138e9 (diff) | |
output is a system now too
| -rw-r--r-- | src/main.rs | 27 | ||||
| -rw-r--r-- | src/resources.rs | 6 | ||||
| -rw-r--r-- | src/room.rs | 37 | ||||
| -rw-r--r-- | src/systems.rs | 57 | ||||
| -rw-r--r-- | src/worldmessages.rs | 11 |
5 files changed, 84 insertions, 54 deletions
diff --git a/src/main.rs b/src/main.rs index 6e64154..3fcb842 100644 --- a/src/main.rs +++ b/src/main.rs @@ -20,8 +20,8 @@ use self::server::unixserver::UnixServer; use self::server::tcpserver::TcpServer; use self::server::Server; use self::assemblages::{Wall, Grass}; +use self::util::ToJson; -use serde_json; fn main() { @@ -47,9 +47,10 @@ fn main() { room.set_input(actions); room.update(); - let (field, mapping) = room.view(); - let updatemsg = create_update_message(room.get_size(), field, mapping); - gameserver.broadcast(updatemsg.as_str()); + let messages = room.view(); + for (player, message) in messages { + let _ = gameserver.send(&player, message.to_json()); + } sleep(Duration::from_millis(100)); } } @@ -73,21 +74,3 @@ fn gen_room(room: &mut room::Room){ } } - -fn create_update_message((width, height): (i32, i32), field: Vec<usize>, mapping: Vec<Vec<String>>) -> String { - let updatemsg= serde_json::json!([ - "world", - [ - [ - "field", - { - "width": width, - "height": height, - "field": field, - "mapping": mapping - } - ] - ] - ]); - updatemsg.to_string() -} diff --git a/src/resources.rs b/src/resources.rs index b35a9d2..dc8f596 100644 --- a/src/resources.rs +++ b/src/resources.rs @@ -5,6 +5,7 @@ use specs::Entity; use super::components::{Position, Visible}; use super::controls::Action; use super::assemblages::Assemblage; +use super::worldmessages::WorldMessage; #[derive(Default)] @@ -13,6 +14,11 @@ pub struct Input { } #[derive(Default)] +pub struct Output { + pub output: HashMap<String, WorldMessage> +} + +#[derive(Default)] pub struct Size { pub width: i32, pub height: i32 diff --git a/src/room.rs b/src/room.rs index fdb7006..9e24c83 100644 --- a/src/room.rs +++ b/src/room.rs @@ -1,4 +1,5 @@ +use std::collections::HashMap; use specs::{ World, @@ -12,9 +13,10 @@ use specs::{ use super::controls::Action; use super::components::Position; use super::assemblages::Assemblage; +use super::worldmessages::WorldMessage; use super::resources::{ Size, - TopView, + Output, Input, NewEntities }; @@ -23,7 +25,8 @@ use super::systems::{ Move, ClearControllers, MakeFloor, - ControlInput + ControlInput, + View }; @@ -40,6 +43,7 @@ impl <'a, 'b>Room<'a, 'b> { let mut world = World::new(); world.insert(Size{width, height}); world.insert(Input{actions: Vec::new()}); + world.insert(Output{output: HashMap::new()}); let mut dispatcher = DispatcherBuilder::new() .with(ControlInput, "controlinput", &[]) @@ -47,6 +51,7 @@ impl <'a, 'b>Room<'a, 'b> { .with(Move, "move", &["makefloor", "controlinput"]) .with(Draw, "draw", &["move"]) .with(ClearControllers, "clearcontrollers", &["move"]) + .with(View, "view", &["draw"]) .build(); dispatcher.setup(&mut world); @@ -57,32 +62,8 @@ impl <'a, 'b>Room<'a, 'b> { } } - pub fn view(&self) -> (Vec<usize>, Vec<Vec<String>>) { - let tv = &*self.world.fetch::<TopView>(); - let (width, height) = self.get_size(); - let size = width * height; - let mut values :Vec<usize> = Vec::with_capacity(size as usize); - let mut mapping: Vec<Vec<String>> = Vec::new(); - for y in 0..height { - for x in 0..width { - let sprites: Vec<String> = match tv.cells.get(&Position{x: x, y: y}) { - Some(sprites) => {sprites.iter().map(|v| v.sprite.clone()).collect()} - None => {vec![]} - }; - values.push( - match mapping.iter().position(|x| x == &sprites) { - Some(index) => { - index - } - None => { - mapping.push(sprites); - mapping.len() - 1 - } - } - ) - } - } - (values, mapping) + pub fn view(&self) -> HashMap<String, WorldMessage> { + self.world.fetch::<Output>().output.clone() } pub fn update(&mut self) { diff --git a/src/systems.rs b/src/systems.rs index ac19b45..41f7d18 100644 --- a/src/systems.rs +++ b/src/systems.rs @@ -1,6 +1,7 @@ use std::collections::{HashMap, HashSet}; + use specs::{ ReadStorage, WriteStorage, @@ -29,9 +30,16 @@ use super::resources::{ Size, Floor, Input, + Output, NewEntities }; +use super::worldmessages::{ + WorldMessage, + WorldUpdate, + FieldMessage +}; + use super::assemblages::Player; @@ -125,3 +133,52 @@ impl <'a> System<'a> for ClearControllers { } } +pub struct View; +impl <'a> System<'a> for View { + type SystemData = (Read<'a, TopView>, Read<'a, Size>, ReadStorage<'a, Played>, Write<'a, Output>); + fn run(&mut self, (topview, size, players, mut output): Self::SystemData) { + + + let width = size.width; + let height = size.height; + let (values, mapping) = draw_room(&topview.cells, (width, height)); + + let message = WorldMessage{updates: vec![WorldUpdate::Field(FieldMessage{ + width, + height, + field: values, + mapping + })]}; + output.output.clear(); + for player in (&players).join() { + output.output.insert(player.name.clone(), message.clone()); + } + } +} + +fn draw_room(cells: &HashMap<Position, Vec<Visible>>, (width, height): (i32, i32)) -> (Vec<usize>, Vec<Vec<String>>){ + let size = width * height; + let mut values :Vec<usize> = Vec::with_capacity(size as usize); + let mut mapping: Vec<Vec<String>> = Vec::new(); + for y in 0..height { + for x in 0..width { + let sprites: Vec<String> = match cells.get(&Position{x: x, y: y}) { + Some(sprites) => {sprites.iter().map(|v| v.sprite.clone()).collect()} + None => {vec![]} + }; + values.push( + match mapping.iter().position(|x| x == &sprites) { + Some(index) => { + index + } + None => { + mapping.push(sprites); + mapping.len() - 1 + } + } + ) + } + } + (values, mapping) +} + diff --git a/src/worldmessages.rs b/src/worldmessages.rs index 1d00028..34b6a6b 100644 --- a/src/worldmessages.rs +++ b/src/worldmessages.rs @@ -4,6 +4,7 @@ use super::util::ToJson; // use serde::Serialize; // #[derive(Serialize)] +#[derive(Clone)] pub struct WorldMessage { pub updates: Vec<WorldUpdate> @@ -16,6 +17,7 @@ impl ToJson for WorldMessage { } } +#[derive(Clone)] pub enum WorldUpdate { Field(FieldMessage) } @@ -28,11 +30,12 @@ impl ToJson for WorldUpdate { } } +#[derive(Clone)] pub struct FieldMessage { - width: i32, - height: i32, - field: Vec<usize>, - mapping: Vec<Vec<String>> + pub width: i32, + pub height: i32, + pub field: Vec<usize>, + pub mapping: Vec<Vec<String>> } |
