GameRoom.GameProcess.cs 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. using System.Linq;
  2. using System.Threading;
  3. using System.Threading.Tasks;
  4. using MafiaTelegramBot.Controllers;
  5. using MafiaTelegramBot.CustomCollections.Extensions;
  6. using MafiaTelegramBot.DataBase.EntityDao;
  7. using MafiaTelegramBot.Models;
  8. using MafiaTelegramBot.Resources;
  9. using Telegram.Bot.Types;
  10. namespace MafiaTelegramBot.Game.GameRooms
  11. {
  12. public partial class GameRoom
  13. {
  14. public void Start()
  15. {
  16. new Task(async () =>
  17. {
  18. IsRunning = true;
  19. await FirstNight();
  20. await FirstDay();
  21. await GameCycle();
  22. await EndOfGame();
  23. }).Start();
  24. }
  25. private async Task FirstDay()
  26. {
  27. IsDay = true;
  28. await PlayersCh.Send(strings.first_day_message);
  29. await Task.Run(async() =>
  30. {
  31. var turnsCount = _turnOrder.Count;
  32. Player firstPlayer = null;
  33. for (var i = 0; i < turnsCount; ++i)
  34. {
  35. var player = _turnOrder.Dequeue();
  36. if(!player.IsPlaying) continue;
  37. await player.CurrentRole.DayAction(player);
  38. if (firstPlayer != null && player.IsPlaying) _turnOrder.Enqueue(player);
  39. else firstPlayer = player;
  40. }
  41. _turnOrder.Enqueue(firstPlayer);
  42. });
  43. IsFirstCycle = false;
  44. await PlayersCh.Send(strings.city_falls_asleep);
  45. }
  46. private async Task FirstNight()
  47. {
  48. IsFirstCycle = true;
  49. await Task.Run(async() =>
  50. {
  51. await PlayersCh.Send(strings.city_falls_asleep);
  52. var mafia = Players.Values.Where(player => player.CurrentRole.RoleKey is Roles.Mafia).ToArray();
  53. var don = Players.Values.FirstOrDefault(player => player.CurrentRole.RoleKey is Roles.Don);
  54. var message = strings.your_teammates;
  55. if (don != null) message += $" \\({don.TurnOrder}\\) {don.NickName} - {roles.Don}";
  56. message = mafia.Aggregate(message, (current, player) => current + $" \\({player.TurnOrder}\\) {player.NickName}");
  57. await MafiaCh.Send(message);
  58. Thread.Sleep(10*1000);
  59. });
  60. }
  61. private async Task GameCycle()
  62. {
  63. await Task.Run(async () =>
  64. {
  65. var alivePlayers = Players.Values.Where(p => p.IsAlive).ToList();
  66. var aliveMafia = alivePlayers.Where(p => p.CurrentRole.RoleKey is Roles.Don or Roles.Mafia).ToList();
  67. var gameNotEnded = true;//alivePlayers.Count > 2 * aliveMafia.Count && aliveMafia.Count > 0;
  68. while (gameNotEnded)
  69. {
  70. IsDay = true;
  71. await DayPhase();
  72. IsDay = false;
  73. await NightPhase();
  74. IsDay = true;
  75. await SummingUpPhase();
  76. }
  77. });
  78. }
  79. private async Task DayPhase()
  80. {
  81. var turnsCount = _turnOrder.Count;
  82. Player firstPlayer = null;
  83. for (var i = 0; i < turnsCount; ++i)
  84. {
  85. var player = _turnOrder.Dequeue();
  86. if(!player.IsPlaying) continue;
  87. if (firstPlayer == null) player.IsFirst = true;
  88. await player.CurrentRole.DayAction(player);
  89. if (player.IsFirst) firstPlayer = player;
  90. else _turnOrder.Enqueue(player);
  91. }
  92. firstPlayer!.IsFirst = false;
  93. _turnOrder.Enqueue(firstPlayer);
  94. }
  95. private async Task NightPhase()
  96. {
  97. await Task.Run(() =>
  98. {
  99. });
  100. }
  101. private async Task SummingUpPhase()
  102. {
  103. await Task.Run(() =>
  104. {
  105. });
  106. }
  107. public async Task<Message> PutUpVote(long playerId, long targetId)
  108. {
  109. var player = await UserDao.GetPlayerById(playerId);
  110. VoteUpList.AddUnique(Players[targetId]);
  111. if (playerId != targetId)
  112. {
  113. var target = await UserDao.GetPlayerById(targetId);
  114. await PlayersCh.SendExcept(player.ChatId, $"{player.NickName} {strings.vote_to} {target.NickName}");
  115. return await Bot.SendWithMarkdown2(player.ChatId, $"{strings.you_vote_player} {target.NickName}");
  116. }
  117. await PlayersCh.SendExcept(player.ChatId, $"{player.NickName} {strings.vote_to_self}");
  118. return await Bot.SendWithMarkdown2(player.ChatId, strings.you_vote_to_self);
  119. }
  120. private async Task EndOfGame()
  121. {
  122. await Task.Run(async () =>
  123. {
  124. foreach (var (_, player) in Players)
  125. {
  126. player.CurrentRole = Role.GetNewRoleInstance(Roles.None, this);
  127. player.IsPlaying = false;
  128. player.IsSpeaker = false;
  129. player.IsAlive = true;
  130. }
  131. IsRunning = false;
  132. IsDay = false;
  133. _turnOrder.Clear();
  134. if (!Players.ContainsKey(Owner.Id) || Players.Count == 0) new Task(async() =>
  135. await RoomController.DissolveRoom(RoomEncrypter.GetCode(RoomName))).Start();
  136. else
  137. {
  138. await Bot.SendWithMarkdown2(Owner.ChatId, strings.thanks_for_game, Keyboards.OwnerGameMenu);
  139. await PlayersCh.SendExcept(Owner.Id, strings.thanks_for_game, Keyboards.PlayerGameMenu);
  140. }
  141. });
  142. }
  143. }
  144. }