День, убийство, общение, надо сделать проверку на роль после убийтсва, для самоубийц

This commit is contained in:
Ilya 2021-01-30 17:03:54 +03:00
parent dc9796ed31
commit 8d62442107
10 changed files with 198 additions and 42 deletions

View File

@ -4,5 +4,6 @@
{ {
Queue=1, Queue=1,
Active=2, Active=2,
Day=3
} }
} }

View File

@ -0,0 +1,12 @@
namespace MafiaCommon.Packets
{
public class GameStageChangedPacket : Packet
{
public readonly GameState GameState;
public GameStageChangedPacket(GameState gameState) : base(PacketType.GameStateChanged)
{
GameState = gameState;
}
}
}

View File

@ -1,4 +1,5 @@
using System; using System;
using System.Collections.Generic;
using System.Text; using System.Text;
using Newtonsoft.Json; using Newtonsoft.Json;
using Newtonsoft.Json.Linq; using Newtonsoft.Json.Linq;
@ -9,51 +10,68 @@ namespace MafiaCommon.Packets
{ {
public static byte[] toBytes(Packet packet) 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<Packet> toPacket(String jsons)
{ {
PacketType packetType = ((JObject)JsonConvert.DeserializeObject(json)).GetValue("PacketType").ToObject<PacketType>(); List<Packet> packets = new List<Packet>();
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<PacketType>();
Packet packet = null; Packet packet = null;
switch (packetType) switch (packetType)
{ {
case PacketType.ServerShutdown: case PacketType.ServerShutdown:
packet = JsonConvert.DeserializeObject<ServerShutdownPacket>(json); packet = json.ToObject<ServerShutdownPacket>();
break; break;
case PacketType.Connect: case PacketType.Connect:
packet = JsonConvert.DeserializeObject<ConnectPacket>(json); packet = json.ToObject<ConnectPacket>();
break; break;
case PacketType.Welcome: case PacketType.Welcome:
packet = JsonConvert.DeserializeObject<WelcomePacket>(json); packet = json.ToObject<WelcomePacket>();
break; break;
case PacketType.Disconnect: case PacketType.Disconnect:
packet = JsonConvert.DeserializeObject<DisconnectPacket>(json); packet = json.ToObject<DisconnectPacket>();
break; break;
case PacketType.PlayerConnected: case PacketType.PlayerConnected:
packet = JsonConvert.DeserializeObject<PlayerConnectedPacket>(json); packet = json.ToObject<PlayerConnectedPacket>();
break; break;
case PacketType.PlayerDisconnected: case PacketType.PlayerDisconnected:
packet = JsonConvert.DeserializeObject<PlayerDisconnectedPacket>(json); packet = json.ToObject<PlayerDisconnectedPacket>();
break; break;
case PacketType.MessageReceivePacket: case PacketType.MessageReceivePacket:
packet = JsonConvert.DeserializeObject<MessageReceivePacket>(json); packet = json.ToObject<MessageReceivePacket>();
break; break;
case PacketType.MessageSendPacket: case PacketType.MessageSendPacket:
packet = JsonConvert.DeserializeObject<MessageSendPacket>(json); packet = json.ToObject<MessageSendPacket>();
break; break;
case PacketType.GameStartPacket: case PacketType.GameStartPacket:
packet = JsonConvert.DeserializeObject<GameStartPacket>(json); packet = json.ToObject<GameStartPacket>();
break; break;
case PacketType.EndGame: case PacketType.EndGame:
packet = JsonConvert.DeserializeObject<EndGamePacket>(json); packet = json.ToObject<EndGamePacket>();
break; break;
case PacketType.DisconnectPlayer: case PacketType.DisconnectPlayer:
packet = JsonConvert.DeserializeObject<DisconnectPacket>(json); packet = json.ToObject<DisconnectPacket>();
break; break;
case PacketType.Vote: case PacketType.Vote:
packet = JsonConvert.DeserializeObject<VotePacket>(json); packet = json.ToObject<VotePacket>();
break;
case PacketType.GameStateChanged:
packet = json.ToObject<GameStageChangedPacket>();
break; break;
} }

View File

@ -13,6 +13,7 @@
EndGame=9, EndGame=9,
DisconnectPlayer=10, DisconnectPlayer=10,
Vote=11, Vote=11,
GameStateChanged=12,
ServerShutdown=99 ServerShutdown=99
} }
} }

