214 lines
7.4 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using MafiaCommon.Packets;
using MafiaCommon;
namespace MafiaServer
{
public class Game
{
private List<PlayerSocketWorker> _players = new List<PlayerSocketWorker>();
private List<PlayerRole> _playerRolesAtStart = new List<PlayerRole>();
private bool isStarted = false;
private GameState _gameState = GameState.NotStarted;
List<PlayerSocketWorker> _mafia = new List<PlayerSocketWorker>();
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;
}
}
}
}