Improve code style

This commit is contained in:
Ilya 2021-02-11 13:37:58 +03:00
parent 21cf96ab5e
commit b33d4b8553
2 changed files with 117 additions and 147 deletions

View File

@ -1,6 +1,4 @@
using MafiaCommon; namespace MafiaServer.Events
namespace MafiaServer.Events
{ {
public delegate void OnPlayerVoteEvent(PlayerSocketWorker sender, int id); public delegate void OnPlayerVoteEvent(PlayerSocketWorker sender, int id);
} }

View File

@ -1,5 +1,6 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq;
using System.Threading; using System.Threading;
using MafiaCommon.Packets; using MafiaCommon.Packets;
using MafiaCommon; using MafiaCommon;
@ -8,21 +9,16 @@ namespace MafiaServer
{ {
public class Game public class Game
{ {
private List<PlayerSocketWorker> _players = new List<PlayerSocketWorker>(); private readonly List<PlayerSocketWorker> _players = new List<PlayerSocketWorker>();
private List<PlayerRole> _playerRolesAtStart = new List<PlayerRole>(); private readonly List<PlayerRole> _playerRolesAtStart = new List<PlayerRole>();
private bool isStarted = false; private bool _isStarted;
private GameState _gameState = GameState.NotStarted; private GameState _gameState = GameState.NotStarted;
private List<PlayerSocketWorker> _votesRemain = new List<PlayerSocketWorker>(); private readonly List<PlayerSocketWorker> _votesRemain = new List<PlayerSocketWorker>();
List<PlayerSocketWorker> _mafia = new List<PlayerSocketWorker>(); private readonly List<PlayerSocketWorker> _mafia = new List<PlayerSocketWorker>();
private Dictionary<int, int> _mafiaVotes = new Dictionary<int, int>(); private readonly Dictionary<int, int> _mafiaVotes = new Dictionary<int, int>();
private Dictionary<int, int> _dayVote = new Dictionary<int, int>(); private readonly Dictionary<int, int> _dayVote = new Dictionary<int, int>();
private Timer _voteStartTimer; private Timer _voteStartTimer;
public Game()
{
}
public void ConnectPlayer(PlayerSocketWorker player) public void ConnectPlayer(PlayerSocketWorker player)
{ {
if (_players.Count >= Settings.Config().MaxPlayers) if (_players.Count >= Settings.Config().MaxPlayers)
@ -32,14 +28,14 @@ namespace MafiaServer
} }
else else
{ {
if (isStarted) if (_isStarted)
{ {
player.sendPacket(new DisconnectPacket("Game already started!")); player.sendPacket(new DisconnectPacket("Game already started!"));
player.disconnect(); player.disconnect();
} }
else else
{ {
foreach (PlayerSocketWorker othPlayer in _players) foreach (var othPlayer in _players)
{ {
othPlayer.sendPacket(new PlayerConnectedPacket(player.PlayerName, _players.Count + 1, othPlayer.sendPacket(new PlayerConnectedPacket(player.PlayerName, _players.Count + 1,
Settings.Config().MaxPlayers)); Settings.Config().MaxPlayers));
@ -57,19 +53,9 @@ namespace MafiaServer
} }
} }
public List<Player> GetPlayersRoles() private List<Player> GetPlayersRoles()
{ {
List<Player> players = new List<Player>(); return (from player in _players where player.Role != Role.Died select new Player(player.Id, player.PlayerName)).ToList();
foreach (PlayerSocketWorker player in _players)
{
if (player.Role != Role.Died)
{
players.Add(new Player(player.Id, player.PlayerName));
}
}
return players;
} }
private bool WorkDeath(PlayerSocketWorker player) private bool WorkDeath(PlayerSocketWorker player)
@ -80,12 +66,12 @@ namespace MafiaServer
_mafia.Remove(player); _mafia.Remove(player);
if (_mafia.Count == 0) if (_mafia.Count == 0)
{ {
foreach (PlayerSocketWorker p in _players) foreach (var p in _players)
{ {
p.sendPacket(new EndGamePacket(true,_playerRolesAtStart)); p.sendPacket(new EndGamePacket(true,_playerRolesAtStart));
} }
isStarted = false; _isStarted = false;
_gameState = GameState.NotStarted; _gameState = GameState.NotStarted;
return false; return false;
} }
@ -101,34 +87,27 @@ namespace MafiaServer
break; break;
} }
int mafias = _mafia.Count + 1; player.Role = Role.Died;
int aliveLefts = 0;
foreach (PlayerSocketWorker pl in _players) var mafias = _mafia.Count + 1;
{ var aliveLefts = _players.Count(pl => pl.Role != Role.Died && pl.Role != Role.Don && pl.Role != Role.Mafia);
if (pl.Role != Role.Died && pl.Role != Role.Don && pl.Role != Role.Mafia) aliveLefts++;
}
if (mafias >= aliveLefts) if (mafias < aliveLefts) return true;
{ foreach (var p in _players)
foreach (PlayerSocketWorker p in _players)
{ {
p.sendPacket(new EndGamePacket(p.Role == Role.Mafia || p.Role == Role.Don, _playerRolesAtStart)); p.sendPacket(new EndGamePacket(p.Role == Role.Mafia || p.Role == Role.Don, _playerRolesAtStart));
} }
isStarted = false; _isStarted = false;
_gameState = GameState.NotStarted; _gameState = GameState.NotStarted;
return false; return false;
}
player.Role = Role.Died;
return true;
} }
private void PlayerOnOnPlayerVoteEvent(PlayerSocketWorker sender, int id) private void PlayerOnOnPlayerVoteEvent(PlayerSocketWorker sender, int id)
{ {
if (_votesRemain.Contains(sender)) if (_votesRemain.Contains(sender))
{ {
PlayerSocketWorker voteFor = _players.FindPlayerById(id); var voteFor = _players.FindPlayerById(id);
switch (_gameState) switch (_gameState)
{ {
case GameState.VotingNight: case GameState.VotingNight:
@ -137,24 +116,24 @@ namespace MafiaServer
case Role.Don: case Role.Don:
_mafiaVotes.AddEmpty(id, 2); _mafiaVotes.AddEmpty(id, 2);
_votesRemain.Remove(sender); _votesRemain.Remove(sender);
foreach (PlayerSocketWorker player in _players) foreach (var player in _players.Where(player =>
player.Role == Role.Mafia || player.Role == Role.Don))
{ {
if (player.Role == Role.Mafia || player.Role == Role.Don) player.sendPacket(new MessageReceivePacket(ChatType.Active, true, "System",
{ sender.PlayerName + " проголосовал за " + voteFor.PlayerName));
player.sendPacket(new MessageReceivePacket(ChatType.Active,true,"System",sender.PlayerName+" проголосовал за "+voteFor.PlayerName));
}
} }
break; break;
case Role.Mafia: case Role.Mafia:
_mafiaVotes.AddEmpty(id, 1); _mafiaVotes.AddEmpty(id, 1);
_votesRemain.Remove(sender); _votesRemain.Remove(sender);
foreach (PlayerSocketWorker player in _players) foreach (var player in _players.Where(player =>
player.Role == Role.Mafia || player.Role == Role.Don))
{ {
if (player.Role == Role.Mafia || player.Role == Role.Don) player.sendPacket(new MessageReceivePacket(ChatType.Active, true, "System",
{ sender.PlayerName + " проголосовал за " + voteFor.PlayerName));
player.sendPacket(new MessageReceivePacket(ChatType.Active,true,"System",sender.PlayerName+" проголосовал за "+voteFor.PlayerName));
}
} }
break; break;
} }
@ -166,27 +145,24 @@ namespace MafiaServer
} }
} }
if (_votesRemain.Count == 0) if (_votesRemain.Count != 0) return;
{
switch (_gameState) switch (_gameState)
{ {
case GameState.VotingNight: case GameState.VotingNight:
int selId = 0; var selId = 0;
int selVotes = 0; var selVotes = 0;
foreach (KeyValuePair<int,int> votes in _mafiaVotes) foreach (var (key, value) in _mafiaVotes.Where(votes => votes.Value > selVotes))
{ {
if (votes.Value > selVotes) selId = key;
{ selVotes = value;
selId = votes.Key;
selVotes = votes.Value;
}
} }
PlayerSocketWorker killed = _players.FindPlayerById(selId); var killed = _players.FindPlayerById(selId);
if (WorkDeath(killed)) if (WorkDeath(killed))
{ {
_gameState = GameState.Day; _gameState = GameState.Day;
foreach (PlayerSocketWorker player in _players) foreach (var player in _players)
{ {
player.sendPacket(new GameStageChangedPacket(GameState.Day, player.Role, player.sendPacket(new GameStageChangedPacket(GameState.Day, player.Role,
GetPlayersRoles())); GetPlayersRoles()));
@ -196,16 +172,15 @@ namespace MafiaServer
_voteStartTimer = new Timer(StartDayVote, null, 60000, 60000); _voteStartTimer = new Timer(StartDayVote, null, 60000, 60000);
} }
break; break;
case GameState.VotingDay: case GameState.VotingDay:
selId = 0; selId = 0;
selVotes = 0; selVotes = 0;
foreach (KeyValuePair<int, int> votes in _dayVote) foreach (var (key, value) in _dayVote.Where(votes => votes.Value > selVotes))
{ {
if (votes.Value > selVotes) selId = key;
{ selVotes = value;
selId = votes.Key; selVotes = votes.Value;
}
} }
killed = _players.FindPlayerById(selId); killed = _players.FindPlayerById(selId);
@ -213,7 +188,7 @@ namespace MafiaServer
{ {
_gameState = GameState.VotingNight; _gameState = GameState.VotingNight;
FillNightVotes(); FillNightVotes();
foreach (PlayerSocketWorker player in _players) foreach (var player in _players)
{ {
player.sendPacket(new GameStageChangedPacket(GameState.VotingNight, player.Role, player.sendPacket(new GameStageChangedPacket(GameState.VotingNight, player.Role,
GetPlayersRoles())); GetPlayersRoles()));
@ -221,24 +196,21 @@ namespace MafiaServer
killed.PlayerName + " был повешен!")); killed.PlayerName + " был повешен!"));
} }
} }
break; break;
} }
} }
}
private void StartDayVote(object obj) private void StartDayVote(object obj)
{ {
_voteStartTimer.Dispose(); _voteStartTimer.Dispose();
_gameState = GameState.VotingDay; _gameState = GameState.VotingDay;
_votesRemain.Clear(); _votesRemain.Clear();
foreach (PlayerSocketWorker player in _players) foreach (var player in _players.Where(player => player.Role != Role.Died))
{
if (player.Role != Role.Died)
{ {
_votesRemain.Add(player); _votesRemain.Add(player);
} }
} foreach (var player in _players)
foreach (PlayerSocketWorker player in _players)
{ {
player.sendPacket(new GameStageChangedPacket(GameState.VotingDay,player.Role,GetPlayersRoles())); player.sendPacket(new GameStageChangedPacket(GameState.VotingDay,player.Role,GetPlayersRoles()));
player.sendPacket(new MessageReceivePacket(ChatType.Day,true,"System","Начинаем голосование!")); player.sendPacket(new MessageReceivePacket(ChatType.Day,true,"System","Начинаем голосование!"));
@ -247,7 +219,7 @@ namespace MafiaServer
private void FillNightVotes() private void FillNightVotes()
{ {
foreach (PlayerSocketWorker player in _players) foreach (var player in _players)
{ {
switch (player.Role) switch (player.Role)
{ {
@ -262,7 +234,7 @@ namespace MafiaServer
private void PlayerOnOnDisconnectEvent(PlayerSocketWorker sender) private void PlayerOnOnDisconnectEvent(PlayerSocketWorker sender)
{ {
_players.Remove(sender); _players.Remove(sender);
foreach (PlayerSocketWorker player in _players) foreach (var player in _players)
{ {
player.sendPacket(new PlayerDisconnectedPacket(true, sender.Id, _players.Count, player.sendPacket(new PlayerDisconnectedPacket(true, sender.Id, _players.Count,
Settings.Config().MaxPlayers)); Settings.Config().MaxPlayers));
@ -275,7 +247,7 @@ namespace MafiaServer
public void Start() public void Start()
{ {
if (isStarted) if (_isStarted)
{ {
return; return;
} }
@ -285,7 +257,7 @@ namespace MafiaServer
return; return;
} }
foreach (PlayerSocketWorker player in _players) foreach (var player in _players)
{ {
player.Role = Role.Citizen; player.Role = Role.Citizen;
} }
@ -294,12 +266,12 @@ namespace MafiaServer
_mafiaVotes.Clear(); _mafiaVotes.Clear();
_dayVote.Clear(); _dayVote.Clear();
Random random = new Random(); var random = new Random();
PlayerSocketWorker[] empty = _players.ToArray(); var empty = _players.ToArray();
random.Shuffle(empty); random.Shuffle(empty);
int mafiasNeed = empty.Length / 3; var mafiasNeed = empty.Length / 3;
Console.WriteLine("Debug: needs counted"); Console.WriteLine("Debug: needs counted");
@ -324,43 +296,43 @@ namespace MafiaServer
} }
} }
Console.WriteLine("Debug: randomazed"); Console.WriteLine("Debug: randomized");
PlayerSocketWorker don = _mafia[0]; var don = _mafia[0];
don.Role = Role.Don; don.Role = Role.Don;
_mafia.RemoveAt(0); _mafia.RemoveAt(0);
List<Player> players = GetPlayersRoles(); var players = GetPlayersRoles();
don.sendPacket(new GameStartPacket(Role.Don,players)); don.sendPacket(new GameStartPacket(Role.Don,players));
_votesRemain.Add(don); _votesRemain.Add(don);
foreach (PlayerSocketWorker player in empty) foreach (var player in empty)
{ {
player.sendPacket(new GameStartPacket(Role.Citizen,players)); player.sendPacket(new GameStartPacket(Role.Citizen,players));
} }
foreach (PlayerSocketWorker player in _mafia) foreach (var player in _mafia)
{ {
player.sendPacket(new GameStartPacket(Role.Mafia,players)); player.sendPacket(new GameStartPacket(Role.Mafia,players));
_votesRemain.Add(player); _votesRemain.Add(player);
} }
foreach (PlayerSocketWorker player in _players) foreach (var player in _players)
{ {
_playerRolesAtStart.Add(new PlayerRole(player.PlayerName,player.Role)); _playerRolesAtStart.Add(new PlayerRole(player.PlayerName,player.Role));
} }
Console.WriteLine("Debug: packets sended"); Console.WriteLine("Debug: packets sent");
isStarted = true; _isStarted = true;
_gameState = GameState.VotingNight; _gameState = GameState.VotingNight;
} }
private void OnDisconnectByError(PlayerSocketWorker sender) private void OnDisconnectByError(PlayerSocketWorker sender)
{ {
_players.Remove(sender); _players.Remove(sender);
foreach (PlayerSocketWorker player in _players) foreach (var player in _players)
{ {
player.sendPacket(new PlayerDisconnectedPacket(true,sender.Id,_players.Count,Settings.Config().MaxPlayers)); player.sendPacket(new PlayerDisconnectedPacket(true,sender.Id,_players.Count,Settings.Config().MaxPlayers));
} }
@ -372,35 +344,32 @@ namespace MafiaServer
switch (chatType) switch (chatType)
{ {
case ChatType.Queue: case ChatType.Queue:
if (!isStarted) if (!_isStarted)
{ {
foreach (PlayerSocketWorker player in _players) foreach (var player in _players)
{ {
player.sendPacket(new MessageReceivePacket(ChatType.Queue,false,sender.PlayerName,text)); player.sendPacket(new MessageReceivePacket(ChatType.Queue,false,sender.PlayerName,text));
} }
} }
break; break;
case ChatType.Active: case ChatType.Active:
if (isStarted) if (_isStarted)
{ {
switch (sender.Role) switch (sender.Role)
{ {
case Role.Mafia: case Role.Mafia:
case Role.Don: case Role.Don:
foreach (PlayerSocketWorker player in _players) foreach (var player in _players.Where(player => player.Role == Role.Mafia || player.Role == Role.Don))
{
if (player.Role == Role.Mafia || player.Role == Role.Don)
{ {
player.sendPacket(new MessageReceivePacket(ChatType.Active, false, sender.PlayerName, player.sendPacket(new MessageReceivePacket(ChatType.Active, false, sender.PlayerName,
text)); text));
} }
}
break; break;
} }
} }
break; break;
case ChatType.Day: case ChatType.Day:
if (isStarted) if (_isStarted)
{ {
if (sender.Role == Role.Died) if (sender.Role == Role.Died)
{ {
@ -408,7 +377,7 @@ namespace MafiaServer
} }
else else
{ {
foreach (PlayerSocketWorker player in _players) foreach (var player in _players)
{ {
player.sendPacket( player.sendPacket(
new MessageReceivePacket(ChatType.Day, false, sender.PlayerName, text)); new MessageReceivePacket(ChatType.Day, false, sender.PlayerName, text));
@ -416,6 +385,9 @@ namespace MafiaServer
} }
} }
break; break;
default:
Console.WriteLine("User sending in bad chat");
break;
} }
} }
} }