|
|
@ -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) {
|
|
|
|