From 8d62442107b607b577c399d2e71cd1122f4a135b Mon Sep 17 00:00:00 2001 From: Ilya Date: Sat, 30 Jan 2021 17:03:54 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=B5=D0=BD=D1=8C,=20=D1=83=D0=B1=D0=B8?= =?UTF-8?q?=D0=B9=D1=81=D1=82=D0=B2=D0=BE,=20=D0=BE=D0=B1=D1=89=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5,=20=D0=BD=D0=B0=D0=B4=D0=BE=20=D1=81=D0=B4?= =?UTF-8?q?=D0=B5=D0=BB=D0=B0=D1=82=D1=8C=20=D0=BF=D1=80=D0=BE=D0=B2=D0=B5?= =?UTF-8?q?=D1=80=D0=BA=D1=83=20=D0=BD=D0=B0=20=D1=80=D0=BE=D0=BB=D1=8C=20?= =?UTF-8?q?=D0=BF=D0=BE=D1=81=D0=BB=D0=B5=20=D1=83=D0=B1=D0=B8=D0=B9=D1=82?= =?UTF-8?q?=D1=81=D0=B2=D0=B0,=20=D0=B4=D0=BB=D1=8F=20=D1=81=D0=B0=D0=BC?= =?UTF-8?q?=D0=BE=D1=83=D0=B1=D0=B8=D0=B9=D1=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MafiaCommon/ChatType.cs | 1 + MafiaCommon/Packets/GameStageChangedPacket.cs | 12 +++++ MafiaCommon/Packets/PacketConverter.cs | 48 +++++++++++++------ MafiaCommon/Packets/PacketType.cs | 1 + MafiaCommon/Role.cs | 3 +- MafiaGame/MainWindow.xaml | 34 +++++++++++++ MafiaGame/MainWindow.xaml.cs | 41 +++++++++++++++- MafiaGame/ServerConnection.cs | 22 +++++---- MafiaServer/Game.cs | 42 ++++++++++++++++ MafiaServer/PlayerSocketWorker.cs | 36 ++++++++------ 10 files changed, 198 insertions(+), 42 deletions(-) create mode 100644 MafiaCommon/Packets/GameStageChangedPacket.cs diff --git a/MafiaCommon/ChatType.cs b/MafiaCommon/ChatType.cs index 4485072..7817dcd 100644 --- a/MafiaCommon/ChatType.cs +++ b/MafiaCommon/ChatType.cs @@ -4,5 +4,6 @@ { Queue=1, Active=2, + Day=3 } } \ No newline at end of file diff --git a/MafiaCommon/Packets/GameStageChangedPacket.cs b/MafiaCommon/Packets/GameStageChangedPacket.cs new file mode 100644 index 0000000..2846d17 --- /dev/null +++ b/MafiaCommon/Packets/GameStageChangedPacket.cs @@ -0,0 +1,12 @@ +namespace MafiaCommon.Packets +{ + public class GameStageChangedPacket : Packet + { + public readonly GameState GameState; + + public GameStageChangedPacket(GameState gameState) : base(PacketType.GameStateChanged) + { + GameState = gameState; + } + } +} \ No newline at end of file diff --git a/MafiaCommon/Packets/PacketConverter.cs b/MafiaCommon/Packets/PacketConverter.cs index 6432a6d..1d36f03 100644 --- a/MafiaCommon/Packets/PacketConverter.cs +++ b/MafiaCommon/Packets/PacketConverter.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Text; using Newtonsoft.Json; using Newtonsoft.Json.Linq; @@ -9,51 +10,68 @@ namespace MafiaCommon.Packets { public static byte[] toBytes(Packet packet) { - return Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(packet)); + return Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(packet)+","); } - public static Packet toPacket(String json) + public static List toPacket(String jsons) { - PacketType packetType = ((JObject)JsonConvert.DeserializeObject(json)).GetValue("PacketType").ToObject(); + List packets = new List(); + jsons = jsons.Substring(0, jsons.Length - 1); + jsons = "[" + jsons + "]"; + foreach (JObject packet in (JArray) JsonConvert.DeserializeObject(jsons)) + { + packets.Add(ConvertPacket(packet)); + } + + return packets; + } + + public static Packet ConvertPacket(JObject json) + { + PacketType packetType = json.GetValue("PacketType") + .ToObject(); Packet packet = null; switch (packetType) { case PacketType.ServerShutdown: - packet = JsonConvert.DeserializeObject(json); + packet = json.ToObject(); break; case PacketType.Connect: - packet = JsonConvert.DeserializeObject(json); + packet = json.ToObject(); break; case PacketType.Welcome: - packet = JsonConvert.DeserializeObject(json); + packet = json.ToObject(); break; case PacketType.Disconnect: - packet = JsonConvert.DeserializeObject(json); + packet = json.ToObject(); break; case PacketType.PlayerConnected: - packet = JsonConvert.DeserializeObject(json); + packet = json.ToObject(); break; case PacketType.PlayerDisconnected: - packet = JsonConvert.DeserializeObject(json); + packet = json.ToObject(); break; case PacketType.MessageReceivePacket: - packet = JsonConvert.DeserializeObject(json); + packet = json.ToObject(); break; case PacketType.MessageSendPacket: - packet = JsonConvert.DeserializeObject(json); + packet = json.ToObject(); break; case PacketType.GameStartPacket: - packet = JsonConvert.DeserializeObject(json); + packet = json.ToObject(); break; case PacketType.EndGame: - packet = JsonConvert.DeserializeObject(json); + packet = json.ToObject(); break; case PacketType.DisconnectPlayer: - packet = JsonConvert.DeserializeObject(json); + packet = json.ToObject(); break; case PacketType.Vote: - packet = JsonConvert.DeserializeObject(json); + packet = json.ToObject(); + break; + case PacketType.GameStateChanged: + packet = json.ToObject(); break; } diff --git a/MafiaCommon/Packets/PacketType.cs b/MafiaCommon/Packets/PacketType.cs index 5e68d8f..4d42401 100644 --- a/MafiaCommon/Packets/PacketType.cs +++ b/MafiaCommon/Packets/PacketType.cs @@ -13,6 +13,7 @@ EndGame=9, DisconnectPlayer=10, Vote=11, + GameStateChanged=12, ServerShutdown=99 } } \ No newline at end of file diff --git a/MafiaCommon/Role.cs b/MafiaCommon/Role.cs index 125fbc0..7e0c7c2 100644 --- a/MafiaCommon/Role.cs +++ b/MafiaCommon/Role.cs @@ -16,6 +16,7 @@ Ninja=12, Maniac=13, Werewolf=14, - RedJudge=15 + RedJudge=15, + Died=16 } } \ No newline at end of file diff --git a/MafiaGame/MainWindow.xaml b/MafiaGame/MainWindow.xaml index 4e3f9e3..c7563df 100644 --- a/MafiaGame/MainWindow.xaml +++ b/MafiaGame/MainWindow.xaml @@ -247,5 +247,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/MafiaGame/MainWindow.xaml.cs b/MafiaGame/MainWindow.xaml.cs index 429319e..a6edaad 100644 --- a/MafiaGame/MainWindow.xaml.cs +++ b/MafiaGame/MainWindow.xaml.cs @@ -49,6 +49,7 @@ namespace MafiaGame GameVotingPassive.Visibility = Visibility.Hidden; GameVotingActive.Visibility = Visibility.Hidden; GameEndScreen.Visibility = Visibility.Hidden; + GameDay.Visibility = Visibility.Hidden; } private void Exit_OnClick(object sender, RoutedEventArgs e) @@ -221,8 +222,7 @@ namespace MafiaGame GameEndScreenRoles.Text = text; - GameVotingActive.Visibility = Visibility.Hidden; - GameVotingPassive.Visibility = Visibility.Hidden; + HideAll(); GameEndScreen.Visibility = Visibility.Visible; } @@ -248,5 +248,42 @@ namespace MafiaGame ListBoxItem selected = (ListBoxItem)GameVotingActiveSelect.SelectedItem; App.Instance.Connection.Vote(Convert.ToInt32(((string)selected.Content).Split(")")[0])); } + + private void GameDayWait_OnKeyUp(object sender, KeyEventArgs e) + { + if (e.Key == Key.Enter) + { + GameDayChatSend_OnClick(null, null); + } + } + + private void GameDayChatSend_OnClick(object sender, RoutedEventArgs e) + { + if (GameDayChatInput.Text.Trim() != "") + { + App.Instance.Connection.SendMessage(ChatType.Day, GameDayChatInput.Text); + GameDayChatInput.Clear(); + } + } + + private void GameDaySelect_OnMouseDoubleClick(object sender, MouseButtonEventArgs e) + { + + } + + public void ShowDay(bool voting) + { + HideAll(); + GameDaySelect.IsEnabled = voting; + if (voting) + { + GameDayHotBar.Text = "Обсуждай и думай"; + } + else + { + GameDayHotBar.Text = "Голосуй и молись"; + } + GameDay.Visibility = Visibility.Visible; + } } } \ No newline at end of file diff --git a/MafiaGame/ServerConnection.cs b/MafiaGame/ServerConnection.cs index 4f64dd5..2ad1b4d 100644 --- a/MafiaGame/ServerConnection.cs +++ b/MafiaGame/ServerConnection.cs @@ -97,8 +97,17 @@ namespace MafiaGame Console.WriteLine(builder.ToString()); - Packet packet = PacketConverter.toPacket(builder.ToString()); - switch (packet.PacketType) + List packets = PacketConverter.toPacket(builder.ToString()); + foreach (Packet packet in packets) + { + WorkPacket(packet); + } + } + } + + private void WorkPacket(Packet packet) + { + switch (packet.PacketType) { case PacketType.Welcome: App.Current.Dispatcher.Invoke((Action) (() => @@ -254,20 +263,13 @@ namespace MafiaGame case GameState.Day: App.Current.Dispatcher.Invoke((Action) (() => { - MainWindow.Instance.HideAll(); - MainWindow.Instance.GameDay.Visibility = Visibility.Visible; + MainWindow.Instance.ShowDay(false); })); App.Instance.GetRpcClient().UpdateDetails("День"); break; } break; } - } - } - - private void WorkPacket(Packet packet) - { - } } } \ No newline at end of file diff --git a/MafiaServer/Game.cs b/MafiaServer/Game.cs index 167e94b..1b6d645 100644 --- a/MafiaServer/Game.cs +++ b/MafiaServer/Game.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Linq; using MafiaCommon.Packets; using MafiaCommon; @@ -96,6 +97,30 @@ namespace MafiaServer break; } } + + if (_votesRemain.Count == 0) + { + int selId = 0; + int selVotes = 0; + foreach (KeyValuePair votes in _mafiaVotes) + { + if (votes.Value > selVotes) + { + selId = votes.Key; + selVotes = votes.Value; + } + } + + _gameState = GameState.Day; + + PlayerSocketWorker killed = _players.FindPlayerById(selId); + killed.Role = Role.Died; + foreach (PlayerSocketWorker player in _players) + { + player.sendPacket(new GameStageChangedPacket(GameState.Day)); + player.sendPacket(new MessageReceivePacket(ChatType.Day,true,"System",killed.PlayerName+" был убит!")); + } + } } private void PlayerOnOnDisconnectEvent(PlayerSocketWorker sender) @@ -281,6 +306,23 @@ namespace MafiaServer } } break; + case ChatType.Day: + if (isStarted) + { + if (sender.Role == Role.Died) + { + sender.sendPacket(new MessageReceivePacket(ChatType.Day,true,"system","Мёртвое говорить не может")); + } + else + { + foreach (PlayerSocketWorker player in _players) + { + player.sendPacket( + new MessageReceivePacket(ChatType.Day, false, sender.PlayerName, text)); + } + } + } + break; } } } diff --git a/MafiaServer/PlayerSocketWorker.cs b/MafiaServer/PlayerSocketWorker.cs index c270c6b..0e934da 100644 --- a/MafiaServer/PlayerSocketWorker.cs +++ b/MafiaServer/PlayerSocketWorker.cs @@ -31,7 +31,7 @@ namespace MafiaServer builder.Append(Encoding.UTF8.GetString(data, 0, bytes)); } while (_socket.Available > 0); - var packet = PacketConverter.toPacket(builder.ToString()); + var packet = PacketConverter.toPacket(builder.ToString())[0]; if (packet.GetType() == typeof(ConnectPacket)) { PlayerName = ((ConnectPacket) packet).Name; @@ -77,20 +77,10 @@ namespace MafiaServer Console.WriteLine(builder.ToString()); - Packet packet = PacketConverter.toPacket(builder.ToString()); - switch (packet.PacketType) + List packets = PacketConverter.toPacket(builder.ToString()); + foreach (Packet packet in packets) { - case PacketType.MessageSendPacket: - OnPlayerSendMessageEvent.Invoke(this, ((MessageSendPacket) packet).ChatType, - ((MessageSendPacket) packet).Text); - break; - case PacketType.DisconnectPlayer: - _socket.Close(); - OnDisconnectEvent.Invoke(this); - break; - case PacketType.Vote: - OnPlayerVoteEvent.Invoke(this, ((VotePacket) packet).Id); - break; + WorkPacket(packet); } } catch (SocketException e) @@ -99,6 +89,24 @@ namespace MafiaServer } } } + + private void WorkPacket(Packet packet) + { + switch (packet.PacketType) + { + case PacketType.MessageSendPacket: + OnPlayerSendMessageEvent.Invoke(this, ((MessageSendPacket) packet).ChatType, + ((MessageSendPacket) packet).Text); + break; + case PacketType.DisconnectPlayer: + _socket.Close(); + OnDisconnectEvent.Invoke(this); + break; + case PacketType.Vote: + OnPlayerVoteEvent.Invoke(this, ((VotePacket) packet).Id); + break; + } + } } public static class PlayerSocketWorkerUtils {