View File

@ -16,6 +16,7 @@
Ninja=12, Ninja=12,
Maniac=13, Maniac=13,
Werewolf=14, Werewolf=14,
RedJudge=15 RedJudge=15,
Died=16
} }
} }

View File

@ -247,5 +247,39 @@
<TextBlock Grid.Column="1" Grid.ColumnSpan="3" Grid.Row="3" HorizontalAlignment="Center" x:Name="GameEndScreenRoles" FontSize="25" TextWrapping="Wrap"></TextBlock> <TextBlock Grid.Column="1" Grid.ColumnSpan="3" Grid.Row="3" HorizontalAlignment="Center" x:Name="GameEndScreenRoles" FontSize="25" TextWrapping="Wrap"></TextBlock>
<Button Grid.Column="2" Grid.Row="6" Click="GameEndScreenBack_OnClick" Content="Назад" FontSize="25"></Button> <Button Grid.Column="2" Grid.Row="6" Click="GameEndScreenBack_OnClick" Content="Назад" FontSize="25"></Button>
</Grid> </Grid>
<Grid x:Name="GameDay" Visibility="Hidden" KeyUp="GameDayWait_OnKeyUp">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="5*"></ColumnDefinition>
<ColumnDefinition Width="10*"></ColumnDefinition>
<ColumnDefinition Width="10*"></ColumnDefinition>
<ColumnDefinition Width="10*"></ColumnDefinition>
<ColumnDefinition Width="10*"></ColumnDefinition>
<ColumnDefinition Width="10*"></ColumnDefinition>
<ColumnDefinition Width="10*"></ColumnDefinition>
<ColumnDefinition Width="10*"></ColumnDefinition>
<ColumnDefinition Width="10*"></ColumnDefinition>
<ColumnDefinition Width="10*"></ColumnDefinition>
<ColumnDefinition Width="5*"></ColumnDefinition>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="5*"></RowDefinition>
<RowDefinition Height="10*"></RowDefinition>
<RowDefinition Height="5*"></RowDefinition>
<RowDefinition Height="10*"></RowDefinition>
<RowDefinition Height="5*"></RowDefinition>
<RowDefinition Height="10*"></RowDefinition>
<RowDefinition Height="5*"></RowDefinition>
<RowDefinition Height="10*"></RowDefinition>
<RowDefinition Height="5*"></RowDefinition>
<RowDefinition Height="10*"></RowDefinition>
<RowDefinition Height="10*"></RowDefinition>
<RowDefinition Height="10*"></RowDefinition>
</Grid.RowDefinitions>
<TextBlock Grid.Row="1" Grid.Column="2" Grid.ColumnSpan="7" HorizontalAlignment="Center" FontSize="30" x:Name="GameDayHotBar" Text="Обсуждай и думай" TextAlignment="Center"></TextBlock>
<ListBox Grid.Column="5" Grid.ColumnSpan="5" Grid.Row="2" Grid.RowSpan="8" x:Name="GameDayChat"></ListBox>
<TextBox Grid.Column="5" Grid.ColumnSpan="4" Grid.Row="10" TextWrapping="Wrap" x:Name="GameDayChatInput"></TextBox>
<Button Grid.Column="9" Grid.Row="10" Content="Отправить!" Click="GameDayChatSend_OnClick"></Button>
<ListBox Grid.Column="1" Grid.ColumnSpan="3" Grid.Row="2" Grid.RowSpan="8" x:Name="GameDaySelect" MouseDoubleClick="GameDaySelect_OnMouseDoubleClick" SelectionMode="Single"></ListBox>
</Grid>
</Grid> </Grid>
</Window> </Window>

View File

