123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155 |
- 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
- {
- public partial class GameRoom
- {
- public void Start()
- {
- new Task(async () =>
- {
- IsRunning = true;
- await FirstNight();
- await FirstDay();
- await GameCycle();
- await EndOfGame();
- }).Start();
- }
- private async Task FirstDay()
- {
- IsDay = true;
- await PlayersCh.Send(strings.first_day_message);
- await Task.Run(async() =>
- {
- var turnsCount = _turnOrder.Count;
- Player firstPlayer = null;
- for (var i = 0; i < turnsCount; ++i)
- {
- var player = _turnOrder.Dequeue();
- if(!player.IsPlaying) continue;
- 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()
- {
- IsFirstCycle = true;
- await Task.Run(async() =>
- {
- await PlayersCh.Send(strings.city_falls_asleep);
- var mafia = Players.Values.Where(player => player.CurrentRole.RoleKey is Roles.Mafia).ToArray();
- var don = Players.Values.FirstOrDefault(player => player.CurrentRole.RoleKey is Roles.Don);
- var message = strings.your_teammates;
- if (don != null) message += $" \\({don.TurnOrder}\\) {don.NickName} - {roles.Don}";
- message = mafia.Aggregate(message, (current, player) => current + $" \\({player.TurnOrder}\\) {player.NickName}");
- await MafiaCh.Send(message);
- Thread.Sleep(10*1000);
- });
- }
- 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();
- var gameNotEnded = true;//alivePlayers.Count > 2 * aliveMafia.Count && aliveMafia.Count > 0;
- while (gameNotEnded)
- {
- 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(() =>
- {
-
- });
- }
- 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 () =>
- {
- foreach (var (_, player) in Players)
- {
- player.CurrentRole = Role.GetNewRoleInstance(Roles.None, this);
- player.IsPlaying = false;
- player.IsSpeaker = false;
- player.IsAlive = true;
- }
- IsRunning = false;
- IsDay = false;
- _turnOrder.Clear();
- if (!Players.ContainsKey(Owner.Id) || Players.Count == 0) new Task(async() =>
- await RoomController.DissolveRoom(RoomEncrypter.GetCode(RoomName))).Start();
- else
- {
- await Bot.SendWithMarkdown2(Owner.ChatId, strings.thanks_for_game, Keyboards.OwnerGameMenu);
- await PlayersCh.SendExcept(Owner.Id, strings.thanks_for_game, Keyboards.PlayerGameMenu);
- }
- });
- }
- }
- }
|