Browse Source

Night action safety left rom game

Tigran 4 years ago
parent
commit
2e98c9bf9a

+ 17 - 8
MafiaTelegramBot/Game/GameRoles/BodyguardRole.cs

@@ -1,5 +1,6 @@
 using System.Linq;
 using System.Threading.Tasks;
+using MafiaTelegramBot.CustomCollections.Extensions;
 using MafiaTelegramBot.Game.GameRooms;
 using MafiaTelegramBot.Models;
 using MafiaTelegramBot.Resources;
@@ -26,19 +27,27 @@ namespace MafiaTelegramBot.Game.GameRoles
                     NightTargetId = NightTargetList[Utilities.Rnd.Next(NightTargetList.Count)].Id;
                     await Room.PlayersCh.EditTo(Player.Id, MessageId, $"{strings.automatically_choosed_target} {Room.Players[NightTargetId].NickName}");
                 }
-                var target = Room.Players[NightTargetId];
-                NightTargetId = -1;
-                if (!target.IsAlive)
+                var target = Room.Players.GetIfContains(NightTargetId);
+                if(target != null)
                 {
-                    target.IsAlive = true;
-                    Player.IsAlive = false;
+                    NightTargetId = -1;
+                    if (!target.IsAlive)
+                    {
+                        target.IsAlive = true;
+                        Player.IsAlive = false;
+                    }
                 }
             }
         }
-        public override async Task SetNightTarget(long userId) 
+        public override async Task SetNightTarget(long userId)
         {
-            NightTargetId = userId;
-            await Room.PlayersCh.EditTo(Player.Id, MessageId, $"{strings.you_choose_target} {Room.Players[userId].NickName}");
+            var target = Room.Players.GetIfContains(userId);
+            if (target == null) await Room.PlayersCh.SendTo(Player.Id, strings.this_player_left_from_game);
+            else
+            {
+                NightTargetId = userId;
+                await Room.PlayersCh.EditTo(Player.Id, MessageId, $"{strings.you_choose_target} {target.NickName}");  
+            }
         }
         public BodyguardRole(GameRoom room, Player player) : base(room, player) { }
     }

+ 20 - 11
MafiaTelegramBot/Game/GameRoles/CopRole.cs

@@ -1,5 +1,6 @@
 using System.Linq;
 using System.Threading.Tasks;
+using MafiaTelegramBot.CustomCollections.Extensions;
 using MafiaTelegramBot.Game.GameRooms;
 using MafiaTelegramBot.Resources;
 
@@ -27,22 +28,30 @@ namespace MafiaTelegramBot.Game.GameRoles
                     await Room.PlayersCh.EditTo(Player.Id, MessageId,
                         $"{strings.automatically_choosed_target} {Room.Players[NightTargetId].NickName}");
                 }
-
-                var user = Room.Players[NightTargetId];
-                NightTargetId = -1;
-                KnownRoles.Add(user);
-                var role = user.GetRole() is Roles.Don or Roles.Mafia
-                    ? roles.Mafia
-                    : roles.Villager;
-                await Room.PlayersCh.EditTo(Player.Id, MessageId,
-                    $"{strings.role_of_your_target} {user.NickName} - {role}");
+                
+                var player = Room.Players.GetIfContains(NightTargetId);
+                if (player != null)
+                {
+                    NightTargetId = -1;KnownRoles.Add(player);
+                    var role = player.GetRole() is Roles.Don or Roles.Mafia
+                        ? roles.Mafia
+                        : roles.Villager;
+                    await Room.PlayersCh.EditTo(Player.Id, MessageId,
+                        $"{strings.role_of_your_target} {player.NickName} - {role}");
+                }
+                else await Room.PlayersCh.EditTo(Player.Id, MessageId, strings.this_player_left_from_game);
             }
         }
 
         public override async Task SetNightTarget(long userId)
         {
-            NightTargetId = userId;
-            await Room.PlayersCh.EditTo(Player.Id, MessageId, $"{strings.you_choose_target} {Room.Players[userId].NickName}");
+            var target = Room.Players.GetIfContains(userId);
+            if (target == null) await Room.PlayersCh.SendTo(Player.Id, strings.this_player_left_from_game);
+            else
+            {
+                NightTargetId = userId;
+                await Room.PlayersCh.EditTo(Player.Id, MessageId, $"{strings.you_choose_target} {target.NickName}");
+            }
         }
 
         public CopRole(GameRoom room, Player player) : base(room, player) { }

+ 16 - 7
MafiaTelegramBot/Game/GameRoles/DoctorRole.cs

@@ -1,5 +1,6 @@
 using System.Linq;
 using System.Threading.Tasks;
+using MafiaTelegramBot.CustomCollections.Extensions;
 using MafiaTelegramBot.Game.GameRooms;
 using MafiaTelegramBot.Resources;
 
