GameRoom.PrepareRoom.cs 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Threading.Tasks;
  5. using MafiaTelegramBot.CustomCollections.Extensions;
  6. using MafiaTelegramBot.Models;
  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. await GenerateTurnOrder();
  25. await AssignRoles();
  26. return resultCode;
  27. }
  28. private async Task AssignRoles()
  29. {
  30. await Task.Run(async () =>
  31. {
  32. var message = strings.in_this_game_we_have;
  33. var random = new Random();
  34. var rolesList = new List<Roles>();
  35. foreach (var (key, value) in Settings)
  36. {
  37. rolesList.AddTimes(key, value);
  38. if (value > 0) message += $"\n{roles.ResourceManager.GetString(key.ToString())} - {value}";
  39. Settings.Remove(key);
  40. }
  41. await PlayersCh.Send(message);
  42. for (var i = 0; i < _turnOrder.Count; ++i)
  43. {
  44. var user = _turnOrder.Dequeue();
  45. var value = random.Next(rolesList.Count);
  46. var next = rolesList.GetAndRemove(value);
  47. PlayersRole[next].Add(user);
  48. user.CurrentRole = Role.GetNewRoleInstance(next, this, user);
  49. _turnOrder.Enqueue(user);
  50. }
  51. });
  52. }
  53. private async Task GenerateTurnOrder()
  54. {
  55. await Task.Run(() =>
  56. {
  57. var random = new Random();
  58. var playersCopy = Players.Values.ToList();
  59. while (playersCopy.Count != 0)
  60. {
  61. var player = playersCopy.GetAndRemove(random.Next(playersCopy.Count));
  62. _turnOrder.Enqueue(player);
  63. player.TurnOrder = _turnOrder.Count;
  64. player.IsPlaying = true;
  65. }
  66. });
  67. }
  68. public async Task SendRolesToUsers()
  69. {
  70. foreach (var player in Players.Values)
  71. {
  72. await Bot.SendStickerAsync(player.ChatId, Stickers.Sticker[player.GetRole().ToString()]);
  73. var message =
  74. $"{strings.your_role}: _*{player.GetRoleName()}*_\n" +
  75. $"{strings.your_turn_order}: _*{player.TurnOrder}*_\n"+
  76. $"{strings.bot_starting_game}";
  77. await Bot.SendWithMarkdown2(player.ChatId, message, Keyboard.InGamePlayerMenu);
  78. }
  79. }
  80. protected abstract Task<ResultCode> ReadSettings();
  81. }
  82. }