66 lines
1.4 KiB
Rust
66 lines
1.4 KiB
Rust
use crate::network::{NetworkMessage, NetworkPayload};
|
|
use async_std::sync::Arc;
|
|
use async_std::sync::RwLock;
|
|
use async_std::sync::{Receiver, Sender};
|
|
use shipyard::{error, World};
|
|
use std::collections::HashMap;
|
|
|
|
pub struct Player {}
|
|
|
|
pub struct Game {
|
|
world: World,
|
|
players: HashMap<usize, Player>,
|
|
net_out: Sender<NetworkMessage>,
|
|
}
|
|
|
|
impl Game {
|
|
pub fn new(net_out: Sender<NetworkMessage>) -> Self {
|
|
// Create world
|
|
let world = World::default();
|
|
|
|
// Create init workload
|
|
world.run(|| {
|
|
//todo
|
|
});
|
|
|
|
// Create update workload
|
|
world.add_workload("update").build();
|
|
|
|
Game {
|
|
world,
|
|
players: HashMap::new(),
|
|
net_out,
|
|
}
|
|
}
|
|
|
|
pub fn update(&self) -> Result<(), error::RunWorkload> {
|
|
self.world.try_run_workload("update")
|
|
}
|
|
|
|
pub async fn read_loop(game: Arc<RwLock<Self>>, net_in: Receiver<NetworkMessage>) {
|
|
loop {
|
|
let message = net_in.recv().await.expect("could not read from channel");
|
|
match message.data {
|
|
NetworkPayload::Connected => {
|
|
log::info!("[{:?}] connected", &message.conn_id);
|
|
game.write()
|
|
.await
|
|
.players
|
|
.insert(message.conn_id, Player {});
|
|
}
|
|
NetworkPayload::Message(msg) => {
|
|
log::info!("[{:?}] said {:?}", &message.conn_id, msg);
|
|
game.write()
|
|
.await
|
|
.net_out
|
|
.send(NetworkMessage {
|
|
conn_id: message.conn_id,
|
|
data: NetworkPayload::Message(tungstenite::Message::text("hello")),
|
|
})
|
|
.await;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|