@@ -26,18 +27,26 @@ namespace MafiaTelegramBot.Game.GameRoles
                     await Room.PlayersCh.EditTo(Player.Id, MessageId,
                         $"{strings.automatically_choosed_target} {Room.Players[NightTargetId].NickName}");
                 }
-                var target = Room.Players[NightTargetId];
-                target.CanBeHealed = false;
-                NightTargetId = -1;
-                if (!target.IsAlive) target.IsAlive = true;
+                var target = Room.Players.GetIfContains(NightTargetId);
+                if (target != null)
+                {
+                    target.CanBeHealed = false;
+                    NightTargetId = -1;
+                    if (!target.IsAlive) target.IsAlive = true;
+                }
             }
         }
 
         public override async Task SetNightTarget(long userId)
         {
-            NightTargetId = userId;
-            if(userId == Player.Id) await Room.PlayersCh.EditTo(Player.Id, MessageId,strings.you_heal_yourself);
-            else await Room.PlayersCh.EditTo(Player.Id, MessageId, $"{strings.you_choose_target} {Room.Players[userId].NickName}");
+            var target = Room.Players.GetIfContains(userId);
+            if (target == null) await Room.PlayersCh.SendTo(Player.Id, strings.this_player_left_from_game);
+            else
+            {
+                NightTargetId = userId;
+                if(userId == Player.Id) await Room.PlayersCh.EditTo(Player.Id, MessageId,strings.you_heal_yourself);
+                else await Room.PlayersCh.EditTo(Player.Id, MessageId, $"{strings.you_choose_target} {target.NickName}");
+            }
         }
 
         public DoctorRole(GameRoom room, Player player) : base(room, player) { }

+ 28 - 12
MafiaTelegramBot/Game/GameRoles/DonRole.cs

@@ -1,5 +1,6 @@
 using System.Linq;
 using System.Threading.Tasks;
+using MafiaTelegramBot.CustomCollections.Extensions;
 using MafiaTelegramBot.Game.GameRooms;
 using MafiaTelegramBot.Models;
 using MafiaTelegramBot.Resources;
@@ -38,21 +39,30 @@ namespace MafiaTelegramBot.Game.GameRoles
                     await Room.PlayersCh.EditTo(Player.Id, MessageId,
                         $"{strings.automatically_choosed_target} {Room.Players[NightTargetId].NickName}");
                 }
-                var user = Room.Players[NightTargetId];
-                NightTargetId = -1;
-                KnownRoles.Add(user);
-                var role = user.GetRole() is Roles.Cop
-                    ? roles.Cop
-                    : roles.Villager;
-                await Room.PlayersCh.EditTo(Player.Id, MessageId,
-                    $"{strings.role_of_your_target} {user.NickName} - {role}");
+                var target = Room.Players.GetIfContains(NightTargetId);
+                if(target==null) await Room.PlayersCh.EditTo(Player.Id, MessageId, strings.this_player_left_from_game);
+                else
+                {
+                    NightTargetId = -1;
+                    KnownRoles.Add(target);
+                    var role = target.GetRole() is Roles.Cop
+                        ? roles.Cop
+                        : roles.Villager;
+                    await Room.PlayersCh.EditTo(Player.Id, MessageId,
+                        $"{strings.role_of_your_target} {target.NickName} - {role}");
+                }
             }
         }
 
         public override async Task SetNightTarget(long userId)
         {
-            NightTargetId = userId;
-            await Room.PlayersCh.EditTo(Player.Id, MessageId, $"{strings.you_choose_target} {Room.Players[userId].NickName}");
+            var target = Room.Players.GetIfContains(userId);
+            if (target == null) await Room.PlayersCh.SendTo(Player.Id, strings.this_player_left_from_game);
+            else
+            {
+                NightTargetId = userId;
+                await Room.PlayersCh.EditTo(Player.Id, MessageId, $"{strings.you_choose_target} {target.NickName}");
+            }
         }
         
         public override async Task SetMafiaTarget(long userId)
@@ -60,8 +70,14 @@ namespace MafiaTelegramBot.Game.GameRoles
             if(userId == -1) await Room.PlayersCh.EditTo(Player.Id, MafiaMessageId, strings.you_skip_vote);
             else
             {
-                MafiaTargetId = userId;
-                await Room.PlayersCh.EditTo(Player.Id, MafiaMessageId, $"{strings.you_choose_target} {Room.Players[userId].NickName}");
+                var target = Room.Players.GetIfContains(userId);
+                if (target == null) await Room.PlayersCh.SendTo(Player.Id, strings.this_player_left_from_game);
+                else
+                {
+                    MafiaTargetId = userId;
+                    await Room.PlayersCh.EditTo(Player.Id, MafiaMessageId,
+                        $"{strings.you_choose_target} {target.NickName}");
+                }
             }
         }
 

