Browse Source

Merge branch 'develop' of https://gogs.veloe.link/Veloe/MafiaTelegramBot into develop

 Conflicts:
	MafiaTelegramBot/DataBase/Entity/OpenedRolesEntity.cs
	MafiaTelegramBot/Game/GameRooms/GameRoom.GameProcess.cs
	MafiaTelegramBot/Game/Player.cs
zelpold 4 years ago
parent
commit
958d5d50f3

+ 2 - 5
MafiaTelegramBot/DataBase/Entity/AchievementsEntity.cs

@@ -31,13 +31,10 @@ namespace MafiaTelegramBot.DataBase.Entity
         [Column("not_dispatched_on_second_stage"), MaxLength(127)]
         public int NotDispatchedOnSecondStage { get; set; } = 0;
 
-        [Column("player_win_team"), MaxLength(127)]
+        [Column("player_win_team"), MaxLength(4000)]
         public string PlayerWinTeam { get; set; } = "";
 
-        [Column("player_win_team_two"), MaxLength(127)]
+        [Column("player_win_team_two"), MaxLength(4000)]
         public string PlayerWinTeamTwo { get; set; } = "";
-
-        [Column("player_win_team_three"), MaxLength(127)]
-        public string PlayerWinTeamThree { get; set; } = "";
     }
 }

+ 5 - 0
MafiaTelegramBot/DataBase/Entity/OpenedRolesEntity.cs

@@ -93,5 +93,10 @@ namespace MafiaTelegramBot.DataBase.Entity
         {
             Werewolf = true;
         }
+
+        public void OpenParasite()
+        {
+            Parasite = true;
+        }
     }
 }

+ 19 - 14
MafiaTelegramBot/Game/GameRooms/GameRoom.GameProcess.cs

@@ -5,6 +5,7 @@ using System.Threading;
 using System.Threading.Tasks;
 using MafiaTelegramBot.Controllers;
 using MafiaTelegramBot.CustomCollections.Extensions;
+using MafiaTelegramBot.DataBase;
 using MafiaTelegramBot.DataBase.EntityDao;
 using MafiaTelegramBot.Game.GameRoles;
 using MafiaTelegramBot.Models;
@@ -508,11 +509,15 @@ namespace MafiaTelegramBot.Game.GameRooms
                         }
                     }
                     
+                    var villagerTeam = players.Where(p => p.CurrentRole.ColorRole == 1 && p.GetRole() != Roles.Lawyer).Select(p => p.Id);
+                    var mafiaTeam = players.Where(p => p.CurrentRole.ColorRole == 2 || p.GetRole() == Roles.Lawyer).Select(p => p.Id);
+                    
                     foreach (var player in players)
                     {
                         if (aliveMafia == 0)
                         {
-                            if ((player.CurrentRole.ColorRole == 1 || !(player.CurrentRole.RoleKey == Roles.Lawyer)) && player.IsAlive)
+                            if(player.CurrentRole.ColorRole == 1 && player.CurrentRole.RoleKey != Roles.Lawyer)
+                            {
                                 UpdateWins(player);
                             if (player.CurrentRole.RoleKey == Roles.Werewolf)
                             {
@@ -520,27 +525,34 @@ namespace MafiaTelegramBot.Game.GameRooms
                                     player.WerewolfRoleAchievementEvent(1);
                                 else player.WerewolfRoleAchievementEvent(2, true);
                             }
+                                player.ParasiteRoleAchievementEvent(villagerTeam.ToList());
+                            }
+                            else player.ResetParasiteProgress();
                         }
                         else
                         {
-                            if ((player.CurrentRole.ColorRole == 2 || player.CurrentRole.RoleKey == Roles.Lawyer) && player.IsAlive)
+                            if(player.CurrentRole.ColorRole == 2 || player.CurrentRole.RoleKey == Roles.Lawyer)
+                            {
                                 UpdateWins(player);
+                                player.ParasiteRoleAchievementEvent(mafiaTeam.ToList());
+                            }
+                            else player.ResetParasiteProgress();
                         }
 
                         if (player.CurrentRole.ColorRole == 3)
                         {
-                            if (player.CurrentRole.IsWon().Result != "")
-                                UpdateWins(player);
+                            if (player.CurrentRole.IsWon().Result != "") UpdateWins(player);
+                            else player.ResetParasiteProgress();
                         }
-                        player.ResetState();
+                        
                         if (player.CurrentRole.RoleKey == Roles.Cop)
                         {
                             if (((CopRole) PlayersRole[Roles.Cop][0].CurrentRole).CountRed ==
                                 ((CopRole) PlayersRole[Roles.Cop][0].CurrentRole).CountBlack) player.JournalistAchievementEvent();
                             if (((CopRole) PlayersRole[Roles.Cop][0].CurrentRole).CountRed == 0 &&
                                 ((CopRole) PlayersRole[Roles.Cop][0].CurrentRole).CountBlack != 0) player.DetectiveAchievementEvent();
-
                         }
+                        player.ResetState();
                     }
                     UserDao.DataBase.Statistics.UpdateRange(statsList);
                     UserDao.DataBase.OpenedRoles.UpdateRange(openRolesList);
