Delay player hand creation at the beginning of the game
This commit is contained in:
@@ -2,19 +2,32 @@ use crate::types::{Position2dRef, TileRef};
|
|||||||
use board_shared::{position::Position2d, tile::Tile};
|
use board_shared::{position::Position2d, tile::Tile};
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
|
/// A message sent by the client to the server.
|
||||||
#[derive(Debug, Deserialize, Serialize)]
|
#[derive(Debug, Deserialize, Serialize)]
|
||||||
pub enum ClientMessage {
|
pub enum ClientMessage {
|
||||||
/// Creates a new room and join it with the given player name.
|
/// Creates a new room and join it with the given player name.
|
||||||
///
|
///
|
||||||
/// The server answers with a JoinedRoom message.
|
/// The server answers with a JoinedRoom message.
|
||||||
CreateRoom(String),
|
CreateRoom(String),
|
||||||
|
/// Join an existing room with the given room name and player name.
|
||||||
|
///
|
||||||
|
/// The server answers with a JoinedRoom message.
|
||||||
JoinRoom(String, String),
|
JoinRoom(String, String),
|
||||||
|
/// Notify that the client has temporary left the game.
|
||||||
Disconnected,
|
Disconnected,
|
||||||
|
/// Start the game if the client has the permission.
|
||||||
|
StartGame,
|
||||||
|
/// Try to place a tile from the hand on the board.
|
||||||
|
///
|
||||||
|
/// The server will validate the move and answer with a TilePlaced if the message is valid.
|
||||||
TileUse(#[serde(with = "Position2dRef")] Position2d, usize),
|
TileUse(#[serde(with = "Position2dRef")] Position2d, usize),
|
||||||
TileTake(usize),
|
/// Try to remove a tile from the board to add it to the hand.
|
||||||
|
TileTake(#[serde(with = "Position2dRef")] Position2d),
|
||||||
|
/// Get the server to validate the current player moves.
|
||||||
Validate,
|
Validate,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// A message sent by the server to the client.
|
||||||
#[derive(Clone, Debug, Deserialize, Serialize)]
|
#[derive(Clone, Debug, Deserialize, Serialize)]
|
||||||
pub enum ServerMessage {
|
pub enum ServerMessage {
|
||||||
/// Informs that a room has been joined.
|
/// Informs that a room has been joined.
|
||||||
@@ -23,6 +36,7 @@ pub enum ServerMessage {
|
|||||||
players: Vec<(String, u32, bool)>,
|
players: Vec<(String, u32, bool)>,
|
||||||
active_player: usize,
|
active_player: usize,
|
||||||
},
|
},
|
||||||
|
/// Notify that the room cannot be joined.
|
||||||
JoinFailed(String),
|
JoinFailed(String),
|
||||||
/// Notify that new player has joined the game.
|
/// Notify that new player has joined the game.
|
||||||
PlayerConnected(String),
|
PlayerConnected(String),
|
||||||
|
@@ -21,6 +21,7 @@ pub struct Room {
|
|||||||
pub connections: HashMap<SocketAddr, usize>,
|
pub connections: HashMap<SocketAddr, usize>,
|
||||||
pub players: Vec<Player>,
|
pub players: Vec<Player>,
|
||||||
pub active_player: usize,
|
pub active_player: usize,
|
||||||
|
pub has_started: bool,
|
||||||
pub board: Board,
|
pub board: Board,
|
||||||
pub validated_board: Board,
|
pub validated_board: Board,
|
||||||
pub deck: RngDeck,
|
pub deck: RngDeck,
|
||||||
@@ -51,13 +52,10 @@ impl Room {
|
|||||||
self.broadcast(ServerMessage::PlayerConnected(player_name.clone()));
|
self.broadcast(ServerMessage::PlayerConnected(player_name.clone()));
|
||||||
player_index = Some(self.players.len());
|
player_index = Some(self.players.len());
|
||||||
|
|
||||||
let mut hand = Hand::default();
|
|
||||||
hand.complete(&mut self.deck)?;
|
|
||||||
|
|
||||||
self.players.push(Player {
|
self.players.push(Player {
|
||||||
name: player_name,
|
name: player_name,
|
||||||
score: 0,
|
score: 0,
|
||||||
hand,
|
hand: Hand::default(),
|
||||||
ws: Some(tx.clone()),
|
ws: Some(tx.clone()),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -100,6 +98,7 @@ impl Room {
|
|||||||
ClientMessage::CreateRoom(_) | ClientMessage::JoinRoom(_, _) => {
|
ClientMessage::CreateRoom(_) | ClientMessage::JoinRoom(_, _) => {
|
||||||
eprintln!("[{}] Illegal client message {:?}", self.name, msg);
|
eprintln!("[{}] Illegal client message {:?}", self.name, msg);
|
||||||
}
|
}
|
||||||
|
ClientMessage::StartGame => self.on_start_game(),
|
||||||
ClientMessage::TileUse(pos, tile_idx) => {
|
ClientMessage::TileUse(pos, tile_idx) => {
|
||||||
if let Some(p) = self.connections.get(&addr) {
|
if let Some(p) = self.connections.get(&addr) {
|
||||||
if *p == self.active_player {
|
if *p == self.active_player {
|
||||||
@@ -119,6 +118,23 @@ impl Room {
|
|||||||
!self.connections.is_empty()
|
!self.connections.is_empty()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn on_start_game(&mut self) {
|
||||||
|
if self.has_started {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
self.has_started = true;
|
||||||
|
self.deck = RngDeck::new_complete();
|
||||||
|
|
||||||
|
for p in &mut self.players {
|
||||||
|
p.hand
|
||||||
|
.complete(&mut self.deck)
|
||||||
|
.expect("Not enough tiles in deck");
|
||||||
|
}
|
||||||
|
|
||||||
|
self.broadcast(ServerMessage::PlayerTurn(self.active_player));
|
||||||
|
}
|
||||||
|
|
||||||
fn on_tile_use(&mut self, pos: Position2d, tile_idx: usize) {
|
fn on_tile_use(&mut self, pos: Position2d, tile_idx: usize) {
|
||||||
let hand = &mut self.players[self.active_player].hand;
|
let hand = &mut self.players[self.active_player].hand;
|
||||||
if let Some(tile) = hand.remove(tile_idx) {
|
if let Some(tile) = hand.remove(tile_idx) {
|
||||||
|
Reference in New Issue
Block a user