Player.cs 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406
  1. #nullable enable
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Threading.Tasks;
  6. using MafiaTelegramBot.CustomCollections;
  7. using MafiaTelegramBot.DataBase.Entity;
  8. using MafiaTelegramBot.DataBase.EntityDao;
  9. using MafiaTelegramBot.Game.GameRoles;
  10. using MafiaTelegramBot.Models;
  11. using MafiaTelegramBot.Resources;
  12. using Microsoft.EntityFrameworkCore;
  13. using Newtonsoft.Json;
  14. namespace MafiaTelegramBot.Game
  15. {
  16. public class Player : UserEntity
  17. {
  18. public GameRooms.GameRoom.Role CurrentRole = new NoneRole();
  19. public int TurnOrder = -1;
  20. private string _roomName = "";
  21. private DateTime _lastActivity;
  22. public bool IsSpeaker;
  23. public bool IsPlaying;
  24. public bool IsAlive = true;
  25. public bool CanBeHealed = true;
  26. public bool IsBlocked = false;
  27. public bool CanBeBlockedNight = true;
  28. public bool CanBeBlockedDay = true;
  29. public StatisticsList Statistics = new();
  30. public OpenedRolesEntity OpenedRoles = new();
  31. public AchievementsEntity Achievements = new();
  32. public void SetActive()
  33. {
  34. _lastActivity = DateTime.Now;
  35. }
  36. public TimeSpan GetLastActivityInterval()
  37. {
  38. return DateTime.Now.Subtract(_lastActivity);
  39. }
  40. public static Player FromUserEntity(UserEntity b)
  41. {
  42. var serialized = JsonConvert.SerializeObject(b);
  43. Player a = JsonConvert.DeserializeObject<Player>(serialized);
  44. return a;
  45. }
  46. public string GetRoomName()
  47. {
  48. return _roomName;
  49. }
  50. public bool SetRoomName(string roomName)
  51. {
  52. if (_roomName != "") return false;
  53. _roomName = roomName;
  54. return true;
  55. }
  56. public async Task<bool> RemoveGame()
  57. {
  58. if (_roomName == "") return false;
  59. _roomName = "";
  60. await UserDao.Update(this);
  61. return true;
  62. }
  63. public override bool Equals(object? obj)
  64. {
  65. return obj is UserEntity user && user.Id == Id;
  66. }
  67. public override int GetHashCode()
  68. {
  69. return Id.GetHashCode();
  70. }
  71. public Roles GetRole()
  72. {
  73. return CurrentRole.RoleKey;
  74. }
  75. public string GetRoleName()
  76. {
  77. return roles.ResourceManager.GetString(CurrentRole.RoleKey.ToString())!;
  78. }
  79. public void ResetState()
  80. {
  81. CurrentRole = new NoneRole();
  82. IsAlive = true;
  83. IsSpeaker = true;
  84. IsPlaying = false;
  85. CanBeHealed = true;
  86. CanBeBlockedDay = true;
  87. CanBeBlockedNight = true;
  88. }
  89. public void BodyguardRoleAchievementEvent()
  90. {
  91. if (!OpenedRoles.Bodyguard)
  92. {
  93. Task.Run(async () =>
  94. {
  95. Achievements.DoctorHeals++;
  96. if (Achievements.DoctorHeals == 10)
  97. {
  98. await Bot.SendWithMarkdown2(ChatId,
  99. $"{strings.congrats} {roles.Bodyguard}! {strings.you_can_use}");
  100. await Bot.SendStickerAsync(ChatId, Stickers.Sticker[Roles.Bodyguard.ToString()]);
  101. OpenedRoles.OpenBodyguard();
  102. }
  103. });
  104. }
  105. }
  106. public void NecromancerRoleAchievementEvent()
  107. {
  108. if (!OpenedRoles.Necromancer)
  109. {
  110. Task.Run(async () =>
  111. {
  112. Achievements.DoctorHeals++;
  113. if (Achievements.DoctorHeals == 50)
  114. {
  115. await Bot.SendWithMarkdown2(ChatId,
  116. $"{strings.congrats} {roles.Necromancer}! {strings.you_can_use}");
  117. await Bot.SendStickerAsync(ChatId, Stickers.Sticker[Roles.Necromancer.ToString()]);
  118. OpenedRoles.OpenNecromancer();
  119. }
  120. });
  121. }
  122. }
  123. public void FoolRoleAchievementEvent()
  124. {
  125. if (!OpenedRoles.Fool)
  126. {
  127. Task.Run(async () =>
  128. {
  129. Achievements.CopDispatches++;
  130. if (Achievements.CopDispatches == 3)
  131. {
  132. await Bot.SendWithMarkdown2(ChatId,
  133. $"{strings.congrats} {roles.Fool}! {strings.you_can_use}");
  134. await Bot.SendStickerAsync(ChatId, Stickers.Sticker[Roles.Fool.ToString()]);
  135. OpenedRoles.OpenFool();
  136. }
  137. });
  138. }
  139. }
  140. public void JournalistAchievementEvent()
  141. {
  142. if (!OpenedRoles.Journalist)
  143. {
  144. Task.Run(async () =>
  145. {
  146. await Bot.SendWithMarkdown2(ChatId,
  147. $"{strings.congrats} {roles.Journalist}! {strings.you_can_use}");
  148. await Bot.SendStickerAsync(ChatId, Stickers.Sticker[Roles.Journalist.ToString()]);
  149. OpenedRoles.OpenJournalist();
  150. });
  151. }
  152. }
  153. public void DetectiveAchievementEvent()
  154. {
  155. if (!OpenedRoles.Detective)
  156. {
  157. Task.Run(async () =>
  158. {
  159. Achievements.GamesWhereCopCheckOnlyMafia++;
  160. if (Achievements.GamesWhereCopCheckOnlyMafia == 3)
  161. {
  162. await Bot.SendWithMarkdown2(ChatId,
  163. $"{strings.congrats} {roles.Detective}! {strings.you_can_use}");
  164. await Bot.SendStickerAsync(ChatId, Stickers.Sticker[Roles.Detective.ToString()]);
  165. OpenedRoles.OpenDetective();
  166. }
  167. });
  168. }
  169. }
  170. public void DameRoleAchievementEvent()
  171. {
  172. Task.Run(async () =>
  173. {
  174. if (!OpenedRoles.Dame)
  175. {
  176. Achievements.HaveSexWithDon++;
  177. if (Achievements.HaveSexWithDon == 5)
  178. {
  179. await Bot.SendWithMarkdown2(ChatId,
  180. $"{strings.congrats} {roles.Dame}! {strings.you_can_use}");
  181. await Bot.SendStickerAsync(ChatId, Stickers.Sticker[Roles.Dame.ToString()]);
  182. OpenedRoles.OpenDame();
  183. }
  184. }
  185. });
  186. }
  187. public void ElderRoleAchievementEvent()
  188. {
  189. Task.Run(async () =>
  190. {
  191. if (!OpenedRoles.Elder)
  192. {
  193. Achievements.NotDispatchedOnSecondStage++;
  194. if (Achievements.NotDispatchedOnSecondStage == 2)
  195. {
  196. await Bot.SendWithMarkdown2(ChatId,
  197. $"{strings.congrats} {roles.Elder}! {strings.you_can_use}");
  198. await Bot.SendStickerAsync(ChatId, Stickers.Sticker[Roles.Elder.ToString()]);
  199. OpenedRoles.OpenElder();
  200. }
  201. }
  202. });
  203. }
  204. public void LawyerRoleAchievementEvent()
  205. {
  206. if (!OpenedRoles.Lawyer)
  207. {
  208. Task.Run(async () =>
  209. {
  210. Achievements.MafiaSoloWins++;
  211. if (Achievements.MafiaSoloWins == 3)
  212. {
  213. await Bot.SendWithMarkdown2(ChatId,
  214. $"{strings.congrats} {roles.Lawyer}! {strings.you_can_use}");
  215. await Bot.SendStickerAsync(ChatId, Stickers.Sticker[Roles.Lawyer.ToString()]);
  216. OpenedRoles.OpenLawyer();
  217. }
  218. });
  219. }
  220. }
  221. public void WerewolfRoleAchievementEvent(int color, bool reset = false)
  222. {
  223. if (!OpenedRoles.Werewolf)
  224. {
  225. Task.Run(async () =>
  226. {
  227. if (reset)
  228. {
  229. Achievements.PreviousGameWinColor = 0;
  230. }
  231. else if ((Achievements.PreviousGameWinColor == 1 && color == 2)
  232. || (Achievements.PreviousGameWinColor == 2 && color == 1))
  233. {
  234. await Bot.SendWithMarkdown2(ChatId,
  235. $"{strings.congrats} {roles.Werewolf}! {strings.you_can_use}");
  236. await Bot.SendStickerAsync(ChatId, Stickers.Sticker[Roles.Werewolf.ToString()]);
  237. OpenedRoles.OpenWerewolf();
  238. }
  239. else
  240. {
  241. Achievements.PreviousGameWinColor = color;
  242. }
  243. });
  244. }
  245. }
  246. public void HookerRoleAchievementEvent()
  247. {
  248. if (!OpenedRoles.Hooker)
  249. {
  250. Task.Run(async () =>
  251. {
  252. await Bot.SendWithMarkdown2(ChatId,
  253. $"{strings.congrats} {roles.Hooker}! {strings.you_can_use}");
  254. await Bot.SendStickerAsync(ChatId, Stickers.Sticker[Roles.Hooker.ToString()]);
  255. OpenedRoles.OpenHooker();
  256. });
  257. }
  258. }
  259. public async Task ParasiteRoleAchievementEvent(List<long> team)
  260. {
  261. if (!OpenedRoles.Parasite)
  262. {
  263. await Task.Run(async () =>
  264. {
  265. team.Remove(Id);
  266. if (Achievements.PlayerWinTeam == "")
  267. {
  268. Achievements.PlayerWinTeam = BuildString(team);
  269. Achievements.PlayerWinTeamTwo = "";
  270. }
  271. else
  272. {
  273. var firstTeam = Achievements.PlayerWinTeam.Split('|').Select(long.Parse).ToList();
  274. var firstCross = team.Intersect(firstTeam).ToList();
  275. if (firstCross.Count == 0)
  276. {
  277. Achievements.PlayerWinTeam = BuildString(team);
  278. Achievements.PlayerWinTeamTwo = "";
  279. }
  280. else
  281. {
  282. Achievements.PlayerWinTeam = BuildString(firstCross);
  283. if (Achievements.PlayerWinTeamTwo == "")
  284. {
  285. Achievements.PlayerWinTeamTwo = BuildString(team);
  286. }
  287. else
  288. {
  289. var secondTeam = Achievements.PlayerWinTeamTwo.Split('|').Select(long.Parse).ToList();
  290. var secondCross = team.Intersect(secondTeam).ToList();
  291. if (secondCross.Count == 0) Achievements.PlayerWinTeamTwo = BuildString(team);
  292. else
  293. {
  294. await Bot.SendWithMarkdown2(ChatId,
  295. $"{strings.congrats} {roles.Parasite}! {strings.you_can_use}");
  296. await Bot.SendStickerAsync(ChatId, Stickers.Sticker[Roles.Parasite.ToString()]);
  297. OpenedRoles.OpenParasite();
  298. }
  299. }
  300. }
  301. }
  302. });
  303. }
  304. string BuildString(List<long> list)
  305. {
  306. if (list.Count == 0) return "";
  307. var result = "";
  308. foreach (var item in list) result += $"{item}|";
  309. return result.Remove(result.Length - 1);
  310. }
  311. }
  312. public void ResetParasiteProgress()
  313. {
  314. Achievements.PlayerWinTeam = "";
  315. Achievements.PlayerWinTeamTwo = "";
  316. }
  317. public char GetRank()
  318. {
  319. return RankNumber switch
  320. {
  321. <100 => 'a',
  322. >=100 and <300 => 'b',
  323. >=300 and <500 => 'c',
  324. >=500 => 'd',
  325. };
  326. }
  327. public int AddRankPoints()
  328. {
  329. switch (GetRank())
  330. {
  331. case 'a':
  332. {
  333. RankNumber += CurrentRole.RankingCost;
  334. return CurrentRole.RankingCost;
  335. }
  336. case 'b':
  337. {
  338. RankNumber += CurrentRole.RankingCost;
  339. return CurrentRole.RankingCost;
  340. }
  341. case 'c':
  342. {
  343. RankNumber += (int)(CurrentRole.RankingCost * Statistics[Roles.All].GetWinrate());
  344. return (int)(CurrentRole.RankingCost * Statistics[Roles.All].GetWinrate());
  345. }
  346. case 'd':
  347. {
  348. RankNumber += (int)(CurrentRole.RankingCost * Statistics[Roles.All].GetWinrate());
  349. return (int)(CurrentRole.RankingCost * Statistics[Roles.All].GetWinrate());
  350. }
  351. default: return 0;
  352. }
  353. }
  354. public int SubtractRankPoints()
  355. {
  356. switch (GetRank())
  357. {
  358. case 'b':
  359. {
  360. RankNumber -= CurrentRole.RankingCost;
  361. return CurrentRole.RankingCost;
  362. }
  363. case 'c':
  364. {
  365. RankNumber -= (int)(CurrentRole.RankingCost * Statistics[Roles.All].GetWinrate());
  366. return (int)(CurrentRole.RankingCost * Statistics[Roles.All].GetWinrate());
  367. }
  368. case 'd':
  369. {
  370. RankNumber -= CurrentRole.RankingCost;
  371. return CurrentRole.RankingCost;
  372. }
  373. default: return 0;
  374. }
  375. }
  376. }
  377. }