@@ -550,14 +562,6 @@ namespace MafiaTelegramBot.Game.GameRooms
                 {
                     await Console.Out.WriteLineAsync(e.Message);
                 }
-                /*
-                foreach (var message in updatingNotifications)
-                {
-                    await Bot.Get().DeleteMessageAsync(message.Chat.Id,message.MessageId);
-                }
-                */
-                
-                
                 
                 IsRunning = false;
                 IsDay = false;
@@ -572,6 +576,7 @@ namespace MafiaTelegramBot.Game.GameRooms
                     await PlayersCh.SendExcept(Owner.Id, strings.thanks_for_game, Keyboard.PlayerGameMenu);
                 }
                 if (Players.Count <= Constants.PLAYER_DISABLE_TIMER) StartTimer();
+                await MafiaDataBase.GetInstance().SaveChangesAsync();
             });
         }
     }

+ 1 - 0
MafiaTelegramBot/Game/GameRooms/GameRoom.Structure.cs

@@ -78,6 +78,7 @@ namespace MafiaTelegramBot.Game.GameRooms
                 foreach (var (k, v) in voteKillCopy)
                     if (v == player.Id) VoteKillList.Remove(k);
                 PlayersRole[player.CurrentRole.RoleKey].Remove(player);
+                player.ResetParasiteProgress();
                 if (PlayersRole.ContainsKey(Roles.Parasite)
                     && PlayersRole[Roles.Parasite].Count == 1
                     && ((ParasiteRole) PlayersRole[Roles.Parasite][0].CurrentRole).ParentId == player.Id)

+ 87 - 36
MafiaTelegramBot/Game/Player.cs

@@ -4,6 +4,7 @@ using System.Collections.Generic;
 using System.Linq;
 using System.Threading.Tasks;
 using MafiaTelegramBot.CustomCollections;
+using MafiaTelegramBot.DataBase;
 using MafiaTelegramBot.DataBase.Entity;
 using MafiaTelegramBot.DataBase.EntityDao;
 using MafiaTelegramBot.Game.GameRoles;
@@ -144,24 +145,27 @@ namespace MafiaTelegramBot.Game
 
         public void BodyguardRoleAchievementEvent()
         {
-            Task.Run(async() =>
+            if (!OpenedRoles.Bodyguard)
             {
-                Achievements.DoctorHeals++;
-                if (Achievements.DoctorHeals == 10)
+                Task.Run(async() =>
                 {
-                    await Bot.SendWithMarkdown2(ChatId,
-                        $"{strings.congrats} {roles.Bodyguard}! {strings.you_can_use}");
-                    await Bot.SendStickerAsync(ChatId, Stickers.Sticker[Roles.Bodyguard.ToString()]);
-                    OpenedRoles.OpenBodyguard();
-                }
-            });
+                    Achievements.DoctorHeals++;
+                    if (Achievements.DoctorHeals == 10)
+                    {
+                        await Bot.SendWithMarkdown2(ChatId,
+                            $"{strings.congrats} {roles.Bodyguard}! {strings.you_can_use}");
+                        await Bot.SendStickerAsync(ChatId, Stickers.Sticker[Roles.Bodyguard.ToString()]);
+                        OpenedRoles.OpenBodyguard();
+                    }
+                });
+            }
         }
 
         public void NecromancerRoleAchievementEvent()
         {
-            Task.Run(async() =>
+            if (!OpenedRoles.Necromancer)
             {
-                if (!OpenedRoles.Necromancer)
+                Task.Run(async () =>
                 {
                     Achievements.DoctorHeals++;
                     if (Achievements.DoctorHeals == 50)
@@ -171,15 +175,15 @@ namespace MafiaTelegramBot.Game
                         await Bot.SendStickerAsync(ChatId, Stickers.Sticker[Roles.Necromancer.ToString()]);
                         OpenedRoles.OpenNecromancer();
                     }
-                } 
-            });
+                });
+            }
         }
 
         public void FoolRoleAchievementEvent()
         {
-            Task.Run(async() =>
+            if (!OpenedRoles.Fool)
             {
-                if (!OpenedRoles.Fool)
+                Task.Run(async () =>
                 {
                     Achievements.CopDispatches++;
                     if (Achievements.CopDispatches == 3)
@@ -189,29 +193,29 @@ namespace MafiaTelegramBot.Game
                         await Bot.SendStickerAsync(ChatId, Stickers.Sticker[Roles.Fool.ToString()]);
                         OpenedRoles.OpenFool();
                     }
-                } 
-            });
+                });
+            }
         }
 
         public void JournalistAchievementEvent()
         {
-            Task.Run(async() =>
+            if (!OpenedRoles.Journalist)
             {
-                if (!OpenedRoles.Journalist)
+                Task.Run(async () =>
                 {
                     await Bot.SendWithMarkdown2(ChatId,
                         $"{strings.congrats} {roles.Journalist}! {strings.you_can_use}");
                     await Bot.SendStickerAsync(ChatId, Stickers.Sticker[Roles.Journalist.ToString()]);
                     OpenedRoles.OpenJournalist();
-                }
-            });
+                });
+            }
         }
 
         public void DetectiveAchievementEvent() 
         {
-            Task.Run(async() =>
+            if (!OpenedRoles.Detective)
             {
-                if (!OpenedRoles.Detective)
+                Task.Run(async () =>
                 {
                     Achievements.GamesWhereCopCheckOnlyMafia++;
                     if (Achievements.GamesWhereCopCheckOnlyMafia == 3)
@@ -221,8 +225,8 @@ namespace MafiaTelegramBot.Game
                         await Bot.SendStickerAsync(ChatId, Stickers.Sticker[Roles.Detective.ToString()]);
                         OpenedRoles.OpenDetective();
                     }
-                }
-            });
+                });
+            }
         }
 
         public void DameRoleAchievementEvent()
