From 5a8d4676f7d14b3966dee855362d0fcedb9e9fa9 Mon Sep 17 00:00:00 2001 From: clfreville2 Date: Tue, 21 Mar 2023 10:22:03 +0100 Subject: [PATCH] Handle TileTake messages --- board-server/src/room.rs | 21 ++++++++++++++++++++- board-shared/src/board.rs | 4 ++++ board-shared/src/game.rs | 4 ++++ 3 files changed, 28 insertions(+), 1 deletion(-) diff --git a/board-server/src/room.rs b/board-server/src/room.rs index 168ea10..10fe221 100644 --- a/board-server/src/room.rs +++ b/board-server/src/room.rs @@ -134,6 +134,13 @@ impl Room { } } } + ClientMessage::TileTake(pos) => { + if let Some(p) = self.connections.get(&addr) { + if *p == self.active_player { + self.on_tile_take(pos.into()); + } + } + } ClientMessage::Validate => { if let Some(p) = self.connections.get(&addr) { if *p == self.active_player { @@ -141,7 +148,6 @@ impl Room { } } } - _ => todo!(), } !self.connections.is_empty() } @@ -185,6 +191,19 @@ impl Room { self.broadcast(ServerMessage::TilePlaced(pos.into(), tile.into())); } + fn on_tile_take(&mut self, pos: Position2d) { + if self.board.get(pos.x, pos.y) == self.validated_board.get(pos.x, pos.y) { + self.send( + self.active_player, + ServerMessage::TurnRejected("Cannot take already validated tile.".to_string()), + ); + } else if let Some(tile) = self.board.take(pos.x, pos.y) { + self.players[self.active_player].hand.push(tile); + self.sync_hand(self.active_player); + self.broadcast(ServerMessage::TileRemoved(pos.into())); + } + } + fn on_validate(&mut self) { let diff = self.board.difference(&self.validated_board); if diff.is_empty() { diff --git a/board-shared/src/board.rs b/board-shared/src/board.rs index ab8c8d8..5a124f7 100644 --- a/board-shared/src/board.rs +++ b/board-shared/src/board.rs @@ -19,6 +19,10 @@ impl Board { self.tiles[y * self.width + x] = Some(tile); } + pub fn take(&mut self, x: usize, y: usize) -> Option { + self.tiles[y * self.width + x].take() + } + /// Gets the difference between this board and another. pub fn difference(&self, other: &Board) -> Vec { let mut diff = Vec::new(); diff --git a/board-shared/src/game.rs b/board-shared/src/game.rs index 2e92f6a..40504d1 100644 --- a/board-shared/src/game.rs +++ b/board-shared/src/game.rs @@ -49,6 +49,10 @@ impl Hand { Ok(()) } + pub fn push(&mut self, tile: Tile) { + self.tiles.push(tile); + } + pub fn remove(&mut self, idx: usize) -> Option { if idx < self.tiles.len() { Some(self.tiles.remove(idx))