+ 23 - 11
MafiaTelegramBot/Game/GameRoles/HookerRole.cs

@@ -1,5 +1,6 @@
 using System.Linq;
 using System.Threading.Tasks;
+using MafiaTelegramBot.CustomCollections.Extensions;
 using MafiaTelegramBot.Game.GameRooms;
 using MafiaTelegramBot.Models;
 using MafiaTelegramBot.Resources;
@@ -26,22 +27,33 @@ namespace MafiaTelegramBot.Game.GameRoles
             if (NightTargetId == -1)
             {
                 NightTargetId = NightTargetList[Utilities.Rnd.Next(NightTargetList.Count)].Id;
-                var target = Room.Players[NightTargetId];
-                target.CanBeBlockedNight = false;
-                await target.CurrentRole.CancelNightActionResult(strings.hooker_block_you);
-                await Room.PlayersCh.EditTo(Player.Id, MessageId, $"{strings.automatically_choosed_target} {Room.Players[NightTargetId].NickName}");
+                var target = Room.Players.GetIfContains(NightTargetId);
+                if (target != null)
+                {
+                    target.CanBeBlockedNight = false;
+                    await target.CurrentRole.CancelNightActionResult(strings.hooker_block_you);
+                    await Room.PlayersCh.EditTo(Player.Id, MessageId, $"{strings.automatically_choosed_target} {Room.Players[NightTargetId].NickName}");
+                }
+            }
+            else
+            {
+                var target = Room.Players.GetIfContains(NightTargetId);
+                if (target != null) target.CanBeBlockedNight = false;
             }
-            else Room.Players[NightTargetId].IsBlocked = false;
         }
 
         public override async Task SetNightTarget(long userId)
         {
-            NightTargetId = userId;
-            var target = Room.Players[userId];
-            target.CanBeBlockedNight = false;
-            target.IsBlocked = true;
-            await target.CurrentRole.CancelNightActionResult(strings.hooker_block_you);
-            await Bot.EditMessageAsync(Player.ChatId, MessageId, $"{strings.you_choose_target} {Room.Players[userId].NickName}");
+            var target = Room.Players.GetIfContains(userId);
+            if(target!= null)
+            {
+                NightTargetId = userId;
+                target.CanBeBlockedNight = false;
+                target.IsBlocked = true;
+                await target.CurrentRole.CancelNightActionResult(strings.hooker_block_you);
+                await Room.PlayersCh.EditTo(Player.ChatId, MessageId, $"{strings.you_choose_target} {Room.Players[userId].NickName}");
+            }
+            else await Room.PlayersCh.SendTo(Player.Id, strings.this_player_left_from_game);
         }
 
         public override Task Kill()

+ 8 - 2
MafiaTelegramBot/Game/GameRoles/MafiaRole.cs

@@ -1,5 +1,6 @@
 using System.Linq;
 using System.Threading.Tasks;
+using MafiaTelegramBot.CustomCollections.Extensions;
 using MafiaTelegramBot.Game.GameRooms;
 using MafiaTelegramBot.Models;
 using MafiaTelegramBot.Resources;
@@ -34,8 +35,13 @@ namespace MafiaTelegramBot.Game.GameRoles
             if(userId == -1) await Room.PlayersCh.EditTo(Player.Id, MafiaMessageId, strings.you_skip_vote);
             else
             {
-                MafiaTargetId = userId;
-                await Room.PlayersCh.EditTo(Player.Id, MafiaMessageId, $"{strings.you_choose_target} {Room.Players[userId].NickName}");
+                var target = Room.Players.GetIfContains(userId);
+                if(target == null) await Room.PlayersCh.SendTo(Player.Id, strings.this_player_left_from_game);
+                else
+                {
+                    MafiaTargetId = userId;
+                    await Room.PlayersCh.EditTo(Player.Id, MafiaMessageId, $"{strings.you_choose_target} {Room.Players[userId].NickName}");
+                }
             }
         }
 

+ 6 - 0
MafiaTelegramBot/Resources/strings.Designer.cs

@@ -890,5 +890,11 @@ namespace MafiaTelegramBot {
                 return ResourceManager.GetString("nothing_up_to_dispatch", resourceCulture);
             }
         }
+        
+        internal static string this_player_left_from_game {
+            get {
+                return ResourceManager.GetString("this_player_left_from_game", resourceCulture);
+            }
+        }
     }
 }

+ 3 - 0
MafiaTelegramBot/Resources/strings.resx

@@ -441,4 +441,7 @@
     <data name="nothing_up_to_dispatch" xml:space="preserve">
         <value>Некого казнить</value>
     </data>
+    <data name="this_player_left_from_game" xml:space="preserve">
+        <value>Этот игрок покинул игру</value>
+    </data>
 </root>