From c56c6ed9c2a81600f695e4ae9d3c3968a4c694c4 Mon Sep 17 00:00:00 2001 From: Jack Papel Date: Tue, 5 Dec 2023 19:38:24 -0500 Subject: [PATCH] End game when game ends --- client/src/game/gameManager.tsx | 2 ++ client/src/game/gameState.d.tsx | 2 ++ client/src/game/gameState.tsx | 2 ++ client/src/game/messageListener.tsx | 1 + server/src/game/mod.rs | 31 +++++++++++++------- server/src/game/player/player_send_packet.rs | 6 +++- server/src/lobby.rs | 2 +- 7 files changed, 33 insertions(+), 13 deletions(-) diff --git a/client/src/game/gameManager.tsx b/client/src/game/gameManager.tsx index deb4937f1..a2e6387fd 100644 --- a/client/src/game/gameManager.tsx +++ b/client/src/game/gameManager.tsx @@ -216,6 +216,8 @@ export function createGameManager(): GameManager { }, tick(timePassedMs) { + if (!gameManager.gameState.ongoing) return; + const newTimeLeft = gameManager.gameState.timeLeftMs - timePassedMs; if (Math.floor(newTimeLeft / 1000) < Math.floor(gameManager.gameState.timeLeftMs / 1000)) { gameManager.invokeStateListeners("tick"); diff --git a/client/src/game/gameState.d.tsx b/client/src/game/gameState.d.tsx index e25633321..15a3257e1 100644 --- a/client/src/game/gameState.d.tsx +++ b/client/src/game/gameState.d.tsx @@ -54,6 +54,8 @@ type GameState = { roleList: RoleOutline[], excludedRoles: RoleOutline[], phaseTimes: PhaseTimes + + ongoing: boolean } export default GameState; diff --git a/client/src/game/gameState.tsx b/client/src/game/gameState.tsx index ea3de7e5f..6e9e77e7a 100644 --- a/client/src/game/gameState.tsx +++ b/client/src/game/gameState.tsx @@ -39,6 +39,8 @@ export function createGameState(): GameState { evening: 7, night: 37, }, + + ongoing: true, } } diff --git a/client/src/game/messageListener.tsx b/client/src/game/messageListener.tsx index 78ec3a474..a794d78d4 100644 --- a/client/src/game/messageListener.tsx +++ b/client/src/game/messageListener.tsx @@ -189,6 +189,7 @@ export default function messageListener(packet: ToClientPacket){ GAME_MANAGER.gameState.graves.push(packet.grave); break; case "gameOver": + GAME_MANAGER.gameState.ongoing = false; switch(packet.reason) { case "ReachedMaxDay": // alert("Game Over: Reached the maximum day!"); diff --git a/server/src/game/mod.rs b/server/src/game/mod.rs index 732711a34..46656447f 100644 --- a/server/src/game/mod.rs +++ b/server/src/game/mod.rs @@ -42,6 +42,8 @@ pub struct Game { pub teams: Teams, phase_machine : PhaseStateMachine, + + pub ongoing: bool } impl Game { @@ -77,6 +79,7 @@ impl Game { drop(roles); // Ensure we don't use the order of roles anywhere let mut game = Self{ + ongoing: true, players: players.into_boxed_slice(), graves: Vec::new(), teams: Teams::default(), @@ -122,7 +125,7 @@ impl Game { (guilty, innocent) } - pub fn game_is_over(&self)->bool{ + pub fn winner(&self) -> Option { let mut winning_team = None; for player_ref in PlayerReference::all_players(self){ @@ -133,13 +136,14 @@ impl Game { if let Some(ref winning_team) = winning_team{ //if there are two different teams alive then nobody won if *winning_team != egc{ - return false; + return None; } - }else{ + } else { winning_team = Some(egc.clone()); } } - return true; + + winning_team } pub fn current_phase(&self) -> &PhaseState { @@ -151,15 +155,23 @@ impl Game { } pub fn tick(&mut self, time_passed: Duration){ - if self.game_is_over() { + for player_ref in PlayerReference::all_players(self){ + player_ref.tick(self, time_passed) + } + + if !self.ongoing { return } + + if let Some(_winner) = self.winner() { self.add_message_to_chat_group(ChatGroup::All, ChatMessage::GameOver); self.send_packet_to_all(ToClientPacket::GameOver{ reason: GameOverReason::Draw }); - + self.ongoing = false; + return; } if self.phase_machine.day_number == u8::MAX { + self.add_message_to_chat_group(ChatGroup::All, ChatMessage::GameOver); self.send_packet_to_all(ToClientPacket::GameOver{ reason: GameOverReason::ReachedMaxDay }); - // TODO, clean up the lobby. Stop the ticking + self.ongoing = false; return; } @@ -169,10 +181,6 @@ impl Game { self.start_phase(new_phase); } - for player_ref in PlayerReference::all_players(self){ - player_ref.tick(self, time_passed) - } - self.phase_machine.time_remaining = self.phase_machine.time_remaining.saturating_sub(time_passed); } @@ -260,6 +268,7 @@ pub mod test { drop(roles); let mut game = Game{ + ongoing: true, players: players.into_boxed_slice(), graves: Vec::new(), teams: Teams::default(), diff --git a/server/src/game/player/player_send_packet.rs b/server/src/game/player/player_send_packet.rs index 57ba97f43..2a3805d35 100644 --- a/server/src/game/player/player_send_packet.rs +++ b/server/src/game/player/player_send_packet.rs @@ -1,6 +1,6 @@ use std::time::Duration; -use crate::{game::{Game, available_buttons::AvailableButtons, phase::PhaseState}, packet::ToClientPacket, websocket_connections::connection::ClientSender}; +use crate::{game::{Game, available_buttons::AvailableButtons, phase::PhaseState}, packet::{ToClientPacket, GameOverReason}, websocket_connections::connection::ClientSender}; use super::{PlayerReference, ClientConnection, DISCONNECT_TIMER_SECS}; @@ -55,6 +55,10 @@ impl PlayerReference{ } ]); + if !game.ongoing { + self.send_packet(game, ToClientPacket::GameOver { reason: GameOverReason::Draw }) + } + if let PhaseState::Testimony { player_on_trial, .. } | PhaseState::Judgement { player_on_trial, .. } | PhaseState::Evening { player_on_trial: Some(player_on_trial) } = game.current_phase() { diff --git a/server/src/lobby.rs b/server/src/lobby.rs index 6e3bbc672..3241c3e61 100644 --- a/server/src/lobby.rs +++ b/server/src/lobby.rs @@ -387,7 +387,7 @@ impl Lobby { player.1.send(packet.clone()); } } - #[allow(unused)] + fn send_players_game(game: &mut Game, players: &HashMap){ let mut players: Vec<_> = players.iter().collect();