ExtendedGameRoom.cs 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. using System.Collections.Generic;
  2. using System.Linq;
  3. using System.Threading.Tasks;
  4. using MafiaTelegramBot.Resources;
  5. namespace MafiaTelegramBot.Game.GameRooms
  6. {
  7. public class ExtendedGameRoom : GameRoom
  8. {
  9. public override bool IsExtended { get; protected set; } = true;
  10. public Dictionary<Roles, int> CustomRoomSettings = new();
  11. public Dictionary<int, int> Min = new Dictionary<int, int>
  12. {
  13. [1] = 1,
  14. [2] = 1,
  15. [3] = 1,
  16. [4] = 1,
  17. [5] = 1,
  18. [6] = 2,
  19. [7] = 2,
  20. [8] = 2,
  21. [9] = 2,
  22. [10] = 3,
  23. [11] = 3,
  24. [12] = 4,
  25. [13] = 4,
  26. [14] = 4,
  27. [15] = 5,
  28. [16] = 5
  29. },
  30. Max = new Dictionary<int, int>
  31. {
  32. [1] = 1,
  33. [2] = 2,
  34. [3] = 3,
  35. [4] = 4,
  36. [5] = 5,
  37. [6] = 2,
  38. [7] = 2,
  39. [8] = 3,
  40. [9] = 3,
  41. [10] = 3,
  42. [11] = 4,
  43. [12] = 4,
  44. [13] = 4,
  45. [14] = 5,
  46. [15] = 5,
  47. [16] = 5
  48. };
  49. public override Dictionary<Roles, List<Player>> PlayersRole { get; set; } = new()
  50. {
  51. //passive roles
  52. [Roles.Elder] = new List<Player>(),
  53. [Roles.Fool] = new List<Player>(),
  54. [Roles.Villager] = new List<Player>(),
  55. //Active roles
  56. [Roles.Detective] = new List<Player>(),
  57. [Roles.Hooker] = new List<Player>(),
  58. [Roles.Mafia] = new List<Player>(),
  59. [Roles.Don] = new List<Player>(),
  60. [Roles.Dame] = new List<Player>(),
  61. [Roles.Bodyguard] = new List<Player>(),
  62. [Roles.Doctor] = new List<Player>(),
  63. [Roles.Necromancer] = new List<Player>(),
  64. [Roles.Cop] = new List<Player>(),
  65. [Roles.Journalist] = new List<Player>(),
  66. [Roles.Lawyer] = new List<Player>(),
  67. [Roles.Werewolf] = new List<Player>(),
  68. [Roles.Parasite] = new List<Player>(),
  69. };
  70. protected override async Task<ResultCode> ReadSettings()
  71. {
  72. return await Task.Run(() =>
  73. {
  74. var rolesCount = CustomRoomSettings.Values.Sum();
  75. var blackRolesCount = CustomRoomSettings.Count(pair => pair.Key
  76. is Roles.Dame or Roles.Don or Roles.Werewolf or Roles.Lawyer);
  77. if (CustomRoomSettings.ContainsKey(Roles.Mafia)) blackRolesCount += CustomRoomSettings[Roles.Mafia];
  78. if (rolesCount != Players.Count) return ResultCode.RolesNotEqualPlayers;
  79. if (blackRolesCount < Min[Players.Count]) return ResultCode.NotEnoughMafia;
  80. if (blackRolesCount > Max[Players.Count]) return ResultCode.TooMuchMafia;
  81. Settings = CustomRoomSettings.ToDictionary(k=>k.Key, k=>k.Value);
  82. return ResultCode.CodeOk;
  83. });
  84. }
  85. public async Task InitSettings()
  86. {
  87. await Task.Run(() =>
  88. {
  89. CustomRoomSettings.Add(Roles.Villager, Players.Count);
  90. CustomRoomSettings.Add(Roles.Cop, 1);
  91. if (Players.Count != 8) CustomRoomSettings.Add(Roles.Doctor, 1);
  92. if (Players.Count % 3 == 0)
  93. CustomRoomSettings.Add(Roles.Mafia, Players.Count/3);
  94. else
  95. {
  96. CustomRoomSettings.Add(Roles.Mafia, Players.Count/3 -1);
  97. CustomRoomSettings.Add(Roles.Don, 1);
  98. }
  99. foreach (var (key, value) in CustomRoomSettings)
  100. {
  101. if (key != Roles.Villager)
  102. CustomRoomSettings[Roles.Villager] -= value;
  103. }
  104. if (CustomRoomSettings[Roles.Mafia] < 1) CustomRoomSettings.Remove(Roles.Mafia);
  105. if (CustomRoomSettings[Roles.Villager] < 1) CustomRoomSettings.Remove(Roles.Villager);
  106. });
  107. }
  108. }
  109. }