@ -49,6 +49,7 @@ namespace MafiaGame
GameVotingPassive.Visibility = Visibility.Hidden; GameVotingPassive.Visibility = Visibility.Hidden;
GameVotingActive.Visibility = Visibility.Hidden; GameVotingActive.Visibility = Visibility.Hidden;
GameEndScreen.Visibility = Visibility.Hidden; GameEndScreen.Visibility = Visibility.Hidden;
GameDay.Visibility = Visibility.Hidden;
} }
private void Exit_OnClick(object sender, RoutedEventArgs e) private void Exit_OnClick(object sender, RoutedEventArgs e)
@ -221,8 +222,7 @@ namespace MafiaGame
GameEndScreenRoles.Text = text; GameEndScreenRoles.Text = text;
GameVotingActive.Visibility = Visibility.Hidden; HideAll();
GameVotingPassive.Visibility = Visibility.Hidden;
GameEndScreen.Visibility = Visibility.Visible; GameEndScreen.Visibility = Visibility.Visible;
} }
@ -248,5 +248,42 @@ namespace MafiaGame
ListBoxItem selected = (ListBoxItem)GameVotingActiveSelect.SelectedItem; ListBoxItem selected = (ListBoxItem)GameVotingActiveSelect.SelectedItem;
App.Instance.Connection.Vote(Convert.ToInt32(((string)selected.Content).Split(")")[0])); 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;
}
} }
} }

View File

@ -97,8 +97,17 @@ namespace MafiaGame
Console.WriteLine(builder.ToString()); Console.WriteLine(builder.ToString());
Packet packet = PacketConverter.toPacket(builder.ToString()); List<Packet> packets = PacketConverter.toPacket(builder.ToString());
switch (packet.PacketType) foreach (Packet packet in packets)
{
WorkPacket(packet);
}
}
}
private void WorkPacket(Packet packet)
{
switch (packet.PacketType)
{ {
case PacketType.Welcome: case PacketType.Welcome:
App.Current.Dispatcher.Invoke((Action) (() => App.Current.Dispatcher.Invoke((Action) (() =>
@ -254,20 +263,13 @@ namespace MafiaGame
case GameState.Day: case GameState.Day:
App.Current.Dispatcher.Invoke((Action) (() => App.Current.Dispatcher.Invoke((Action) (() =>
{ {
MainWindow.Instance.HideAll(); MainWindow.Instance.ShowDay(false);
MainWindow.Instance.GameDay.Visibility = Visibility.Visible;
})); }));
App.Instance.GetRpcClient().UpdateDetails("День"); App.Instance.GetRpcClient().UpdateDetails("День");
break; break;
} }
break; break;
} }
}
}
private void WorkPacket(Packet packet)
{
} }
} }
} }

View File

@ -1,5 +1,6 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq;
using MafiaCommon.Packets; using MafiaCommon.Packets;
using MafiaCommon; using MafiaCommon;
@ -96,6 +97,30 @@ namespace MafiaServer
break; break;
} }
} }
if (_votesRemain.Count == 0)
{
int selId = 0;
int selVotes = 0;
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);
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) private void PlayerOnOnDisconnectEvent(PlayerSocketWorker sender)
@ -281,6 +306,23 @@ namespace MafiaServer
} }
} }
break; 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;
} }
} }
} }

View File

@ -31,7 +31,7 @@ namespace MafiaServer
builder.Append(Encoding.UTF8.GetString(data, 0, bytes)); builder.Append(Encoding.UTF8.GetString(data, 0, bytes));
} while (_socket.Available > 0); } while (_socket.Available > 0);
var packet = PacketConverter.toPacket(builder.ToString()); var packet = PacketConverter.toPacket(builder.ToString())[0];
if (packet.GetType() == typeof(ConnectPacket)) if (packet.GetType() == typeof(ConnectPacket))
{ {
PlayerName = ((ConnectPacket) packet).Name; PlayerName = ((ConnectPacket) packet).Name;
@ -77,20 +77,10 @@ namespace MafiaServer
Console.WriteLine(builder.ToString()); Console.WriteLine(builder.ToString());
Packet packet = PacketConverter.toPacket(builder.ToString()); List<Packet> packets = PacketConverter.toPacket(builder.ToString());
switch (packet.PacketType) foreach (Packet packet in packets)
{ {
case PacketType.MessageSendPacket: WorkPacket(packet);
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;
} }
} }
catch (SocketException e) 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 { public static class PlayerSocketWorkerUtils {