Yay, fix a lot of bugs and this is playable!
This commit is contained in:
parent
bbe190fa2b
commit
7568193c7d
@ -1,14 +1,18 @@
|
|||||||
namespace MafiaCommon.Packets
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace MafiaCommon.Packets
|
||||||
{
|
{
|
||||||
public class GameStageChangedPacket : Packet
|
public class GameStageChangedPacket : Packet
|
||||||
{
|
{
|
||||||
public readonly GameState GameState;
|
public readonly GameState GameState;
|
||||||
public readonly Role Role;
|
public readonly Role Role;
|
||||||
|
public readonly List<Player> Players;
|
||||||
|
|
||||||
public GameStageChangedPacket(GameState gameState, Role role) : base(PacketType.GameStateChanged)
|
public GameStageChangedPacket(GameState gameState, Role role, List<Player> players) : base(PacketType.GameStateChanged)
|
||||||
{
|
{
|
||||||
GameState = gameState;
|
GameState = gameState;
|
||||||
Role = role;
|
Role = role;
|
||||||
|
Players = players;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -235,7 +235,7 @@ namespace MafiaGame
|
|||||||
private void GameQueueLeave_OnClick(object sender, RoutedEventArgs e)
|
private void GameQueueLeave_OnClick(object sender, RoutedEventArgs e)
|
||||||
{
|
{
|
||||||
App.Instance.Connection.Disconnect();
|
App.Instance.Connection.Disconnect();
|
||||||
GameQueue.Visibility = Visibility.Hidden;
|
HideAll();
|
||||||
MainMenu.Visibility = Visibility.Visible;
|
MainMenu.Visibility = Visibility.Visible;
|
||||||
App.Instance.GetRpcClient().SetPresence(new RichPresence()
|
App.Instance.GetRpcClient().SetPresence(new RichPresence()
|
||||||
{
|
{
|
||||||
@ -268,12 +268,12 @@ namespace MafiaGame
|
|||||||
|
|
||||||
private void GameDaySelect_OnMouseDoubleClick(object sender, MouseButtonEventArgs e)
|
private void GameDaySelect_OnMouseDoubleClick(object sender, MouseButtonEventArgs e)
|
||||||
{
|
{
|
||||||
|
ListBoxItem selected = (ListBoxItem)GameDaySelect.SelectedItem;
|
||||||
|
App.Instance.Connection.Vote(Convert.ToInt32(((string)selected.Content).Split(")")[0]));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void ShowDay(bool voting, Role role)
|
public void ShowDay(bool voting, Role role, List<Player> players)
|
||||||
{
|
{
|
||||||
HideAll();
|
|
||||||
GameDaySelect.IsEnabled = voting;
|
GameDaySelect.IsEnabled = voting;
|
||||||
if (role == Role.Died)
|
if (role == Role.Died)
|
||||||
{
|
{
|
||||||
@ -284,6 +284,12 @@ namespace MafiaGame
|
|||||||
if (voting)
|
if (voting)
|
||||||
{
|
{
|
||||||
GameDayHotBar.Text = "Голосуй и молись";
|
GameDayHotBar.Text = "Голосуй и молись";
|
||||||
|
foreach (Player player in players)
|
||||||
|
{
|
||||||
|
ListBoxItem item = new ListBoxItem();
|
||||||
|
item.Content = player.Id.ToString() + ") " + player.Name;
|
||||||
|
MainWindow.Instance.GameDaySelect.Items.Add(item);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -3,7 +3,6 @@ using System.Collections.Generic;
|
|||||||
using System.Net.Sockets;
|
using System.Net.Sockets;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Windows;
|
|
||||||
using System.Windows.Controls;
|
using System.Windows.Controls;
|
||||||
using DiscordRPC;
|
using DiscordRPC;
|
||||||
using MafiaCommon.Packets;
|
using MafiaCommon.Packets;
|
||||||
@ -18,6 +17,7 @@ namespace MafiaGame
|
|||||||
private Socket _socket;
|
private Socket _socket;
|
||||||
private Thread _thread;
|
private Thread _thread;
|
||||||
private bool _breakFlag = false;
|
private bool _breakFlag = false;
|
||||||
|
private bool connected;
|
||||||
|
|
||||||
public ServerConnection(String ip)
|
public ServerConnection(String ip)
|
||||||
{
|
{
|
||||||
@ -50,6 +50,7 @@ namespace MafiaGame
|
|||||||
_socket.Send(PacketConverter.toBytes(new ConnectPacket(Settings.Config().Nick)));
|
_socket.Send(PacketConverter.toBytes(new ConnectPacket(Settings.Config().Nick)));
|
||||||
_thread.IsBackground = true;
|
_thread.IsBackground = true;
|
||||||
_thread.Start();
|
_thread.Start();
|
||||||
|
connected = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SendMessage(ChatType chatType, string text)
|
public void SendMessage(ChatType chatType, string text)
|
||||||
@ -59,6 +60,7 @@ namespace MafiaGame
|
|||||||
|
|
||||||
public void Disconnect()
|
public void Disconnect()
|
||||||
{
|
{
|
||||||
|
connected = false;
|
||||||
_socket.Send(PacketConverter.toBytes(new DisconnectPlayerPacket()));
|
_socket.Send(PacketConverter.toBytes(new DisconnectPlayerPacket()));
|
||||||
_thread.Interrupt();
|
_thread.Interrupt();
|
||||||
_socket.Close();
|
_socket.Close();
|
||||||
@ -87,20 +89,27 @@ namespace MafiaGame
|
|||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
_socket.Close();
|
_socket.Close();
|
||||||
App.Current.Dispatcher.Invoke((Action) (() =>
|
if (connected)
|
||||||
{
|
{
|
||||||
MainWindow.Instance.HideAll();
|
App.Current.Dispatcher.Invoke((Action) (() =>
|
||||||
MainWindow.Instance.ShowDisconnectScreen(e.Message);
|
{
|
||||||
}));
|
MainWindow.Instance.HideAll();
|
||||||
|
MainWindow.Instance.ShowDisconnectScreen(e.Message);
|
||||||
|
}));
|
||||||
|
connected = false;
|
||||||
|
}
|
||||||
_breakFlag = true;
|
_breakFlag = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
Console.WriteLine(builder.ToString());
|
if (!_breakFlag)
|
||||||
|
|
||||||
List<Packet> packets = PacketConverter.toPacket(builder.ToString());
|
|
||||||
foreach (Packet packet in packets)
|
|
||||||
{
|
{
|
||||||
WorkPacket(packet);
|
Console.WriteLine(builder.ToString());
|
||||||
|
|
||||||
|
List<Packet> packets = PacketConverter.toPacket(builder.ToString());
|
||||||
|
foreach (Packet packet in packets)
|
||||||
|
{
|
||||||
|
WorkPacket(packet);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -258,15 +267,56 @@ namespace MafiaGame
|
|||||||
App.Instance.GetRpcClient().UpdateDetails("Ожидание старта");
|
App.Instance.GetRpcClient().UpdateDetails("Ожидание старта");
|
||||||
break;
|
break;
|
||||||
case PacketType.GameStateChanged:
|
case PacketType.GameStateChanged:
|
||||||
switch (((GameStageChangedPacket)packet).GameState)
|
App.Current.Dispatcher.Invoke((Action) (() => { MainWindow.Instance.HideAll(); }));
|
||||||
|
players = ((GameStageChangedPacket) packet).Players;
|
||||||
|
switch (((GameStageChangedPacket) packet).GameState)
|
||||||
{
|
{
|
||||||
case GameState.Day:
|
case GameState.Day:
|
||||||
App.Current.Dispatcher.Invoke((Action) (() =>
|
App.Current.Dispatcher.Invoke((Action) (() =>
|
||||||
{
|
{
|
||||||
MainWindow.Instance.ShowDay(false,((GameStageChangedPacket)packet).Role);
|
MainWindow.Instance.ShowDay(false, ((GameStageChangedPacket) packet).Role,players);
|
||||||
}));
|
}));
|
||||||
App.Instance.GetRpcClient().UpdateDetails("День");
|
App.Instance.GetRpcClient().UpdateDetails("День");
|
||||||
break;
|
break;
|
||||||
|
case GameState.VotingDay:
|
||||||
|
App.Current.Dispatcher.Invoke((Action) (() =>
|
||||||
|
{
|
||||||
|
MainWindow.Instance.ShowDay(true, ((GameStageChangedPacket) packet).Role,players);
|
||||||
|
}));
|
||||||
|
App.Instance.GetRpcClient().UpdateDetails("Голосование!");
|
||||||
|
break;
|
||||||
|
case GameState.VotingNight:
|
||||||
|
switch (((GameStageChangedPacket)packet).Role)
|
||||||
|
{
|
||||||
|
case Role.Citizen:
|
||||||
|
case Role.Died:
|
||||||
|
App.Current.Dispatcher.Invoke((Action) (() =>
|
||||||
|
{
|
||||||
|
String rol;
|
||||||
|
if (((GameStageChangedPacket)packet).Role == Role.Citizen) rol = "Мирный житель";
|
||||||
|
else rol = "Мёртв";
|
||||||
|
MainWindow.Instance.ShowVotingPassive("Ты " +rol+ "!");
|
||||||
|
}));
|
||||||
|
break;
|
||||||
|
case Role.Mafia:
|
||||||
|
case Role.Don:
|
||||||
|
App.Current.Dispatcher.Invoke((Action) (() =>
|
||||||
|
{
|
||||||
|
String rol;
|
||||||
|
if (((GameStageChangedPacket)packet).Role == Role.Mafia) rol = "Мафия";
|
||||||
|
else rol = "Дон";
|
||||||
|
MainWindow.Instance.GameVotingActiveSelect.Items.Clear();
|
||||||
|
MainWindow.Instance.ShowVotingActive("Ты "+rol+", выбери кого убить!");
|
||||||
|
foreach (Player player in players)
|
||||||
|
{
|
||||||
|
ListBoxItem item = new ListBoxItem();
|
||||||
|
item.Content = player.Id.ToString() + ") " + player.Name;
|
||||||
|
MainWindow.Instance.GameVotingActiveSelect.Items.Add(item);
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Threading;
|
||||||
using MafiaCommon.Packets;
|
using MafiaCommon.Packets;
|
||||||
using MafiaCommon;
|
using MafiaCommon;
|
||||||
|
|
||||||
@ -15,6 +16,7 @@ namespace MafiaServer
|
|||||||
List<PlayerSocketWorker> _mafia = new List<PlayerSocketWorker>();
|
List<PlayerSocketWorker> _mafia = new List<PlayerSocketWorker>();
|
||||||
private Dictionary<int, int> _mafiaVotes = new Dictionary<int, int>();
|
private Dictionary<int, int> _mafiaVotes = new Dictionary<int, int>();
|
||||||
private Dictionary<int, int> _dayVote = new Dictionary<int, int>();
|
private Dictionary<int, int> _dayVote = new Dictionary<int, int>();
|
||||||
|
private Timer _voteStartTimer;
|
||||||
|
|
||||||
public Game()
|
public Game()
|
||||||
{
|
{
|
||||||
@ -55,7 +57,22 @@ namespace MafiaServer
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void WorkDeath(PlayerSocketWorker player)
|
public List<Player> GetPlayersRoles()
|
||||||
|
{
|
||||||
|
List<Player> players = new List<Player>();
|
||||||
|
|
||||||
|
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)
|
||||||
{
|
{
|
||||||
switch (player.Role)
|
switch (player.Role)
|
||||||
{
|
{
|
||||||
@ -65,11 +82,12 @@ namespace MafiaServer
|
|||||||
{
|
{
|
||||||
foreach (PlayerSocketWorker p in _players)
|
foreach (PlayerSocketWorker p in _players)
|
||||||
{
|
{
|
||||||
player.sendPacket(new EndGamePacket(true,_playerRolesAtStart));
|
p.sendPacket(new EndGamePacket(true,_playerRolesAtStart));
|
||||||
}
|
}
|
||||||
|
|
||||||
isStarted = false;
|
isStarted = false;
|
||||||
_gameState = GameState.NotStarted;
|
_gameState = GameState.NotStarted;
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -78,11 +96,32 @@ namespace MafiaServer
|
|||||||
{
|
{
|
||||||
_mafia[0].sendPacket(new MessageReceivePacket(ChatType.Active,true,"System","Дон покинул игру, ты новый дон!"));
|
_mafia[0].sendPacket(new MessageReceivePacket(ChatType.Active,true,"System","Дон покинул игру, ты новый дон!"));
|
||||||
}
|
}
|
||||||
|
_mafia.RemoveAt(0);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int mafias = _mafia.Count + 1;
|
||||||
|
int aliveLefts = 0;
|
||||||
|
|
||||||
|
foreach (PlayerSocketWorker pl in _players)
|
||||||
|
{
|
||||||
|
if (pl.Role != Role.Died && pl.Role != Role.Don && pl.Role != Role.Mafia) aliveLefts++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mafias >= aliveLefts)
|
||||||
|
{
|
||||||
|
foreach (PlayerSocketWorker p in _players)
|
||||||
|
{
|
||||||
|
p.sendPacket(new EndGamePacket(p.Role == Role.Mafia || p.Role == Role.Don, _playerRolesAtStart));
|
||||||
|
}
|
||||||
|
isStarted = false;
|
||||||
|
_gameState = GameState.NotStarted;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
player.Role = Role.Died;
|
player.Role = Role.Died;
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void PlayerOnOnPlayerVoteEvent(PlayerSocketWorker sender, int id)
|
private void PlayerOnOnPlayerVoteEvent(PlayerSocketWorker sender, int id)
|
||||||
@ -129,25 +168,93 @@ namespace MafiaServer
|
|||||||
|
|
||||||
if (_votesRemain.Count == 0)
|
if (_votesRemain.Count == 0)
|
||||||
{
|
{
|
||||||
int selId = 0;
|
switch (_gameState)
|
||||||
int selVotes = 0;
|
|
||||||
foreach (KeyValuePair<int,int> votes in _mafiaVotes)
|
|
||||||
{
|
{
|
||||||
if (votes.Value > selVotes)
|
case GameState.VotingNight:
|
||||||
{
|
int selId = 0;
|
||||||
selId = votes.Key;
|
int selVotes = 0;
|
||||||
selVotes = votes.Value;
|
foreach (KeyValuePair<int,int> votes in _mafiaVotes)
|
||||||
}
|
{
|
||||||
}
|
if (votes.Value > selVotes)
|
||||||
|
{
|
||||||
|
selId = votes.Key;
|
||||||
|
selVotes = votes.Value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
_gameState = GameState.Day;
|
PlayerSocketWorker killed = _players.FindPlayerById(selId);
|
||||||
|
if (WorkDeath(killed))
|
||||||
PlayerSocketWorker killed = _players.FindPlayerById(selId);
|
{
|
||||||
WorkDeath(killed);
|
_gameState = GameState.Day;
|
||||||
foreach (PlayerSocketWorker player in _players)
|
foreach (PlayerSocketWorker player in _players)
|
||||||
|
{
|
||||||
|
player.sendPacket(new GameStageChangedPacket(GameState.Day, player.Role,
|
||||||
|
GetPlayersRoles()));
|
||||||
|
player.sendPacket(new MessageReceivePacket(ChatType.Day, true, "System",
|
||||||
|
killed.PlayerName + " был убит!"));
|
||||||
|
}
|
||||||
|
|
||||||
|
_voteStartTimer = new Timer(StartDayVote, null, 60000, 60000);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case GameState.VotingDay:
|
||||||
|
selId = 0;
|
||||||
|
selVotes = 0;
|
||||||
|
foreach (KeyValuePair<int, int> votes in _dayVote)
|
||||||
|
{
|
||||||
|
if (votes.Value > selVotes)
|
||||||
|
{
|
||||||
|
selId = votes.Key; selVotes = votes.Value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
killed = _players.FindPlayerById(selId);
|
||||||
|
if (WorkDeath(killed))
|
||||||
|
{
|
||||||
|
_gameState = GameState.VotingNight;
|
||||||
|
FillNightVotes();
|
||||||
|
foreach (PlayerSocketWorker player in _players)
|
||||||
|
{
|
||||||
|
player.sendPacket(new GameStageChangedPacket(GameState.VotingNight, player.Role,
|
||||||
|
GetPlayersRoles()));
|
||||||
|
player.sendPacket(new MessageReceivePacket(ChatType.Day, true, "System",
|
||||||
|
killed.PlayerName + " был повешен!"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void StartDayVote(object obj)
|
||||||
|
{
|
||||||
|
_voteStartTimer.Dispose();
|
||||||
|
_gameState = GameState.VotingDay;
|
||||||
|
_votesRemain.Clear();
|
||||||
|
foreach (PlayerSocketWorker player in _players)
|
||||||
|
{
|
||||||
|
if (player.Role != Role.Died)
|
||||||
{
|
{
|
||||||
player.sendPacket(new GameStageChangedPacket(GameState.Day,player.Role));
|
_votesRemain.Add(player);
|
||||||
player.sendPacket(new MessageReceivePacket(ChatType.Day,true,"System",killed.PlayerName+" был убит!"));
|
}
|
||||||
|
}
|
||||||
|
foreach (PlayerSocketWorker player in _players)
|
||||||
|
{
|
||||||
|
player.sendPacket(new GameStageChangedPacket(GameState.VotingDay,player.Role,GetPlayersRoles()));
|
||||||
|
player.sendPacket(new MessageReceivePacket(ChatType.Day,true,"System","Начинаем голосование!"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void FillNightVotes()
|
||||||
|
{
|
||||||
|
foreach (PlayerSocketWorker player in _players)
|
||||||
|
{
|
||||||
|
switch (player.Role)
|
||||||
|
{
|
||||||
|
case Role.Don:
|
||||||
|
case Role.Mafia:
|
||||||
|
_votesRemain.Add(player);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -156,10 +263,14 @@ namespace MafiaServer
|
|||||||
{
|
{
|
||||||
_players.Remove(sender);
|
_players.Remove(sender);
|
||||||
foreach (PlayerSocketWorker player in _players)
|
foreach (PlayerSocketWorker 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));
|
||||||
}
|
}
|
||||||
WorkDeath(sender);
|
if (_gameState != GameState.NotStarted)
|
||||||
|
{
|
||||||
|
WorkDeath(sender);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Start()
|
public void Start()
|
||||||
@ -219,12 +330,7 @@ namespace MafiaServer
|
|||||||
don.Role = Role.Don;
|
don.Role = Role.Don;
|
||||||
_mafia.RemoveAt(0);
|
_mafia.RemoveAt(0);
|
||||||
|
|
||||||
List<Player> players = new List<Player>();
|
List<Player> players = GetPlayersRoles();
|
||||||
|
|
||||||
foreach (PlayerSocketWorker player in _players)
|
|
||||||
{
|
|
||||||
players.Add(new Player(player.Id, player.PlayerName));
|
|
||||||
}
|
|
||||||
|
|
||||||
don.sendPacket(new GameStartPacket(Role.Don,players));
|
don.sendPacket(new GameStartPacket(Role.Don,players));
|
||||||
_votesRemain.Add(don);
|
_votesRemain.Add(don);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user