Working start and game stop on mafia leave
This commit is contained in:
parent
eb23f27364
commit
6d99b0bbee
27
MafiaCommon/ArrayUtils.cs
Normal file
27
MafiaCommon/ArrayUtils.cs
Normal file
@ -0,0 +1,27 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace MafiaCommon
|
||||
{
|
||||
public static class ListUtils
|
||||
{
|
||||
public static void Shuffle<T> (this Random rng, T[] array)
|
||||
{
|
||||
int n = array.Length;
|
||||
while (n > 1)
|
||||
{
|
||||
int k = rng.Next(n--);
|
||||
T temp = array[n];
|
||||
array[n] = array[k];
|
||||
array[k] = temp;
|
||||
}
|
||||
}
|
||||
|
||||
public static T[] RemoveFromArray<T> (this T[] original, int numIdx) {
|
||||
if (numIdx == -1) return original;
|
||||
List<T> tmp = new List<T>(original);
|
||||
tmp.RemoveAt(numIdx);
|
||||
return tmp.ToArray();
|
||||
}
|
||||
}
|
||||
}
|
8
MafiaCommon/ChatType.cs
Normal file
8
MafiaCommon/ChatType.cs
Normal file
@ -0,0 +1,8 @@
|
||||
namespace MafiaCommon
|
||||
{
|
||||
public enum ChatType
|
||||
{
|
||||
Queue=1,
|
||||
Active=2,
|
||||
}
|
||||
}
|
10
MafiaCommon/GameState.cs
Normal file
10
MafiaCommon/GameState.cs
Normal file
@ -0,0 +1,10 @@
|
||||
namespace MafiaCommon
|
||||
{
|
||||
public enum GameState
|
||||
{
|
||||
NotStarted=1,
|
||||
VotingNight=2,
|
||||
Day=3,
|
||||
VotingDay=4
|
||||
}
|
||||
}
|
@ -1,7 +0,0 @@
|
||||
namespace MafiaCommon.Packets
|
||||
{
|
||||
public enum ChatType
|
||||
{
|
||||
Queue=1
|
||||
}
|
||||
}
|
10
MafiaCommon/Packets/DisconnectPlayerPacket.cs
Normal file
10
MafiaCommon/Packets/DisconnectPlayerPacket.cs
Normal file
@ -0,0 +1,10 @@
|
||||
namespace MafiaCommon.Packets
|
||||
{
|
||||
public class DisconnectPlayerPacket : Packet
|
||||
{
|
||||
public DisconnectPlayerPacket() : base(PacketType.DisconnectPlayer)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
}
|
16
MafiaCommon/Packets/EndGamePacket.cs
Normal file
16
MafiaCommon/Packets/EndGamePacket.cs
Normal file
@ -0,0 +1,16 @@
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace MafiaCommon.Packets
|
||||
{
|
||||
public class EndGamePacket : Packet
|
||||
{
|
||||
public readonly bool IsWon;
|
||||
public readonly List<PlayerRole> PlayerRoles;
|
||||
|
||||
public EndGamePacket(bool isWon, List<PlayerRole> playerRoles) : base(PacketType.EndGame)
|
||||
{
|
||||
IsWon = isWon;
|
||||
PlayerRoles = playerRoles;
|
||||
}
|
||||
}
|
||||
}
|
12
MafiaCommon/Packets/GameStartPacket.cs
Normal file
12
MafiaCommon/Packets/GameStartPacket.cs
Normal file
@ -0,0 +1,12 @@
|
||||
namespace MafiaCommon.Packets
|
||||
{
|
||||
public class GameStartPacket : Packet
|
||||
{
|
||||
public readonly Role Role;
|
||||
|
||||
public GameStartPacket(Role role) : base(PacketType.GameStartPacket)
|
||||
{
|
||||
Role = role;
|
||||
}
|
||||
}
|
||||
}
|
@ -43,6 +43,12 @@ namespace MafiaCommon.Packets
|
||||
case PacketType.MessageSendPacket:
|
||||
packet = JsonConvert.DeserializeObject<MessageSendPacket>(json);
|
||||
break;
|
||||
case PacketType.GameStartPacket:
|
||||
packet = JsonConvert.DeserializeObject<GameStartPacket>(json);
|
||||
break;
|
||||
case PacketType.EndGame:
|
||||
packet = JsonConvert.DeserializeObject<EndGamePacket>(json);
|
||||
break;
|
||||
}
|
||||
|
||||
return packet;
|
||||
|
@ -9,6 +9,9 @@
|
||||
PlayerDisconnected=5,
|
||||
MessageReceivePacket=6,
|
||||
MessageSendPacket=7,
|
||||
GameStartPacket=8,
|
||||
EndGame=9,
|
||||
DisconnectPlayer=10,
|
||||
ServerShutdown=99
|
||||
}
|
||||
}
|
14
MafiaCommon/PlayerRole.cs
Normal file
14
MafiaCommon/PlayerRole.cs
Normal file
@ -0,0 +1,14 @@
|
||||
namespace MafiaCommon
|
||||
{
|
||||
public class PlayerRole
|
||||
{
|
||||
public readonly string Name;
|
||||
public readonly Role Role;
|
||||
|
||||
public PlayerRole(string name, Role role)
|
||||
{
|
||||
Name = name;
|
||||
Role = role;
|
||||
}
|
||||
}
|
||||
}
|
21
MafiaCommon/Role.cs
Normal file
21
MafiaCommon/Role.cs
Normal file
@ -0,0 +1,21 @@
|
||||
namespace MafiaCommon
|
||||
{
|
||||
public enum Role
|
||||
{
|
||||
Citizen=1,
|
||||
Commissar=2,
|
||||
Don=3,
|
||||
Doctor=4,
|
||||
Sheriff=5,
|
||||
Mafia=6,
|
||||
Deathless=7,
|
||||
Putana=8,
|
||||
BlackJudge=9,
|
||||
BlackLawyer=10,
|
||||
YakuzaFighter=11,
|
||||
Ninja=12,
|
||||
Maniac=13,
|
||||
Werewolf=14,
|
||||
RedJudge=15
|
||||
}
|
||||
}
|
@ -6,7 +6,7 @@
|
||||
mc:Ignorable="d"
|
||||
Title="RMafia" Height="450" Width="800">
|
||||
<Grid>
|
||||
<Grid x:Name="MainMenu">
|
||||
<Grid x:Name="MainMenu" Visibility="Visible">
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="10*"></ColumnDefinition>
|
||||
<ColumnDefinition Width="30*"></ColumnDefinition>
|
||||
@ -127,6 +127,7 @@
|
||||
<ListBox Grid.Column="5" Grid.ColumnSpan="5" Grid.Row="1" Grid.RowSpan="8" x:Name="QueueChat"></ListBox>
|
||||
<TextBox Grid.Column="5" Grid.ColumnSpan="4" Grid.Row="9" TextWrapping="Wrap" x:Name="QueueChatInput"></TextBox>
|
||||
<Button Grid.Column="9" Grid.Row="9" Content="Отправить!" Click="GameQueueChatSend_OnClick"></Button>
|
||||
<Button Grid.Column="1" Grid.ColumnSpan="3" Grid.Row="9" Content="Выйти" Click="GameQueueLeave_OnClick"></Button>
|
||||
</Grid>
|
||||
|
||||
<Grid x:Name="DisconnectScreen" Visibility="Hidden">
|
||||
@ -152,5 +153,99 @@
|
||||
<TextBlock Grid.Column="1" Grid.ColumnSpan="3" Grid.Row="3" HorizontalAlignment="Center" x:Name="ReasonText" FontSize="25" TextWrapping="Wrap"></TextBlock>
|
||||
<Button Grid.Column="2" Grid.Row="6" Click="Back_OnClick" Content="Назад" FontSize="25"></Button>
|
||||
</Grid>
|
||||
|
||||
<Grid x:Name="GameVotingPassive" Visibility="Hidden">
|
||||
<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="5*"></RowDefinition>
|
||||
<RowDefinition Height="10*"></RowDefinition>
|
||||
<RowDefinition Height="5*"></RowDefinition>
|
||||
</Grid.RowDefinitions>
|
||||
|
||||
<TextBlock Grid.Row="1" Grid.Column="2" Grid.ColumnSpan="7" HorizontalAlignment="Center" FontSize="30" x:Name="GameVotingPassiveRole"></TextBlock>
|
||||
<TextBlock Grid.Row="5" Grid.Column="2" Grid.ColumnSpan="7" Text="Спи спокойно, пока можешь" HorizontalAlignment="Center" FontSize="30"></TextBlock>
|
||||
</Grid>
|
||||
|
||||
<Grid x:Name="GameVotingActive" Visibility="Hidden" KeyUp="GameVotingActive_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="GameVotingActiveRole"></TextBlock>
|
||||
<ListBox Grid.Column="5" Grid.ColumnSpan="5" Grid.Row="2" Grid.RowSpan="8" x:Name="GameVotingActiveChat"></ListBox>
|
||||
<TextBox Grid.Column="5" Grid.ColumnSpan="4" Grid.Row="10" TextWrapping="Wrap" x:Name="GameVotingActiveChatInput"></TextBox>
|
||||
<Button Grid.Column="9" Grid.Row="10" Content="Отправить!" Click="GameVotingActiveChatSend_OnClick"></Button>
|
||||
<ListBox Grid.Column="1" Grid.ColumnSpan="3" Grid.Row="2" Grid.RowSpan="8" x:Name="GameVotingActiveSelect"></ListBox>
|
||||
</Grid>
|
||||
|
||||
<Grid x:Name="GameEndScreen" Visibility="Hidden">
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="5*"></ColumnDefinition>
|
||||
<ColumnDefinition Width="25*"></ColumnDefinition>
|
||||
<ColumnDefinition Width="40*"></ColumnDefinition>
|
||||
<ColumnDefinition Width="25*"></ColumnDefinition>
|
||||
<ColumnDefinition Width="5*"></ColumnDefinition>
|
||||
</Grid.ColumnDefinitions>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="5*"></RowDefinition>
|
||||
<RowDefinition Height="10*"></RowDefinition>
|
||||
<RowDefinition Height="5*"></RowDefinition>
|
||||
<RowDefinition Height="35*"></RowDefinition>
|
||||
<RowDefinition Height="5*"></RowDefinition>
|
||||
<RowDefinition Height="10*"></RowDefinition>
|
||||
<RowDefinition Height="10*"></RowDefinition>
|
||||
<RowDefinition Height="10*"></RowDefinition>
|
||||
</Grid.RowDefinitions>
|
||||
|
||||
<TextBlock Grid.Column="2" Grid.Row="1" FontSize="30" HorizontalAlignment="Center" x:Name="GameEndScreenWon"></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>
|
||||
</Grid>
|
||||
</Grid>
|
||||
</Window>
|
||||
|
@ -14,7 +14,7 @@ using System.Windows.Media.Imaging;
|
||||
using System.Windows.Navigation;
|
||||
using System.Windows.Shapes;
|
||||
using DiscordRPC;
|
||||
using MafiaCommon.Packets;
|
||||
using MafiaCommon;
|
||||
|
||||
namespace MafiaGame
|
||||
{
|
||||
@ -143,5 +143,92 @@ namespace MafiaGame
|
||||
QueueChatInput.Clear();
|
||||
}
|
||||
}
|
||||
|
||||
public void ShowVotingPassive(string name)
|
||||
{
|
||||
GameQueue.Visibility = Visibility.Hidden;
|
||||
GameVotingPassive.Visibility = Visibility.Visible;
|
||||
GameVotingPassiveRole.Text = name;
|
||||
}
|
||||
|
||||
public void ShowVotingActive(string name)
|
||||
{
|
||||
GameQueue.Visibility = Visibility.Hidden;
|
||||
GameVotingActive.Visibility = Visibility.Visible;
|
||||
GameVotingActiveRole.Text = name;
|
||||
}
|
||||
|
||||
private void GameVotingActiveChatSend_OnClick(object sender, RoutedEventArgs e)
|
||||
{
|
||||
if (GameVotingActiveChatInput.Text.Trim() != "")
|
||||
{
|
||||
App.Instance.Connection.SendMessage(ChatType.Active, GameVotingActiveChatInput.Text);
|
||||
GameVotingActiveChatInput.Clear();
|
||||
}
|
||||
}
|
||||
|
||||
private void GameVotingActive_OnKeyUp(object sender, KeyEventArgs e)
|
||||
{
|
||||
if (e.Key == Key.Enter)
|
||||
{
|
||||
GameVotingActiveChatSend_OnClick(null, null);
|
||||
}
|
||||
}
|
||||
|
||||
public void ShowGameEnd(bool isWon, List<PlayerRole> playerRoles)
|
||||
{
|
||||
if (isWon)
|
||||
{
|
||||
GameEndScreenWon.Text = "Ты победил!";
|
||||
}
|
||||
else
|
||||
{
|
||||
GameEndScreenWon.Text = "Ты проиграл!";
|
||||
}
|
||||
|
||||
string text = "";
|
||||
|
||||
foreach (PlayerRole playerRole in playerRoles)
|
||||
{
|
||||
string role = "Роль";
|
||||
switch (playerRole.Role)
|
||||
{
|
||||
case Role.Citizen:
|
||||
role = "Мирный житель";
|
||||
break;
|
||||
case Role.Mafia:
|
||||
role = "Мафия";
|
||||
break;
|
||||
case Role.Don:
|
||||
role = "Дон";
|
||||
break;
|
||||
}
|
||||
|
||||
text += playerRole.Name + " - " + role + Environment.NewLine;
|
||||
}
|
||||
|
||||
GameEndScreenRoles.Text = text;
|
||||
|
||||
GameVotingActive.Visibility = Visibility.Hidden;
|
||||
GameVotingPassive.Visibility = Visibility.Hidden;
|
||||
GameEndScreen.Visibility = Visibility.Visible;
|
||||
}
|
||||
|
||||
private void GameEndScreenBack_OnClick(object sender, RoutedEventArgs e)
|
||||
{
|
||||
GameEndScreen.Visibility = Visibility.Hidden;
|
||||
GameQueue.Visibility = Visibility.Visible;
|
||||
}
|
||||
|
||||
private void GameQueueLeave_OnClick(object sender, RoutedEventArgs e)
|
||||
{
|
||||
App.Instance.Connection.Disconnect();
|
||||
GameQueue.Visibility = Visibility.Hidden;
|
||||
MainMenu.Visibility = Visibility.Visible;
|
||||
App.Instance.GetRpcClient().SetPresence(new RichPresence()
|
||||
{
|
||||
State = "В главном меню"
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
@ -5,6 +5,7 @@ using System.Threading;
|
||||
using System.Windows.Controls;
|
||||
using DiscordRPC;
|
||||
using MafiaCommon.Packets;
|
||||
using MafiaCommon;
|
||||
|
||||
namespace MafiaGame
|
||||
{
|
||||
@ -37,12 +38,13 @@ namespace MafiaGame
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
App.Current.Dispatcher.Invoke((Action)(() =>
|
||||
App.Current.Dispatcher.Invoke((Action) (() =>
|
||||
{
|
||||
MainWindow.Instance.ShowDisconnectScreen(e.Message);
|
||||
}));
|
||||
return;
|
||||
}
|
||||
|
||||
_socket.Send(PacketConverter.toBytes(new ConnectPacket(Settings.Config().Nick)));
|
||||
_thread.IsBackground = true;
|
||||
_thread.Start();
|
||||
@ -53,6 +55,13 @@ namespace MafiaGame
|
||||
_socket.Send(PacketConverter.toBytes(new MessageSendPacket(chatType, text)));
|
||||
}
|
||||
|
||||
public void Disconnect()
|
||||
{
|
||||
_socket.Send(PacketConverter.toBytes(new DisconnectPlayerPacket()));
|
||||
_thread.Interrupt();
|
||||
_socket.Close();
|
||||
}
|
||||
|
||||
private void serverListener()
|
||||
{
|
||||
while (!_breakFlag)
|
||||
@ -64,8 +73,7 @@ namespace MafiaGame
|
||||
{
|
||||
bytes = _socket.Receive(data);
|
||||
builder.Append(Encoding.UTF8.GetString(data, 0, bytes));
|
||||
}
|
||||
while (_socket.Available>0);
|
||||
} while (_socket.Available > 0);
|
||||
|
||||
Console.WriteLine(builder.ToString());
|
||||
|
||||
@ -73,7 +81,7 @@ namespace MafiaGame
|
||||
switch (packet.PacketType)
|
||||
{
|
||||
case PacketType.Welcome:
|
||||
App.Current.Dispatcher.Invoke((Action)(() =>
|
||||
App.Current.Dispatcher.Invoke((Action) (() =>
|
||||
{
|
||||
MainWindow.Instance.QueueOnline.Text = ((WelcomePacket) packet).Players + "/" +
|
||||
((WelcomePacket) packet).MaxPlayers;
|
||||
@ -87,7 +95,7 @@ namespace MafiaGame
|
||||
secrets.SpectateSecret = _host + ":" + _port + "/spectate";
|
||||
App.Instance.GetRpcClient().SetPresence(new RichPresence()
|
||||
{
|
||||
State = ((WelcomePacket)packet).ServerName,
|
||||
State = ((WelcomePacket) packet).ServerName,
|
||||
Party = party,
|
||||
Secrets = secrets,
|
||||
Timestamps = Timestamps.Now,
|
||||
@ -96,37 +104,54 @@ namespace MafiaGame
|
||||
}));
|
||||
break;
|
||||
case PacketType.Disconnect:
|
||||
App.Current.Dispatcher.Invoke((Action)(() =>
|
||||
App.Current.Dispatcher.Invoke((Action) (() =>
|
||||
{
|
||||
MainWindow.Instance.ShowDisconnectScreen(((DisconnectPacket)packet).Reason);
|
||||
MainWindow.Instance.ShowDisconnectScreen(((DisconnectPacket) packet).Reason);
|
||||
}));
|
||||
_breakFlag = true;
|
||||
break;
|
||||
case PacketType.PlayerConnected:
|
||||
App.Current.Dispatcher.Invoke((Action)(() =>
|
||||
App.Current.Dispatcher.Invoke((Action) (() =>
|
||||
{
|
||||
MainWindow.Instance.QueueOnline.Text = ((PlayerConnectedPacket) packet).Players + "/" +
|
||||
((PlayerConnectedPacket) packet).MaxPlayers;
|
||||
}));
|
||||
App.Instance.GetRpcClient().UpdatePartySize(((PlayerConnectedPacket) packet).Players);
|
||||
try
|
||||
{
|
||||
App.Instance.GetRpcClient().UpdatePartySize(((PlayerConnectedPacket) packet).Players);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Console.WriteLine(e.Message);
|
||||
}
|
||||
|
||||
break;
|
||||
case PacketType.PlayerDisconnected:
|
||||
App.Current.Dispatcher.Invoke((Action)(() =>
|
||||
App.Current.Dispatcher.Invoke((Action) (() =>
|
||||
{
|
||||
MainWindow.Instance.QueueOnline.Text = ((PlayerDisconnectedPacket) packet).Players + "/" +
|
||||
((PlayerDisconnectedPacket) packet).MaxPlayers;
|
||||
}));
|
||||
App.Instance.GetRpcClient().UpdatePartySize(((PlayerDisconnectedPacket) packet).Players);
|
||||
try
|
||||
{
|
||||
App.Instance.GetRpcClient().UpdatePartySize(((PlayerDisconnectedPacket) packet).Players);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Console.WriteLine(e.Message);
|
||||
}
|
||||
|
||||
break;
|
||||
case PacketType.ServerShutdown:
|
||||
App.Current.Dispatcher.Invoke((Action)(() =>
|
||||
App.Current.Dispatcher.Invoke((Action) (() =>
|
||||
{
|
||||
MainWindow.Instance.ShowDisconnectScreen("Сервер выключен: "+((ServerShutdownPacket)packet).Reason);
|
||||
MainWindow.Instance.ShowDisconnectScreen("Сервер выключен: " +
|
||||
((ServerShutdownPacket) packet).Reason);
|
||||
}));
|
||||
_breakFlag = true;
|
||||
break;
|
||||
case PacketType.MessageReceivePacket:
|
||||
App.Current.Dispatcher.Invoke((Action)(() =>
|
||||
App.Current.Dispatcher.Invoke((Action) (() =>
|
||||
{
|
||||
ListBoxItem message = new ListBoxItem();
|
||||
if (((MessageReceivePacket) packet).IsSystem)
|
||||
@ -139,15 +164,51 @@ namespace MafiaGame
|
||||
((MessageReceivePacket) packet).Text;
|
||||
}
|
||||
|
||||
switch (((MessageReceivePacket)packet).ChatType)
|
||||
switch (((MessageReceivePacket) packet).ChatType)
|
||||
{
|
||||
case ChatType.Queue:
|
||||
MainWindow.Instance.QueueChat.Items.Add(message);
|
||||
MainWindow.Instance.QueueChat.ScrollIntoView(message);
|
||||
break;
|
||||
case ChatType.Active:
|
||||
MainWindow.Instance.GameVotingActiveChat.Items.Add(message);
|
||||
MainWindow.Instance.GameVotingActiveChat.ScrollIntoView(message);
|
||||
break;
|
||||
}
|
||||
}));
|
||||
break;
|
||||
case PacketType.GameStartPacket:
|
||||
switch (((GameStartPacket) packet).Role)
|
||||
{
|
||||
case Role.Citizen:
|
||||
App.Current.Dispatcher.Invoke((Action) (() =>
|
||||
{
|
||||
MainWindow.Instance.ShowVotingPassive("Ты Мирный Житель");
|
||||
}));
|
||||
break;
|
||||
case Role.Don:
|
||||
App.Current.Dispatcher.Invoke((Action) (() =>
|
||||
{
|
||||
MainWindow.Instance.ShowVotingActive("Ты Дон, выбери кого убить!");
|
||||
}));
|
||||
break;
|
||||
case Role.Mafia:
|
||||
App.Current.Dispatcher.Invoke((Action) (() =>
|
||||
{
|
||||
MainWindow.Instance.ShowVotingActive("Ты Мафия, выбери кого убить!");
|
||||
}));
|
||||
break;
|
||||
}
|
||||
|
||||
App.Instance.GetRpcClient().UpdateDetails("Голосование");
|
||||
break;
|
||||
case PacketType.EndGame:
|
||||
App.Current.Dispatcher.Invoke((Action) (() =>
|
||||
{
|
||||
MainWindow.Instance.ShowGameEnd(((EndGamePacket)packet).IsWon,((EndGamePacket)packet).PlayerRoles);
|
||||
}));
|
||||
App.Instance.GetRpcClient().UpdateDetails("Ожидание старта");
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
4
MafiaServer/Events/OnDisconnectEvent.cs
Normal file
4
MafiaServer/Events/OnDisconnectEvent.cs
Normal file
@ -0,0 +1,4 @@
|
||||
namespace MafiaServer.Events
|
||||
{
|
||||
public delegate void OnDisconnectEvent(PlayerSocketWorker player);
|
||||
}
|
@ -1,4 +1,4 @@
|
||||
using MafiaCommon.Packets;
|
||||
using MafiaCommon;
|
||||
|
||||
namespace MafiaServer.Events
|
||||
{
|
||||
|
@ -1,13 +1,19 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using MafiaCommon.Packets;
|
||||
using MafiaCommon;
|
||||
|
||||
namespace MafiaServer
|
||||
{
|
||||
public class Game
|
||||
{
|
||||
private List<PlayerSocketWorker> _players = new List<PlayerSocketWorker>();
|
||||
private List<PlayerRole> _playerRolesAtStart = new List<PlayerRole>();
|
||||
private bool isStarted = false;
|
||||
private GameState _gameState = GameState.NotStarted;
|
||||
|
||||
List<PlayerSocketWorker> _mafia = new List<PlayerSocketWorker>();
|
||||
|
||||
public Game()
|
||||
{
|
||||
@ -31,17 +37,112 @@ namespace MafiaServer
|
||||
player.Id = _players.LastIndexOf(player);
|
||||
player.OnDisconnectByErrorEvent += OnDisconnectByError;
|
||||
player.OnPlayerSendMessageEvent += PlayerOnOnPlayerSendMessageEvent;
|
||||
player.OnDisconnectEvent += PlayerOnOnDisconnectEvent;
|
||||
player.sendPacket(new WelcomePacket(Settings.Config().ServerName,_players.Count,Settings.Config().MaxPlayers));
|
||||
}
|
||||
}
|
||||
|
||||
private void PlayerOnOnDisconnectEvent(PlayerSocketWorker sender)
|
||||
{
|
||||
_players.Remove(sender);
|
||||
foreach (PlayerSocketWorker player in _players)
|
||||
{
|
||||
player.sendPacket(new PlayerDisconnectedPacket(true,sender.Id,_players.Count,Settings.Config().MaxPlayers));
|
||||
}
|
||||
if (sender.Role == Role.Don)
|
||||
{
|
||||
_mafia.Remove(sender);
|
||||
if (_mafia.Count == 0)
|
||||
{
|
||||
foreach (PlayerSocketWorker player in _players)
|
||||
{
|
||||
player.sendPacket(new EndGamePacket(true,_playerRolesAtStart));
|
||||
}
|
||||
|
||||
isStarted = false;
|
||||
_gameState = GameState.NotStarted;
|
||||
}
|
||||
else
|
||||
{
|
||||
_mafia[0].Role = Role.Don;
|
||||
if (_gameState == GameState.VotingNight)
|
||||
{
|
||||
_mafia[0].sendPacket(new MessageReceivePacket(ChatType.Active,true,"System","Дон покинул игру, ты новый дон!"));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void Start()
|
||||
{
|
||||
if (isStarted)
|
||||
{
|
||||
return;
|
||||
}
|
||||
if (_players.Count < 2)
|
||||
{
|
||||
Console.WriteLine("Not Enough Players");
|
||||
return;
|
||||
}
|
||||
|
||||
foreach (PlayerSocketWorker player in _players)
|
||||
{
|
||||
player.Role = Role.Citizen;
|
||||
}
|
||||
_playerRolesAtStart.Clear();
|
||||
|
||||
Random random = new Random();
|
||||
|
||||
PlayerSocketWorker[] empty = _players.ToArray();
|
||||
random.Shuffle(empty);
|
||||
|
||||
int mafiasNeed = 1;
|
||||
if (empty.Length > 5)
|
||||
{
|
||||
mafiasNeed = empty.Length / 3;
|
||||
}
|
||||
|
||||
while (mafiasNeed!=0)
|
||||
{
|
||||
for (var i = 0; i < empty.Length; i++)
|
||||
{
|
||||
switch (random.Next(2))
|
||||
{
|
||||
case 0: //Мирный
|
||||
break;
|
||||
case 1: //Мафия
|
||||
empty[i].Role = Role.Mafia;
|
||||
mafiasNeed--;
|
||||
_mafia.Add(empty[i]);
|
||||
empty = empty.RemoveFromArray(i);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
PlayerSocketWorker don = _mafia[0];
|
||||
don.Role = Role.Don;
|
||||
_mafia.RemoveAt(0);
|
||||
|
||||
don.sendPacket(new GameStartPacket(Role.Don));
|
||||
|
||||
foreach (PlayerSocketWorker player in empty)
|
||||
{
|
||||
player.sendPacket(new GameStartPacket(Role.Citizen));
|
||||
}
|
||||
|
||||
foreach (PlayerSocketWorker player in _mafia)
|
||||
{
|
||||
player.sendPacket(new GameStartPacket(Role.Mafia));
|
||||
}
|
||||
|
||||
foreach (PlayerSocketWorker player in _players)
|
||||
{
|
||||
_playerRolesAtStart.Add(new PlayerRole(player.PlayerName,player.Role));
|
||||
}
|
||||
|
||||
isStarted = true;
|
||||
_gameState = GameState.VotingNight;
|
||||
}
|
||||
|
||||
private void OnDisconnectByError(PlayerSocketWorker sender)
|
||||
@ -51,6 +152,28 @@ namespace MafiaServer
|
||||
{
|
||||
player.sendPacket(new PlayerDisconnectedPacket(true,sender.Id,_players.Count,Settings.Config().MaxPlayers));
|
||||
}
|
||||
if (sender.Role == Role.Don)
|
||||
{
|
||||
_mafia.Remove(sender);
|
||||
if (_mafia.Count == 0)
|
||||
{
|
||||
foreach (PlayerSocketWorker player in _players)
|
||||
{
|
||||
player.sendPacket(new EndGamePacket(true,_playerRolesAtStart));
|
||||
}
|
||||
|
||||
isStarted = false;
|
||||
_gameState = GameState.NotStarted;
|
||||
}
|
||||
else
|
||||
{
|
||||
_mafia[0].Role = Role.Don;
|
||||
if (_gameState == GameState.VotingNight)
|
||||
{
|
||||
_mafia[0].sendPacket(new MessageReceivePacket(ChatType.Active,true,"System","Дон покинул игру, ты новый дон!"));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void PlayerOnOnPlayerSendMessageEvent(PlayerSocketWorker sender, ChatType chatType, string text)
|
||||
@ -66,6 +189,25 @@ namespace MafiaServer
|
||||
}
|
||||
}
|
||||
break;
|
||||
case ChatType.Active:
|
||||
if (isStarted)
|
||||
{
|
||||
switch (sender.Role)
|
||||
{
|
||||
case Role.Mafia:
|
||||
case Role.Don:
|
||||
foreach (PlayerSocketWorker player in _players)
|
||||
{
|
||||
if (player.Role == Role.Mafia || player.Role == Role.Don)
|
||||
{
|
||||
player.sendPacket(new MessageReceivePacket(ChatType.Active, false, sender.PlayerName,
|
||||
text));
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -3,6 +3,7 @@ using System.Net.Sockets;
|
||||
using System.Text;
|
||||
using MafiaCommon.Packets;
|
||||
using MafiaServer.Events;
|
||||
using MafiaCommon;
|
||||
|
||||
namespace MafiaServer
|
||||
{
|
||||
@ -12,7 +13,9 @@ namespace MafiaServer
|
||||
public readonly string PlayerName;
|
||||
public event OnDisconnectByErrorEvent OnDisconnectByErrorEvent;
|
||||
public event OnPlayerSendMessageEvent OnPlayerSendMessageEvent;
|
||||
public event OnDisconnectEvent OnDisconnectEvent;
|
||||
public int Id;
|
||||
public Role Role = Role.Citizen;
|
||||
public PlayerSocketWorker(Socket socket)
|
||||
{
|
||||
_socket = socket;
|
||||
@ -71,6 +74,10 @@ namespace MafiaServer
|
||||
case PacketType.MessageSendPacket:
|
||||
OnPlayerSendMessageEvent.Invoke(this,((MessageSendPacket)packet).ChatType,((MessageSendPacket)packet).Text);
|
||||
break;
|
||||
case PacketType.DisconnectPlayer:
|
||||
_socket.Close();
|
||||
OnDisconnectEvent.Invoke(this);
|
||||
break;
|
||||
}
|
||||
}
|
||||
catch (SocketException e)
|
||||
|
Loading…
x
Reference in New Issue
Block a user