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:
|
case PacketType.MessageSendPacket:
|
||||||
packet = JsonConvert.DeserializeObject<MessageSendPacket>(json);
|
packet = JsonConvert.DeserializeObject<MessageSendPacket>(json);
|
||||||
break;
|
break;
|
||||||
|
case PacketType.GameStartPacket:
|
||||||
|
packet = JsonConvert.DeserializeObject<GameStartPacket>(json);
|
||||||
|
break;
|
||||||
|
case PacketType.EndGame:
|
||||||
|
packet = JsonConvert.DeserializeObject<EndGamePacket>(json);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
return packet;
|
return packet;
|
||||||
|
@ -9,6 +9,9 @@
|
|||||||
PlayerDisconnected=5,
|
PlayerDisconnected=5,
|
||||||
MessageReceivePacket=6,
|
MessageReceivePacket=6,
|
||||||
MessageSendPacket=7,
|
MessageSendPacket=7,
|
||||||
|
GameStartPacket=8,
|
||||||
|
EndGame=9,
|
||||||
|
DisconnectPlayer=10,
|
||||||
ServerShutdown=99
|
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"
|
mc:Ignorable="d"
|
||||||
Title="RMafia" Height="450" Width="800">
|
Title="RMafia" Height="450" Width="800">
|
||||||
<Grid>
|
<Grid>
|
||||||
<Grid x:Name="MainMenu">
|
<Grid x:Name="MainMenu" Visibility="Visible">
|
||||||
<Grid.ColumnDefinitions>
|
<Grid.ColumnDefinitions>
|
||||||
<ColumnDefinition Width="10*"></ColumnDefinition>
|
<ColumnDefinition Width="10*"></ColumnDefinition>
|
||||||
<ColumnDefinition Width="30*"></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>
|
<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>
|
<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="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>
|
||||||
|
|
||||||
<Grid x:Name="DisconnectScreen" Visibility="Hidden">
|
<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>
|
<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>
|
<Button Grid.Column="2" Grid.Row="6" Click="Back_OnClick" Content="Назад" FontSize="25"></Button>
|
||||||
</Grid>
|
</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>
|
</Grid>
|
||||||
</Window>
|
</Window>
|
||||||
|
@ -14,7 +14,7 @@ using System.Windows.Media.Imaging;
|
|||||||
using System.Windows.Navigation;
|
using System.Windows.Navigation;
|
||||||
using System.Windows.Shapes;
|
using System.Windows.Shapes;
|
||||||
using DiscordRPC;
|
using DiscordRPC;
|
||||||
using MafiaCommon.Packets;
|
using MafiaCommon;
|
||||||
|
|
||||||
namespace MafiaGame
|
namespace MafiaGame
|
||||||
{
|
{
|
||||||
@ -143,5 +143,92 @@ namespace MafiaGame
|
|||||||
QueueChatInput.Clear();
|
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 System.Windows.Controls;
|
||||||
using DiscordRPC;
|
using DiscordRPC;
|
||||||
using MafiaCommon.Packets;
|
using MafiaCommon.Packets;
|
||||||
|
using MafiaCommon;
|
||||||
|
|
||||||
namespace MafiaGame
|
namespace MafiaGame
|
||||||
{
|
{
|
||||||
@ -37,12 +38,13 @@ namespace MafiaGame
|
|||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
App.Current.Dispatcher.Invoke((Action)(() =>
|
App.Current.Dispatcher.Invoke((Action) (() =>
|
||||||
{
|
{
|
||||||
MainWindow.Instance.ShowDisconnectScreen(e.Message);
|
MainWindow.Instance.ShowDisconnectScreen(e.Message);
|
||||||
}));
|
}));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
_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();
|
||||||
@ -53,6 +55,13 @@ namespace MafiaGame
|
|||||||
_socket.Send(PacketConverter.toBytes(new MessageSendPacket(chatType, text)));
|
_socket.Send(PacketConverter.toBytes(new MessageSendPacket(chatType, text)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void Disconnect()
|
||||||
|
{
|
||||||
|
_socket.Send(PacketConverter.toBytes(new DisconnectPlayerPacket()));
|
||||||
|
_thread.Interrupt();
|
||||||
|
_socket.Close();
|
||||||
|
}
|
||||||
|
|
||||||
private void serverListener()
|
private void serverListener()
|
||||||
{
|
{
|
||||||
while (!_breakFlag)
|
while (!_breakFlag)
|
||||||
@ -64,8 +73,7 @@ namespace MafiaGame
|
|||||||
{
|
{
|
||||||
bytes = _socket.Receive(data);
|
bytes = _socket.Receive(data);
|
||||||
builder.Append(Encoding.UTF8.GetString(data, 0, bytes));
|
builder.Append(Encoding.UTF8.GetString(data, 0, bytes));
|
||||||
}
|
} while (_socket.Available > 0);
|
||||||
while (_socket.Available>0);
|
|
||||||
|
|
||||||
Console.WriteLine(builder.ToString());
|
Console.WriteLine(builder.ToString());
|
||||||
|
|
||||||
@ -73,7 +81,7 @@ namespace MafiaGame
|
|||||||
switch (packet.PacketType)
|
switch (packet.PacketType)
|
||||||
{
|
{
|
||||||
case PacketType.Welcome:
|
case PacketType.Welcome:
|
||||||
App.Current.Dispatcher.Invoke((Action)(() =>
|
App.Current.Dispatcher.Invoke((Action) (() =>
|
||||||
{
|
{
|
||||||
MainWindow.Instance.QueueOnline.Text = ((WelcomePacket) packet).Players + "/" +
|
MainWindow.Instance.QueueOnline.Text = ((WelcomePacket) packet).Players + "/" +
|
||||||
((WelcomePacket) packet).MaxPlayers;
|
((WelcomePacket) packet).MaxPlayers;
|
||||||
@ -87,7 +95,7 @@ namespace MafiaGame
|
|||||||
secrets.SpectateSecret = _host + ":" + _port + "/spectate";
|
secrets.SpectateSecret = _host + ":" + _port + "/spectate";
|
||||||
App.Instance.GetRpcClient().SetPresence(new RichPresence()
|
App.Instance.GetRpcClient().SetPresence(new RichPresence()
|
||||||
{
|
{
|
||||||
State = ((WelcomePacket)packet).ServerName,
|
State = ((WelcomePacket) packet).ServerName,
|
||||||
Party = party,
|
Party = party,
|
||||||
Secrets = secrets,
|
Secrets = secrets,
|
||||||
Timestamps = Timestamps.Now,
|
Timestamps = Timestamps.Now,
|
||||||
@ -96,37 +104,54 @@ namespace MafiaGame
|
|||||||
}));
|
}));
|
||||||
break;
|
break;
|
||||||
case PacketType.Disconnect:
|
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;
|
_breakFlag = true;
|
||||||
break;
|
break;
|
||||||
case PacketType.PlayerConnected:
|
case PacketType.PlayerConnected:
|
||||||
App.Current.Dispatcher.Invoke((Action)(() =>
|
App.Current.Dispatcher.Invoke((Action) (() =>
|
||||||
{
|
{
|
||||||
MainWindow.Instance.QueueOnline.Text = ((PlayerConnectedPacket) packet).Players + "/" +
|
MainWindow.Instance.QueueOnline.Text = ((PlayerConnectedPacket) packet).Players + "/" +
|
||||||
((PlayerConnectedPacket) packet).MaxPlayers;
|
((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;
|
break;
|
||||||
case PacketType.PlayerDisconnected:
|
case PacketType.PlayerDisconnected:
|
||||||
App.Current.Dispatcher.Invoke((Action)(() =>
|
App.Current.Dispatcher.Invoke((Action) (() =>
|
||||||
{
|
{
|
||||||
MainWindow.Instance.QueueOnline.Text = ((PlayerDisconnectedPacket) packet).Players + "/" +
|
MainWindow.Instance.QueueOnline.Text = ((PlayerDisconnectedPacket) packet).Players + "/" +
|
||||||
((PlayerDisconnectedPacket) packet).MaxPlayers;
|
((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;
|
break;
|
||||||
case PacketType.ServerShutdown:
|
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;
|
_breakFlag = true;
|
||||||
break;
|
break;
|
||||||
case PacketType.MessageReceivePacket:
|
case PacketType.MessageReceivePacket:
|
||||||
App.Current.Dispatcher.Invoke((Action)(() =>
|
App.Current.Dispatcher.Invoke((Action) (() =>
|
||||||
{
|
{
|
||||||
ListBoxItem message = new ListBoxItem();
|
ListBoxItem message = new ListBoxItem();
|
||||||
if (((MessageReceivePacket) packet).IsSystem)
|
if (((MessageReceivePacket) packet).IsSystem)
|
||||||
@ -139,15 +164,51 @@ namespace MafiaGame
|
|||||||
((MessageReceivePacket) packet).Text;
|
((MessageReceivePacket) packet).Text;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (((MessageReceivePacket)packet).ChatType)
|
switch (((MessageReceivePacket) packet).ChatType)
|
||||||
{
|
{
|
||||||
case ChatType.Queue:
|
case ChatType.Queue:
|
||||||
MainWindow.Instance.QueueChat.Items.Add(message);
|
MainWindow.Instance.QueueChat.Items.Add(message);
|
||||||
MainWindow.Instance.QueueChat.ScrollIntoView(message);
|
MainWindow.Instance.QueueChat.ScrollIntoView(message);
|
||||||
break;
|
break;
|
||||||
|
case ChatType.Active:
|
||||||
|
MainWindow.Instance.GameVotingActiveChat.Items.Add(message);
|
||||||
|
MainWindow.Instance.GameVotingActiveChat.ScrollIntoView(message);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}));
|
}));
|
||||||
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
|
namespace MafiaServer.Events
|
||||||
{
|
{
|
||||||
|
@ -1,13 +1,19 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
using MafiaCommon.Packets;
|
using MafiaCommon.Packets;
|
||||||
|
using MafiaCommon;
|
||||||
|
|
||||||
namespace MafiaServer
|
namespace MafiaServer
|
||||||
{
|
{
|
||||||
public class Game
|
public class Game
|
||||||
{
|
{
|
||||||
private List<PlayerSocketWorker> _players = new List<PlayerSocketWorker>();
|
private List<PlayerSocketWorker> _players = new List<PlayerSocketWorker>();
|
||||||
|
private List<PlayerRole> _playerRolesAtStart = new List<PlayerRole>();
|
||||||
private bool isStarted = false;
|
private bool isStarted = false;
|
||||||
|
private GameState _gameState = GameState.NotStarted;
|
||||||
|
|
||||||
|
List<PlayerSocketWorker> _mafia = new List<PlayerSocketWorker>();
|
||||||
|
|
||||||
public Game()
|
public Game()
|
||||||
{
|
{
|
||||||
@ -31,17 +37,112 @@ namespace MafiaServer
|
|||||||
player.Id = _players.LastIndexOf(player);
|
player.Id = _players.LastIndexOf(player);
|
||||||
player.OnDisconnectByErrorEvent += OnDisconnectByError;
|
player.OnDisconnectByErrorEvent += OnDisconnectByError;
|
||||||
player.OnPlayerSendMessageEvent += PlayerOnOnPlayerSendMessageEvent;
|
player.OnPlayerSendMessageEvent += PlayerOnOnPlayerSendMessageEvent;
|
||||||
|
player.OnDisconnectEvent += PlayerOnOnDisconnectEvent;
|
||||||
player.sendPacket(new WelcomePacket(Settings.Config().ServerName,_players.Count,Settings.Config().MaxPlayers));
|
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()
|
public void Start()
|
||||||
{
|
{
|
||||||
|
if (isStarted)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (_players.Count < 2)
|
if (_players.Count < 2)
|
||||||
{
|
{
|
||||||
Console.WriteLine("Not Enough Players");
|
Console.WriteLine("Not Enough Players");
|
||||||
return;
|
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)
|
private void OnDisconnectByError(PlayerSocketWorker sender)
|
||||||
@ -51,6 +152,28 @@ namespace MafiaServer
|
|||||||
{
|
{
|
||||||
player.sendPacket(new PlayerDisconnectedPacket(true,sender.Id,_players.Count,Settings.Config().MaxPlayers));
|
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)
|
private void PlayerOnOnPlayerSendMessageEvent(PlayerSocketWorker sender, ChatType chatType, string text)
|
||||||
@ -66,6 +189,25 @@ namespace MafiaServer
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
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 System.Text;
|
||||||
using MafiaCommon.Packets;
|
using MafiaCommon.Packets;
|
||||||
using MafiaServer.Events;
|
using MafiaServer.Events;
|
||||||
|
using MafiaCommon;
|
||||||
|
|
||||||
namespace MafiaServer
|
namespace MafiaServer
|
||||||
{
|
{
|
||||||
@ -12,7 +13,9 @@ namespace MafiaServer
|
|||||||
public readonly string PlayerName;
|
public readonly string PlayerName;
|
||||||
public event OnDisconnectByErrorEvent OnDisconnectByErrorEvent;
|
public event OnDisconnectByErrorEvent OnDisconnectByErrorEvent;
|
||||||
public event OnPlayerSendMessageEvent OnPlayerSendMessageEvent;
|
public event OnPlayerSendMessageEvent OnPlayerSendMessageEvent;
|
||||||
|
public event OnDisconnectEvent OnDisconnectEvent;
|
||||||
public int Id;
|
public int Id;
|
||||||
|
public Role Role = Role.Citizen;
|
||||||
public PlayerSocketWorker(Socket socket)
|
public PlayerSocketWorker(Socket socket)
|
||||||
{
|
{
|
||||||
_socket = socket;
|
_socket = socket;
|
||||||
@ -71,6 +74,10 @@ namespace MafiaServer
|
|||||||
case PacketType.MessageSendPacket:
|
case PacketType.MessageSendPacket:
|
||||||
OnPlayerSendMessageEvent.Invoke(this,((MessageSendPacket)packet).ChatType,((MessageSendPacket)packet).Text);
|
OnPlayerSendMessageEvent.Invoke(this,((MessageSendPacket)packet).ChatType,((MessageSendPacket)packet).Text);
|
||||||
break;
|
break;
|
||||||
|
case PacketType.DisconnectPlayer:
|
||||||
|
_socket.Close();
|
||||||
|
OnDisconnectEvent.Invoke(this);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (SocketException e)
|
catch (SocketException e)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user