@@ -264,9 +268,9 @@ namespace MafiaTelegramBot.Game
         }
         public void LawyerRoleAchievementEvent()
         {
-            Task.Run(async() =>
+            if (!OpenedRoles.Lawyer)
             {
-                if (!OpenedRoles.Lawyer)
+                Task.Run(async() =>
                 {
                     Achievements.MafiaSoloWins++;
                     if(Achievements.MafiaSoloWins == 3)
@@ -276,8 +280,8 @@ namespace MafiaTelegramBot.Game
                         await Bot.SendStickerAsync(ChatId, Stickers.Sticker[Roles.Lawyer.ToString()]);
                         OpenedRoles.OpenLawyer();
                     }
-                } 
-            });
+                });
+            } 
         }
 
         public void WerewolfRoleAchievementEvent(int color, bool reset = false)
@@ -305,16 +309,63 @@ namespace MafiaTelegramBot.Game
                 } 
             });
         }
-
-        public void ParasiteRoleAchievementEvent()
+        
+        public void ParasiteRoleAchievementEvent(List<long> team)
         {
-            Task.Run(() =>
+            
+            if (!OpenedRoles.Parasite)
             {
-                if (!OpenedRoles.Parasite)
+                Task.Run(async() =>
                 {
-                    
-                } 
-            });
+                    team.Remove(Id);
+                    if (Achievements.PlayerWinTeam == "")
+                    {
+                        Achievements.PlayerWinTeam = BuildString(team);
+                        Achievements.PlayerWinTeamTwo = "";
+                    }
+                    else
+                    {
+                        var firstTeam = Achievements.PlayerWinTeam.Split('|').Select(long.Parse).ToList();
+                        var firstCross = team.Intersect(firstTeam).ToList();
+                        if (firstCross.Count == 0)
+                        {
+                            Achievements.PlayerWinTeam = BuildString(team);
+                            Achievements.PlayerWinTeamTwo = "";
+                        }
+                        else
+                        {
+                            Achievements.PlayerWinTeam = BuildString(firstCross);
+                            if (Achievements.PlayerWinTeamTwo == "")
+                                Achievements.PlayerWinTeamTwo = BuildString(team);
+                            else
+                            {
+                                var secondTeam = Achievements.PlayerWinTeamTwo.Split('|').Select(long.Parse).ToList();
+                                var secondCross = team.Intersect(secondTeam).ToList();
+                                if (secondCross.Count == 0) Achievements.PlayerWinTeamTwo = BuildString(team);
+                                else
+                                {
+                                    await Bot.SendWithMarkdown2(ChatId,
+                                        $"{strings.congrats} {roles.Parasite}! {strings.you_can_use}");
+                                    await Bot.SendStickerAsync(ChatId, Stickers.Sticker[Roles.Parasite.ToString()]);
+                                    OpenedRoles.OpenParasite();
+                                }
+                            }
+                        }
+                    }
+                });
+            }
+
+            string BuildString(List<long> list)
+            {
+                var result = team.Aggregate("", (current, id) => current + (id + '|'));
+                return result.Remove(result.Length - 1);
+            }
+        }
+
+        public void ResetParasiteProgress()
+        {
+            Achievements.PlayerWinTeam = "";
+            Achievements.PlayerWinTeamTwo = "";
         }
     }
 }