odyssey-server/src/game.rs

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;
}
}
}
}
}