aboutsummaryrefslogtreecommitdiff
path: root/src/game/server.rs
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2024-06-04 21:53:00 +0200
committermetamuffin <metamuffin@disroot.org>2024-06-04 21:53:00 +0200
commitd50cbd513c7208cb2a5c13571a964544b9470017 (patch)
tree1d6e19928713d592b01bf1652285c49789f32051 /src/game/server.rs
parent5063701929569fe37ca4b8659bd52981f8e7b77c (diff)
downloadgpn-tron-rust-d50cbd513c7208cb2a5c13571a964544b9470017.tar
gpn-tron-rust-d50cbd513c7208cb2a5c13571a964544b9470017.tar.bz2
gpn-tron-rust-d50cbd513c7208cb2a5c13571a964544b9470017.tar.zst
show chat and winners
Diffstat (limited to 'src/game/server.rs')
-rw-r--r--src/game/server.rs26
1 files changed, 11 insertions, 15 deletions
diff --git a/src/game/server.rs b/src/game/server.rs
index 2cc5d43..65a5cc9 100644
--- a/src/game/server.rs
+++ b/src/game/server.rs
@@ -37,25 +37,16 @@ async fn game_loop(config: Config, state: Arc<State>) {
let res = g.tick();
match res {
ControlFlow::Continue(()) => {
- let _ = state.tick.send(false);
+ let _ = state.tick.send(None);
speed += config.tickrate_speedup;
speed = speed.min(config.tickrate_max)
}
ControlFlow::Break(winner) => {
info!("winner: {winner:?}");
- if let Some(winner) = winner {
- if let Some(winner) = state.players.write().await.get(&winner).cloned() {
- let mut h = state.win_history.write().await;
- h.push_front(winner);
- while h.len() > 64 {
- h.pop_back();
- }
- }
- }
let p = state.players.read().await;
*g = Game::new(p.clone().into_iter().collect());
speed = config.tickrate;
- let _ = state.tick.send(true);
+ let _ = state.tick.send(Some(winner));
}
}
drop(g);
@@ -126,12 +117,12 @@ async fn handle_tick(
mut tx: impl AsyncWrite + Unpin,
cstate: &mut ClientState,
state: &Arc<State>,
- new_game: bool,
+ new_game: Option<Option<u32>>,
) -> anyhow::Result<()> {
let Some(pid) = cstate.pid else { return Ok(()) };
let mut events = Vec::new();
- if new_game {
- if cstate.alive {
+ if let Some(winner) = new_game {
+ if winner == cstate.pid {
tx.send_packet(Packet::Win(0, 0)).await?;
}
cstate.alive = true;
@@ -141,7 +132,7 @@ async fn handle_tick(
}
{
let g = state.game.read().await;
- if new_game {
+ if new_game.is_some() {
events.push(Packet::Game {
my_id: pid,
width: g.map.size.x as usize,
@@ -235,6 +226,11 @@ async fn handle_packet(
}
}
Packet::Chat(message) => {
+ if message.len() > 128 {
+ tx.send_packet(Packet::Error("chat message too long (> 128)".to_string()))
+ .await?;
+ return Ok(());
+ }
let _ = state.chat.send(("".to_string(), message));
}
_ => {