|
@@ -2,8 +2,11 @@ using System.Linq;
|
|
|
using System.Threading;
|
|
|
using System.Threading.Tasks;
|
|
|
using MafiaTelegramBot.Controllers;
|
|
|
+using MafiaTelegramBot.CustomCollections.Extensions;
|
|
|
+using MafiaTelegramBot.DataBase.EntityDao;
|
|
|
using MafiaTelegramBot.Models;
|
|
|
using MafiaTelegramBot.Resources;
|
|
|
+using Telegram.Bot.Types;
|
|
|
|
|
|
namespace MafiaTelegramBot.Game.GameRooms
|
|
|
{
|
|
@@ -27,29 +30,25 @@ namespace MafiaTelegramBot.Game.GameRooms
|
|
|
await PlayersCh.Send(strings.first_day_message);
|
|
|
await Task.Run(async() =>
|
|
|
{
|
|
|
- var turnsCount = Players.Count;
|
|
|
+ var turnsCount = _turnOrder.Count;
|
|
|
Player firstPlayer = null;
|
|
|
for (var i = 0; i < turnsCount; ++i)
|
|
|
{
|
|
|
var player = _turnOrder.Dequeue();
|
|
|
if(!player.IsPlaying) continue;
|
|
|
- await PlayersCh.SendExcept(player.Id, $"{strings.now_turn} {player.NickName}");
|
|
|
- if(player.IsPlaying) await Bot.SendWithMarkdown2(player.ChatId, strings.your_turn);
|
|
|
- player.IsSpeaker = true;
|
|
|
- Thread.Sleep(60*1000);
|
|
|
- player.IsSpeaker = false;
|
|
|
- if(player.IsPlaying) await Bot.SendWithMarkdown2(player.ChatId, strings.your_turn_ended);
|
|
|
+ await player.CurrentRole.DayAction(player);
|
|
|
if (firstPlayer != null && player.IsPlaying) _turnOrder.Enqueue(player);
|
|
|
else firstPlayer = player;
|
|
|
}
|
|
|
_turnOrder.Enqueue(firstPlayer);
|
|
|
});
|
|
|
+ IsFirstCycle = false;
|
|
|
await PlayersCh.Send(strings.city_falls_asleep);
|
|
|
}
|
|
|
|
|
|
private async Task FirstNight()
|
|
|
{
|
|
|
- IsFirstNight = true;
|
|
|
+ IsFirstCycle = true;
|
|
|
await Task.Run(async() =>
|
|
|
{
|
|
|
await PlayersCh.Send(strings.city_falls_asleep);
|
|
@@ -61,10 +60,52 @@ namespace MafiaTelegramBot.Game.GameRooms
|
|
|
await MafiaCh.Send(message);
|
|
|
Thread.Sleep(10*1000);
|
|
|
});
|
|
|
- IsFirstNight = false;
|
|
|
}
|
|
|
|
|
|
private async Task GameCycle()
|
|
|
+ {
|
|
|
+ await Task.Run(async () =>
|
|
|
+ {
|
|
|
+ var alivePlayers = Players.Values.Where(p => p.IsAlive).ToList();
|
|
|
+ var aliveMafia = alivePlayers.Where(p => p.CurrentRole.RoleKey is Roles.Don or Roles.Mafia).ToList();
|
|
|
+ while (alivePlayers.Count > 2 * aliveMafia.Count && aliveMafia.Count > 0)
|
|
|
+ {
|
|
|
+ IsDay = true;
|
|
|
+ await DayPhase();
|
|
|
+ IsDay = false;
|
|
|
+ await NightPhase();
|
|
|
+ IsDay = true;
|
|
|
+ await SummingUpPhase();
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ private async Task DayPhase()
|
|
|
+ {
|
|
|
+ var turnsCount = _turnOrder.Count;
|
|
|
+ Player firstPlayer = null;
|
|
|
+ for (var i = 0; i < turnsCount; ++i)
|
|
|
+ {
|
|
|
+ var player = _turnOrder.Dequeue();
|
|
|
+ if(!player.IsPlaying) continue;
|
|
|
+ if (firstPlayer == null) player.IsFirst = true;
|
|
|
+ await player.CurrentRole.DayAction(player);
|
|
|
+ if (player.IsFirst) firstPlayer = player;
|
|
|
+ else _turnOrder.Enqueue(player);
|
|
|
+ }
|
|
|
+ firstPlayer!.IsFirst = false;
|
|
|
+ _turnOrder.Enqueue(firstPlayer);
|
|
|
+ }
|
|
|
+
|
|
|
+ private async Task NightPhase()
|
|
|
+ {
|
|
|
+ await Task.Run(() =>
|
|
|
+ {
|
|
|
+
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ private async Task SummingUpPhase()
|
|
|
{
|
|
|
await Task.Run(() =>
|
|
|
{
|
|
@@ -72,6 +113,20 @@ namespace MafiaTelegramBot.Game.GameRooms
|
|
|
});
|
|
|
}
|
|
|
|
|
|
+ public async Task<Message> PutUpVote(long playerId, long targetId)
|
|
|
+ {
|
|
|
+ var player = await UserDao.GetPlayerById(playerId);
|
|
|
+ VoteUpList.AddUnique(Players[targetId]);
|
|
|
+ if (playerId != targetId)
|
|
|
+ {
|
|
|
+ var target = await UserDao.GetPlayerById(targetId);
|
|
|
+ await PlayersCh.SendExcept(player.ChatId, $"{player.NickName} {strings.vote_to} {target.NickName}");
|
|
|
+ return await Bot.SendWithMarkdown2(player.ChatId, $"{strings.you_vote_player} {target.NickName}");
|
|
|
+ }
|
|
|
+ await PlayersCh.SendExcept(player.ChatId, $"{player.NickName} {strings.vote_to_self}");
|
|
|
+ return await Bot.SendWithMarkdown2(player.ChatId, strings.you_vote_to_self);
|
|
|
+ }
|
|
|
+
|
|
|
private async Task EndOfGame()
|
|
|
{
|
|
|
await Task.Run(async () =>
|