|
@@ -6,6 +6,7 @@ using System.Threading.Tasks;
|
|
|
using MafiaTelegramBot.Controllers;
|
|
|
using MafiaTelegramBot.CustomCollections.Extensions;
|
|
|
using MafiaTelegramBot.DataBase.EntityDao;
|
|
|
+using MafiaTelegramBot.Game.GameRoles;
|
|
|
using MafiaTelegramBot.Models;
|
|
|
using MafiaTelegramBot.Resources;
|
|
|
using Microsoft.EntityFrameworkCore;
|
|
@@ -74,10 +75,12 @@ namespace MafiaTelegramBot.Game.GameRooms
|
|
|
timer.Start();
|
|
|
foreach (var player in Players.Values)
|
|
|
{
|
|
|
- player.CurrentRole.KnownRoles.Add(player);
|
|
|
- if(player.GetRole() is Roles.Don or Roles.Mafia or Roles.Dame) player.CurrentRole.KnownRoles.AddRange(
|
|
|
- Players.Values.Where(p=> player.Id != p.Id && p.GetRole() is Roles.Mafia or Roles.Don or Roles.Dame)
|
|
|
- );
|
|
|
+ if (player.GetRole() is not (Roles.Don or Roles.Mafia or Roles.Dame))
|
|
|
+ player.CurrentRole.KnownRoles.Add(player.Id, player.GetRoleName());
|
|
|
+ else
|
|
|
+ foreach (var p in Players.Values
|
|
|
+ .Where(p => p.GetRole() is Roles.Don or Roles.Mafia or Roles.Dame))
|
|
|
+ player.CurrentRole.KnownRoles.Add(p.Id, p.GetRoleName());
|
|
|
}
|
|
|
resetEvent.WaitOne();
|
|
|
});
|
|
@@ -87,27 +90,29 @@ namespace MafiaTelegramBot.Game.GameRooms
|
|
|
{
|
|
|
await Task.Run(async () =>
|
|
|
{
|
|
|
- var alivePlayers = Players.Values.Where(p => p.IsAlive).ToList();
|
|
|
- var aliveMafia = alivePlayers.Where(p => p.GetRole() is Roles.Don or Roles.Mafia).ToList();
|
|
|
- var gameNotEnded = alivePlayers.Count > 2 * aliveMafia.Count && aliveMafia.Count > 0;
|
|
|
- while (gameNotEnded)
|
|
|
+ while (GameNotEnded())
|
|
|
{
|
|
|
await NightPhase();
|
|
|
await SummingUpPhase();
|
|
|
- alivePlayers = Players.Values.Where(p => p.IsAlive).ToList();
|
|
|
- aliveMafia = alivePlayers.Where(p => p.GetRole() is Roles.Don or Roles.Mafia).ToList();
|
|
|
- gameNotEnded = alivePlayers.Count > 2 * aliveMafia.Count && aliveMafia.Count > 0;
|
|
|
- if (!gameNotEnded) break;
|
|
|
+ if (!GameNotEnded()) break;
|
|
|
await DayPhase();
|
|
|
await DispatchPhase();
|
|
|
- alivePlayers = Players.Values.Where(p => p.IsAlive).ToList();
|
|
|
- aliveMafia = alivePlayers.Where(p => p.GetRole() is Roles.Don or Roles.Mafia).ToList();
|
|
|
- gameNotEnded = alivePlayers.Count > 2 * aliveMafia.Count && aliveMafia.Count > 0;
|
|
|
- if (!gameNotEnded) break;
|
|
|
+ if (!GameNotEnded()) break;
|
|
|
}
|
|
|
});
|
|
|
}
|
|
|
|
|
|
+ private bool GameNotEnded()
|
|
|
+ {
|
|
|
+ var playersCount = Players.Values.Count(p => p.IsAlive);
|
|
|
+ var mafiaCount = Players.Values.Count(p => p.IsAlive && p.GetRole() is Roles.Don or Roles.Mafia or Roles.Dame);
|
|
|
+ if (PlayersRole.ContainsKey(Roles.Werewolf)
|
|
|
+ && PlayersRole[Roles.Werewolf].Count == 1
|
|
|
+ && ((WerewolfRole) PlayersRole[Roles.Werewolf][0].CurrentRole).IsMafia) mafiaCount++;
|
|
|
+ var villagersCount = playersCount - mafiaCount;
|
|
|
+ return villagersCount > mafiaCount || mafiaCount > 0;
|
|
|
+ }
|
|
|
+
|
|
|
private async Task DayPhase()
|
|
|
{
|
|
|
IsDay = true;
|
|
@@ -126,24 +131,22 @@ namespace MafiaTelegramBot.Game.GameRooms
|
|
|
discussionEnded.WaitOne();
|
|
|
|
|
|
var turnsCount = _turnOrder.Count;
|
|
|
- Player firstPlayer = null;
|
|
|
+ Player toEndQueue = null;
|
|
|
for (var i = 0; i < turnsCount; ++i)
|
|
|
{
|
|
|
var player = _turnOrder.Dequeue();
|
|
|
if(!Players.ContainsKey(player.Id) || !player.IsAlive) continue;
|
|
|
if (!player.IsBlocked)
|
|
|
{
|
|
|
- if (firstPlayer == null) player.IsFirst = true;
|
|
|
await PlayersCh.Send($"{strings.now_turn} ({player.TurnOrder}) {player.NickName}");
|
|
|
if (TimerEnabled) await Bot.SendWithMarkdown2(player.ChatId, strings.you_turn_say);
|
|
|
await player.CurrentRole.SpeakAction();
|
|
|
- if (Players.ContainsKey(player.Id)) await player.CurrentRole.VotingAction();
|
|
|
- if (player.IsFirst) firstPlayer = player;
|
|
|
+ if (Players.ContainsKey(player.Id)) await player.CurrentRole.VotingAction(VoteUpList.Count == 0);
|
|
|
}
|
|
|
- else _turnOrder.Enqueue(player);
|
|
|
+ if (toEndQueue != null) _turnOrder.Enqueue(player);
|
|
|
+ else toEndQueue = player;
|
|
|
}
|
|
|
- firstPlayer!.IsFirst = false;
|
|
|
- _turnOrder.Enqueue(firstPlayer);
|
|
|
+ _turnOrder.Enqueue(toEndQueue);
|
|
|
}
|
|
|
|
|
|
private async Task NightPhase()
|
|
@@ -385,12 +388,11 @@ namespace MafiaTelegramBot.Game.GameRooms
|
|
|
if (PlayersRole.ContainsKey(Roles.Fool) && PlayersRole[Roles.Fool].Count == 1)
|
|
|
await PlayersRole[Roles.Fool][0].CurrentRole.IsWon();
|
|
|
var rolesMessage = strings.in_this_game_roles;
|
|
|
- var sortedPLayers = Players.Values.ToList();
|
|
|
- sortedPLayers.Sort((x, y) => x.TurnOrder - y.TurnOrder);
|
|
|
+ var players = Players.Values.ToList();
|
|
|
|
|
|
var statsQuery = "SELECT * FROM mafia.statistics WHERE";
|
|
|
|
|
|
- foreach (var player in sortedPLayers)
|
|
|
+ foreach (var player in players)
|
|
|
{
|
|
|
rolesMessage += $"\n({player.TurnOrder}) {player.NickName} - {player.GetRoleName()}";
|
|
|
statsQuery += $" id = {player.Id} AND role = '{player.GetRole().ToString()}' OR role = 'All' OR";
|