using System; using System.Collections.Generic; using System.Linq; using MafiaCommon.Packets; using MafiaCommon; namespace MafiaServer { public class Game { private List _players = new List(); private List _playerRolesAtStart = new List(); private bool isStarted = false; private GameState _gameState = GameState.NotStarted; List _mafia = new List(); public Game() { } public void ConnectPlayer(PlayerSocketWorker player) { if (isStarted) { player.sendPacket(new DisconnectPacket("Game already started!")); player.disconnect(); } else { foreach (PlayerSocketWorker othPlayer in _players) { othPlayer.sendPacket(new PlayerConnectedPacket(player.PlayerName,_players.Count+1,Settings.Config().MaxPlayers)); } _players.Add(player); player.Id = _players.LastIndexOf(player); player.OnDisconnectByErrorEvent += OnDisconnectByError; player.OnPlayerSendMessageEvent += PlayerOnOnPlayerSendMessageEvent; player.OnDisconnectEvent += PlayerOnOnDisconnectEvent; player.sendPacket(new WelcomePacket(Settings.Config().ServerName,_players.Count,Settings.Config().MaxPlayers)); } } private void PlayerOnOnDisconnectEvent(PlayerSocketWorker sender) { _players.Remove(sender); foreach (PlayerSocketWorker player in _players) { player.sendPacket(new PlayerDisconnectedPacket(true,sender.Id,_players.Count,Settings.Config().MaxPlayers)); } if (sender.Role == Role.Don) { _mafia.Remove(sender); if (_mafia.Count == 0) { foreach (PlayerSocketWorker player in _players) { player.sendPacket(new EndGamePacket(true,_playerRolesAtStart)); } isStarted = false; _gameState = GameState.NotStarted; } else { _mafia[0].Role = Role.Don; if (_gameState == GameState.VotingNight) { _mafia[0].sendPacket(new MessageReceivePacket(ChatType.Active,true,"System","Дон покинул игру, ты новый дон!")); } } } } public void Start() { if (isStarted) { return; } if (_players.Count < 2) { Console.WriteLine("Not Enough Players"); return; } foreach (PlayerSocketWorker player in _players) { player.Role = Role.Citizen; } _playerRolesAtStart.Clear(); Random random = new Random(); PlayerSocketWorker[] empty = _players.ToArray(); random.Shuffle(empty); int mafiasNeed = 1; if (empty.Length > 5) { mafiasNeed = empty.Length / 3; } while (mafiasNeed!=0) { for (var i = 0; i < empty.Length; i++) { switch (random.Next(2)) { case 0: //Мирный break; case 1: //Мафия empty[i].Role = Role.Mafia; mafiasNeed--; _mafia.Add(empty[i]); empty = empty.RemoveFromArray(i); break; } } } PlayerSocketWorker don = _mafia[0]; don.Role = Role.Don; _mafia.RemoveAt(0); don.sendPacket(new GameStartPacket(Role.Don)); foreach (PlayerSocketWorker player in empty) { player.sendPacket(new GameStartPacket(Role.Citizen)); } foreach (PlayerSocketWorker player in _mafia) { player.sendPacket(new GameStartPacket(Role.Mafia)); } foreach (PlayerSocketWorker player in _players) { _playerRolesAtStart.Add(new PlayerRole(player.PlayerName,player.Role)); } isStarted = true; _gameState = GameState.VotingNight; } private void OnDisconnectByError(PlayerSocketWorker sender) { _players.Remove(sender); foreach (PlayerSocketWorker player in _players) { player.sendPacket(new PlayerDisconnectedPacket(true,sender.Id,_players.Count,Settings.Config().MaxPlayers)); } if (sender.Role == Role.Don) { _mafia.Remove(sender); if (_mafia.Count == 0) { foreach (PlayerSocketWorker player in _players) { player.sendPacket(new EndGamePacket(true,_playerRolesAtStart)); } isStarted = false; _gameState = GameState.NotStarted; } else { _mafia[0].Role = Role.Don; if (_gameState == GameState.VotingNight) { _mafia[0].sendPacket(new MessageReceivePacket(ChatType.Active,true,"System","Дон покинул игру, ты новый дон!")); } } } } private void PlayerOnOnPlayerSendMessageEvent(PlayerSocketWorker sender, ChatType chatType, string text) { switch (chatType) { case ChatType.Queue: if (!isStarted) { foreach (PlayerSocketWorker player in _players) { player.sendPacket(new MessageReceivePacket(ChatType.Queue,false,sender.PlayerName,text)); } } break; case ChatType.Active: if (isStarted) { switch (sender.Role) { case Role.Mafia: case Role.Don: foreach (PlayerSocketWorker player in _players) { if (player.Role == Role.Mafia || player.Role == Role.Don) { player.sendPacket(new MessageReceivePacket(ChatType.Active, false, sender.PlayerName, text)); } } break; } } break; } } } }