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

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,
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.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<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;
switch (packetType)
{
case PacketType.ServerShutdown:
packet = JsonConvert.DeserializeObject<ServerShutdownPacket>(json);
packet = json.ToObject<ServerShutdownPacket>();
break;
case PacketType.Connect:
packet = JsonConvert.DeserializeObject<ConnectPacket>(json);
packet = json.ToObject<ConnectPacket>();
break;
case PacketType.Welcome:
packet = JsonConvert.DeserializeObject<WelcomePacket>(json);
packet = json.ToObject<WelcomePacket>();
break;
case PacketType.Disconnect:
packet = JsonConvert.DeserializeObject<DisconnectPacket>(json);
packet = json.ToObject<DisconnectPacket>();
break;
case PacketType.PlayerConnected:
packet = JsonConvert.DeserializeObject<PlayerConnectedPacket>(json);
packet = json.ToObject<PlayerConnectedPacket>();
break;
case PacketType.PlayerDisconnected:
packet = JsonConvert.DeserializeObject<PlayerDisconnectedPacket>(json);
packet = json.ToObject<PlayerDisconnectedPacket>();
break;
case PacketType.MessageReceivePacket:
packet = JsonConvert.DeserializeObject<MessageReceivePacket>(json);
packet = json.ToObject<MessageReceivePacket>();
break;
case PacketType.MessageSendPacket:
packet = JsonConvert.DeserializeObject<MessageSendPacket>(json);
packet = json.ToObject<MessageSendPacket>();
break;
case PacketType.GameStartPacket:
packet = JsonConvert.DeserializeObject<GameStartPacket>(json);
packet = json.ToObject<GameStartPacket>();
break;
case PacketType.EndGame:
packet = JsonConvert.DeserializeObject<EndGamePacket>(json);
packet = json.ToObject<EndGamePacket>();
break;
case PacketType.DisconnectPlayer:
packet = JsonConvert.DeserializeObject<DisconnectPacket>(json);
packet = json.ToObject<DisconnectPacket>();
break;
case PacketType.Vote:
packet = JsonConvert.DeserializeObject<VotePacket>(json);
packet = json.ToObject<VotePacket>();
break;
case PacketType.GameStateChanged:
packet = json.ToObject<GameStageChangedPacket>();
break;
}

View File

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

View File

@ -16,6 +16,7 @@
Ninja=12,
Maniac=13,
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>
<Button Grid.Column="2" Grid.Row="6" Click="GameEndScreenBack_OnClick" Content="Назад" FontSize="25"></Button>
</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>
</Window>

View File

@ -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;
}
}
}

View File

@ -97,8 +97,17 @@ namespace MafiaGame
Console.WriteLine(builder.ToString());
Packet packet = PacketConverter.toPacket(builder.ToString());
switch (packet.PacketType)
List<Packet> 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)
{
}
}
}

View File

@ -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<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)
@ -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;
}
}
}

View File

@ -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<Packet> 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 {