summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortroido <troido@protonmail.com>2020-02-03 15:50:36 +0100
committertroido <troido@protonmail.com>2020-02-03 15:50:36 +0100
commit4bb710c6c6df8a24a2efa8033ad3c17663345dbd (patch)
tree0803959069b625882223fdc765d353adc2b18f32
parent4cf72119121f1b6d3f85a5f4279b6fffaf8138e9 (diff)
output is a system now too
-rw-r--r--src/main.rs27
-rw-r--r--src/resources.rs6
-rw-r--r--src/room.rs37
-rw-r--r--src/systems.rs57
-rw-r--r--src/worldmessages.rs11
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>>
}