WerewolfRole.cs 3.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. using System.Linq;
  2. using System.Threading.Tasks;
  3. using MafiaTelegramBot.Game.GameRooms;
  4. using MafiaTelegramBot.Resources;
  5. namespace MafiaTelegramBot.Game.GameRoles
  6. {
  7. public class WerewolfRole : GameRoom.Role
  8. {
  9. public override Roles RoleKey => Roles.Werewolf;
  10. public bool IsMafia = false;
  11. private int _color = 1;
  12. public override int ColorRole
  13. {
  14. get => _color;
  15. set => _color = (int) value;
  16. }
  17. public override async Task NightAction()
  18. {
  19. MafiaTargetId = -1;
  20. if (Player.IsAlive)
  21. {
  22. if (IsMafia)
  23. {
  24. Player.IsSpeaker = true;
  25. var targets = Room.Players.Values.Where(p => p.IsAlive).ToList();
  26. var message = await Room.PlayersCh.SendTo(Player.ChatId, strings.choose_player_to_kill,
  27. Keyboard.NightMafiaTargetKeyboard(targets, Player.Id));
  28. MafiaMessageId = message.MessageId;
  29. }
  30. }
  31. else MafiaTargetId = -3;
  32. }
  33. public override async Task ApplyNightActionResult()
  34. {
  35. if (IsMafia && NightTargetId != -3)
  36. {
  37. Player.IsSpeaker = false;
  38. if (MafiaTargetId == -1)
  39. await Room.PlayersCh.EditTo(Player.Id, MafiaMessageId, strings.you_have_not_choosen_target);
  40. }
  41. }
  42. public async Task TransformToMafia()
  43. {
  44. if (IsMafia) return;
  45. ColorRole = 2;
  46. IsMafia = true;
  47. var mafiaList = Room.Players.Values.Where(p => p.GetRole() is Roles.Don or Roles.Mafia or Roles.Dame).ToDictionary(p=>p.Id, p => p.GetRoleName());
  48. foreach (var player in mafiaList)
  49. {
  50. Room.Players[player.Key].CurrentRole.KnownRoles.Add(Player.Id, Player.GetRoleName());
  51. KnownRoles.Add(player.Key, player.Value);
  52. }
  53. var mafia = Room.Players.Values.Where(player => player.GetRole() is Roles.Mafia).ToArray();
  54. var don = Room.Players.Values.FirstOrDefault(player => player.GetRole() is Roles.Don);
  55. var dame = Room.Players.Values.FirstOrDefault(player => player.GetRole() is Roles.Dame);
  56. var message = strings.your_teammates;
  57. if (don != null) message += $"\n({don.TurnOrder}) {don.NickName} - {roles.Don}";
  58. if (dame != null) message += $"\n({dame.TurnOrder}) {dame.NickName} - {roles.Dame}";
  59. message = mafia.Aggregate(message, (current, player) => current + $"\n({player.TurnOrder}) {player.NickName}");
  60. await Room.PlayersCh.SendTo(Player.Id, message);
  61. }
  62. public override async Task SetMafiaTarget(long userId)
  63. {
  64. if (IsMafia)
  65. {
  66. if (userId == -1) await Room.PlayersCh.EditTo(Player.Id, MafiaMessageId, strings.you_skip_vote);
  67. else
  68. {
  69. if (!Room.Players.ContainsKey(userId))
  70. await Room.PlayersCh.SendTo(Player.Id, strings.this_player_left_from_game);
  71. else
  72. {
  73. MafiaTargetId = userId;
  74. await Room.PlayersCh.EditTo(Player.Id, MafiaMessageId,
  75. $"{strings.you_choose_target} {Room.Players[userId].NickName}");
  76. }
  77. }
  78. }
  79. }
  80. public WerewolfRole(GameRoom room, Player player) : base(room, player) { }
  81. }
  82. }