GameRoom.PrepareRoom.cs 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Threading.Tasks;
  5. using MafiaTelegramBot.Controllers;
  6. using MafiaTelegramBot.CustomCollections.Extensions;
  7. using MafiaTelegramBot.Resources;
  8. namespace MafiaTelegramBot.Game.GameRooms
  9. {
  10. public partial class GameRoom
  11. {
  12. private ResultCode CanStartGame()
  13. {
  14. if (Players.Count < _minPlayers) return ResultCode.TooFewPlayers;
  15. if (Players.Count > MaxPlayers) return ResultCode.TooManyPlayers;
  16. return IsRunning ? ResultCode.GameAlreadyRunning : ResultCode.CodeOk;
  17. }
  18. public async Task<ResultCode> Prepare()
  19. {
  20. var resultCode = CanStartGame();
  21. if (resultCode != ResultCode.CodeOk) return resultCode;
  22. resultCode = await ReadSettings();
  23. if (resultCode != ResultCode.CodeOk) return resultCode;
  24. StopTimer();
  25. foreach (var (_, player) in Players) player.IsSpeaker = false;
  26. await GenerateTurnOrder();
  27. await AssignRoles();
  28. return resultCode;
  29. }
  30. private async Task AssignRoles()
  31. {
  32. await Task.Run(async () =>
  33. {
  34. var message = strings.in_this_game_we_have;
  35. var random = new Random();
  36. var rolesList = new List<Roles>();
  37. foreach (var (key, value) in Settings)
  38. {
  39. rolesList.AddTimes(key, value);
  40. if (value > 0) message += $"\n{roles.ResourceManager.GetString(key.ToString())} - {value}";
  41. Settings.Remove(key);
  42. }
  43. await PlayersMessageChannel.Send(message);
  44. for (var i = 0; i < _turnOrder.Count; ++i)
  45. {
  46. var user = _turnOrder.Dequeue();
  47. var value = random.Next(rolesList.Count);
  48. var next = rolesList.GetAndRemove(value);
  49. PlayersRole[next].Add(user);
  50. user.CurrentRole = Role.GetNewRoleInstance(next, this, user);
  51. _turnOrder.Enqueue(user);
  52. }
  53. await SendRolesToUsers();
  54. await PlayersMessageChannel.UpdateList(Players.Values);
  55. await MafiaMessageChannel.UpdateList(Players.Values);
  56. });
  57. }
  58. private async Task GenerateTurnOrder()
  59. {
  60. await Task.Run(() =>
  61. {
  62. var random = new Random();
  63. var playersCopy = Players.Values.ToList();
  64. while (playersCopy.Count != 0)
  65. {
  66. var player = playersCopy.GetAndRemove(random.Next(playersCopy.Count));
  67. _turnOrder.Enqueue(player);
  68. player.TurnOrder = _turnOrder.Count;
  69. player.IsPlaying = true;
  70. }
  71. Players = Players.OrderBy(item => item.Value.TurnOrder)
  72. .ToDictionary(x => x.Key, x => x.Value);
  73. });
  74. }
  75. public async Task SendRolesToUsers()
  76. {
  77. foreach (var player in Players.Values)
  78. {
  79. await MessageController.SendSticker(player.Info, Stickers.Sticker[player.GetRole().ToString()]);
  80. var message =
  81. $"{strings.your_role}: _*{player.GetRoleName()}*_\n" +
  82. $"{strings.your_turn_order}: _*{player.TurnOrder}*_\n"+
  83. $"{strings.bot_starting_game}";
  84. await MessageController.SendText(player.Info, message, Keyboard.InGamePlayerMenu);
  85. }
  86. }
  87. protected abstract Task<ResultCode> ReadSettings();
  88. }
  89. }