214 lines
7.4 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|
|
} |