diff options
Diffstat (limited to 'src/game')
-rw-r--r-- | src/game/server.rs | 26 |
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)); } _ => { |