equal
deleted
inserted
replaced
4 room::HwRoom, |
4 room::HwRoom, |
5 types::{ClientId, RoomId, ServerVar}, |
5 types::{ClientId, RoomId, ServerVar}, |
6 }; |
6 }; |
7 use crate::{protocol::messages::HwProtocolMessage::Greeting, utils}; |
7 use crate::{protocol::messages::HwProtocolMessage::Greeting, utils}; |
8 |
8 |
9 use crate::core::server::JoinRoomError::WrongProtocol; |
|
10 use bitflags::*; |
9 use bitflags::*; |
11 use log::*; |
10 use log::*; |
12 use slab; |
11 use slab; |
13 use std::{borrow::BorrowMut, collections::HashSet, iter, num::NonZeroU16}; |
12 use std::{borrow::BorrowMut, collections::HashSet, iter, mem::replace, num::NonZeroU16}; |
14 |
13 |
15 type Slab<T> = slab::Slab<T>; |
14 type Slab<T> = slab::Slab<T>; |
16 |
15 |
17 #[derive(Debug)] |
16 #[derive(Debug)] |
18 pub enum CreateRoomError { |
17 pub enum CreateRoomError { |
62 pub enum StartGameError { |
61 pub enum StartGameError { |
63 NotEnoughClans, |
62 NotEnoughClans, |
64 NotEnoughTeams, |
63 NotEnoughTeams, |
65 NotReady, |
64 NotReady, |
66 AlreadyInGame, |
65 AlreadyInGame, |
|
66 } |
|
67 |
|
68 #[derive(Debug)] |
|
69 pub struct EndGameResult { |
|
70 pub joined_mid_game_clients: Vec<ClientId>, |
|
71 pub left_teams: Vec<String>, |
|
72 pub unreadied_nicks: Vec<String>, |
67 } |
73 } |
68 |
74 |
69 #[derive(Debug)] |
75 #[derive(Debug)] |
70 pub struct UninitializedError(); |
76 pub struct UninitializedError(); |
71 #[derive(Debug)] |
77 #[derive(Debug)] |
439 } |
445 } |
440 Ok(room_nicks) |
446 Ok(room_nicks) |
441 } |
447 } |
442 } |
448 } |
443 |
449 |
|
450 pub fn end_game(&mut self, room_id: RoomId) -> EndGameResult { |
|
451 let room = &mut self.rooms[room_id]; |
|
452 room.ready_players_number = 1; |
|
453 |
|
454 if let Some(info) = replace(&mut room.game_info, None) { |
|
455 let joined_mid_game_clients = self |
|
456 .clients |
|
457 .iter() |
|
458 .filter(|(_, c)| c.room_id == Some(room_id) && c.is_joined_mid_game()) |
|
459 .map(|(_, c)| c.id) |
|
460 .collect(); |
|
461 |
|
462 let unreadied_nicks: Vec<_> = self |
|
463 .clients |
|
464 .iter_mut() |
|
465 .filter(|(_, c)| c.room_id == Some(room_id)) |
|
466 .map(|(_, c)| { |
|
467 c.set_is_ready(c.is_master()); |
|
468 c.set_is_joined_mid_game(false); |
|
469 c |
|
470 }) |
|
471 .filter_map(|c| { |
|
472 if !c.is_master() { |
|
473 Some(c.nick.clone()) |
|
474 } else { |
|
475 None |
|
476 } |
|
477 }) |
|
478 .collect(); |
|
479 |
|
480 EndGameResult { |
|
481 joined_mid_game_clients, |
|
482 left_teams: info.left_teams.clone(), |
|
483 unreadied_nicks, |
|
484 } |
|
485 } else { |
|
486 unreachable!() |
|
487 } |
|
488 } |
|
489 |
444 #[inline] |
490 #[inline] |
445 pub fn set_var(&mut self, client_id: ClientId, var: ServerVar) -> Result<(), AccessError> { |
491 pub fn set_var(&mut self, client_id: ClientId, var: ServerVar) -> Result<(), AccessError> { |
446 if self.clients[client_id].is_admin() { |
492 if self.clients[client_id].is_admin() { |
447 match var { |
493 match var { |
448 ServerVar::MOTDNew(msg) => self.greetings.for_latest_protocol = msg, |
494 ServerVar::MOTDNew(msg) => self.greetings.for_latest_protocol = msg, |