Browse Source

Merge remote-tracking branch 'origin/develop' into develop

# Conflicts:
#	MafiaTelegramBot/Resources/strings.Designer.cs
zelpold 4 years ago
parent
commit
ee15fef1c6

+ 13 - 18
MafiaTelegramBot/Game/GameRoles/BodyguardRole.cs

@@ -11,36 +11,31 @@ namespace MafiaTelegramBot.Game.GameRoles
 
         public override async Task NightAction()
         {
-            var targets = Room.Players.Values.Where(p => p.IsAlive && p.Id != Player.Id).ToList();
+            NightTargetList = Room.Players.Values.Where(p => p.IsAlive && p.Id != Player.Id).ToList();
             var message = await Bot.SendWithMarkdown2(Player.ChatId, strings.choose_target_to_protect, 
-                Keyboard.NightChooseTargetKeyboard(targets, Player.Id));
+                Keyboard.NightChooseTargetKeyboard(NightTargetList, Player.Id));
             MessageId = message.MessageId;
         }
 
         public override async Task ApplyNightActionResult()
         {
             if (NightTargetId == -1)
-                await Bot.EditMessageAsync(Player.ChatId, MessageId, strings.you_have_not_choosen_target);
-            else
             {
-                var target = Room.Players[NightTargetId];
-                NightTargetId = -1;
-                if (!target.IsAlive)
-                {
-                    target.IsAlive = true;
-                    Player.IsAlive = false;
-                }
+                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)
+            {
+                target.IsAlive = true;
+                Player.IsAlive = false;
             }
-            
         }
         public override async Task SetNightTarget(long userId) 
         {
-            if (userId == -1) await Room.PlayersCh.EditTo(Player.Id, MessageId, strings.you_skip_vote);
-            else
-            {
-                NightTargetId = userId;
-                await Room.PlayersCh.EditTo(Player.Id, MessageId, $"{strings.you_choose_target} {Room.Players[userId].NickName}");
-            }
+            NightTargetId = userId;
+            await Room.PlayersCh.EditTo(Player.Id, MessageId, $"{strings.you_choose_target} {Room.Players[userId].NickName}");
         }
         public BodyguardRole(GameRoom room, Player player) : base(room, player) { }
     }

+ 13 - 19
MafiaTelegramBot/Game/GameRoles/CopRole.cs

@@ -1,9 +1,7 @@
 using System.Linq;
 using System.Threading.Tasks;
 using MafiaTelegramBot.Game.GameRooms;
-using MafiaTelegramBot.Models;
 using MafiaTelegramBot.Resources;
-using Telegram.Bot.Types;
 
 namespace MafiaTelegramBot.Game.GameRoles
 {
@@ -13,36 +11,32 @@ namespace MafiaTelegramBot.Game.GameRoles
 
         public override async Task NightAction()
         {
-            var targets = Room.Players.Values.Except(KnownRoles).Where(p => p.IsAlive).ToList();
+            NightTargetList = Room.Players.Values.Except(KnownRoles).Where(p => p.IsAlive).ToList();
             var message = await Room.PlayersCh.SendTo(Player.ChatId, strings.choose_player_to_check_role, 
-                Keyboard.NightChooseTargetKeyboard(targets, Player.Id));
+                Keyboard.NightChooseTargetKeyboard(NightTargetList, Player.Id));
             MessageId = message.MessageId;
         }
 
         public override async Task ApplyNightActionResult()
         {
             if (NightTargetId == -1)
-                await Room.PlayersCh.EditTo(Player.Id, MessageId, strings.you_have_not_choosen_target);
-            else
             {
-                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}");
+                NightTargetId = NightTargetList[Utilities.Rnd.Next(NightTargetList.Count)].Id;
+                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}");
         }
 
         public override async Task SetNightTarget(long userId)
         {
-            if (userId == -1) await Room.PlayersCh.EditTo(Player.Id, MessageId,strings.you_skip_vote);
-            else
-            {
-                NightTargetId = userId;
-                await Room.PlayersCh.EditTo(Player.Id, MessageId, $"{strings.you_choose_target} {Room.Players[userId].NickName}");
-            }
+            NightTargetId = userId;
+            await Room.PlayersCh.EditTo(Player.Id, MessageId, $"{strings.you_choose_target} {Room.Players[userId].NickName}");
         }
 
         public CopRole(GameRoom room, Player player) : base(room, player) { }

+ 13 - 25
MafiaTelegramBot/Game/GameRoles/DoctorRole.cs

@@ -2,50 +2,38 @@ using System.Linq;
 using System.Threading.Tasks;
 using MafiaTelegramBot.Game.GameRooms;
 using MafiaTelegramBot.Resources;
-using Telegram.Bot.Types;
 
 namespace MafiaTelegramBot.Game.GameRoles
 {
     public class DoctorRole : GameRoom.Role
     {
         public override Roles RoleKey => Roles.Doctor;
-        private bool _haveTargets = true;
         public override async Task NightAction()
         {
-            var targets = Room.Players.Values.Where(p => p.IsAlive && p.CanBeHealed).ToList();
-            Message message;
-            if (targets.Count == 0)
-            {
-                message = await Room.PlayersCh.SendTo(Player.Id, strings.nothing_to_heal);
-                _haveTargets = false;
-            }
-            else message = await Room.PlayersCh.SendTo(Player.Id, strings.choose_player_to_heal, 
-                Keyboard.NightChooseTargetKeyboard(targets, Player.Id));
+            NightTargetList = Room.Players.Values.Where(p => p.IsAlive && p.CanBeHealed).ToList();
+            var message = await Room.PlayersCh.SendTo(Player.Id, strings.choose_player_to_heal, 
+                Keyboard.NightChooseTargetKeyboard(NightTargetList, Player.Id));
             MessageId = message.MessageId;
         }
 
         public override async Task ApplyNightActionResult()
         {
-            if (NightTargetId == -1 && _haveTargets)
-                await Room.PlayersCh.EditTo(Player.Id, MessageId, strings.you_have_not_choosen_target);
-            else
+            if (NightTargetId == -1)
             {
-                var target = Room.Players[NightTargetId];
-                target.CanBeHealed = false;
-                NightTargetId = -1;
-                if (!target.IsAlive) target.IsAlive = true;
+                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];
+            target.CanBeHealed = false;
+            NightTargetId = -1;
+            if (!target.IsAlive) target.IsAlive = true;
         }
 
         public override async Task SetNightTarget(long userId)
         {
-            if (userId == -1) await Room.PlayersCh.EditTo(Player.Id, MessageId,strings.you_skip_vote);
-            else
-            {
-                NightTargetId = userId;var target = Room.Players[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}");
-            }
+            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}");
         }
 
         public DoctorRole(GameRoom room, Player player) : base(room, player) { }

+ 14 - 17
MafiaTelegramBot/Game/GameRoles/DonRole.cs

@@ -14,10 +14,10 @@ namespace MafiaTelegramBot.Game.GameRoles
         {
             Player.IsSpeaker = true;
             var alivePlayers = Room.Players.Values.Where(p => p.IsAlive).ToList();
-            var targets = alivePlayers.Except(KnownRoles).ToList();
+            NightTargetList = alivePlayers.Except(KnownRoles).ToList();
             
             var message = await Bot.SendWithMarkdown2(Player.ChatId, strings.choose_player_to_check_role, 
-                Keyboard.NightChooseTargetKeyboard(targets, Player.Id));
+                Keyboard.NightChooseTargetKeyboard(NightTargetList, Player.Id));
             MessageId = message.MessageId;
             
             message = await Bot.SendWithMarkdown2(Player.ChatId, strings.choose_player_to_kill, 
@@ -30,27 +30,24 @@ namespace MafiaTelegramBot.Game.GameRoles
             Player.IsSpeaker = false;
             if (MafiaTargetId == -1) await Room.PlayersCh.EditTo(Player.Id, MafiaMessageId, strings.you_have_not_choosen_target);
             else MafiaTargetId = -1;
-            if (NightTargetId == -1) await Room.PlayersCh.EditTo(Player.Id, MessageId, strings.you_have_not_choosen_target);
-            else
+            if (NightTargetId == -1)
             {
-                var user = Room.Players[NightTargetId];
-                NightTargetId = -1;
-                KnownRoles.Add(user);
-                var role = user.GetRole() is Roles.Cop
-                    ? roles.Cop
-                    : roles.Villager;
-                await Bot.EditMessageAsync(Player.ChatId, MessageId, $"{strings.role_of_your_target} {user.NickName} - {role}");
+                NightTargetId = NightTargetList[Utilities.Rnd.Next(NightTargetList.Count)].Id;
+                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}");
         }
 
         public override async Task SetNightTarget(long userId)
         {
-            if(userId == -1) await Room.PlayersCh.EditTo(Player.Id, MafiaMessageId, strings.you_skip_vote);
-            else
-            {
-                NightTargetId = userId;
-                await Bot.EditMessageAsync(Player.ChatId, MessageId, $"{strings.you_choose_target} {Room.Players[userId].NickName}");
-            }
+            NightTargetId = userId;
+            await Room.PlayersCh.EditTo(Player.Id, MessageId, $"{strings.you_choose_target} {Room.Players[userId].NickName}");
         }
         
         public override async Task SetMafiaTarget(long userId)

+ 17 - 14
MafiaTelegramBot/Game/GameRoles/HookerRole.cs

@@ -13,37 +13,40 @@ namespace MafiaTelegramBot.Game.GameRoles
 
         public override async Task NightAction()
         {
-            var targets = Room.Players.Values.Where(p => p.IsAlive && p.Id != Player.Id && p.CanBeBlockedNight).ToList();
+            NightTargetList = Room.Players.Values.Where(p => p.IsAlive && p.Id != Player.Id && p.CanBeBlockedNight).ToList();
             if (NightTargetId != -1) Room.Players[NightTargetId].CanBeBlockedNight = true;
             NightTargetId = -1;
             var message = await Bot.SendWithMarkdown2(Player.ChatId, strings.choose_player_to_block_night, 
-                Keyboard.NightChooseTargetKeyboard(targets, Player.Id));
+                Keyboard.NightChooseTargetKeyboard(NightTargetList, Player.Id));
             MessageId = message.MessageId;
         }
 
         public override async Task ApplyNightActionResult()
         {
-            if(NightTargetId == -1) await Room.PlayersCh.EditTo(Player.Id, MafiaMessageId, strings.you_have_not_choosen_target);
+            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}");
+            }
             else Room.Players[NightTargetId].IsBlocked = false;
         }
 
         public override async Task SetNightTarget(long userId)
         {
-            if(userId == -1) await Room.PlayersCh.EditTo(Player.Id, MafiaMessageId, strings.you_skip_vote);
-            else
-            {
-                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}");
-            }
+            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}");
         }
 
         public override Task Kill()
         {
-            if (NightTargetId != -1 && !Room.IsDay)
+            if (!Room.IsDay)
             {
                 var target = Room.Players[NightTargetId];
                 if (target.CurrentRole.RoleKey != Roles.Mafia) target.IsAlive = false;

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

@@ -24,6 +24,7 @@ namespace MafiaTelegramBot.Game.GameRooms
             public readonly ManualResetEvent VoteActionComplete = new(false);
             protected int MessageId = -1;
             protected int MafiaMessageId = -1;
+            protected List<Player> NightTargetList = null;
             public abstract Roles RoleKey { get; }
             public virtual Task NightAction() { return Task.CompletedTask; }
             public virtual Task SetMafiaTarget(long userId) { return Task.CompletedTask; }

+ 2 - 5
MafiaTelegramBot/Resources/Keyboard.cs

@@ -156,7 +156,7 @@ namespace MafiaTelegramBot.Resources
         public static InlineKeyboardMarkup NightChooseTargetKeyboard(List<Player> players, long userId)
         {
             players.Sort((x, y) => x.TurnOrder - y.TurnOrder);
-            var inlineButtons = new InlineKeyboardButton[players.Count + 1][];
+            var inlineButtons = new InlineKeyboardButton[players.Count][];
             for (var i = 0; i<players.Count; ++i)
             {
                 inlineButtons[i] = new[] {
@@ -164,9 +164,6 @@ namespace MafiaTelegramBot.Resources
                         $"{Callback.NightTarget}|{userId}|{players[i].Id}")
                 };
             }
-            inlineButtons[players.Count] = new[] {
-                InlineKeyboardButton.WithCallbackData(strings.skip, $"{Callback.NightTarget}|{userId}|-1")
-            };
             return inlineButtons;
         }
 
@@ -184,7 +181,7 @@ namespace MafiaTelegramBot.Resources
                 };
             }
             inlineButtons[players.Count] = new[] {
-                InlineKeyboardButton.WithCallbackData(strings.skip, $"{Callback.NightTarget}|{userId}|-1")
+                InlineKeyboardButton.WithCallbackData(strings.skip, $"{Callback.MafiaTarget}|{userId}|-1")
             };
             return inlineButtons;
         }

+ 3 - 0
MafiaTelegramBot/Resources/strings.resx

@@ -423,6 +423,9 @@
     <data name="you_have_ten_seconds_to_vote" xml:space="preserve">
         <value>У вас есть 10 секунд, чтобы проголосовать за игрока</value>
     </data>
+    <data name="automatically_choosed_target" xml:space="preserve">
+        <value>Автоматически была выбрана цель:</value>
+    </data>
     <data name="you_won" xml:space="preserve">
         <value>Вы победили</value>
     </data>

+ 2 - 1
MafiaTelegramBot/Utilities.cs

@@ -9,7 +9,8 @@ namespace MafiaTelegramBot
 {
     public static class Utilities
     {
-
+        public static readonly Random Rnd = new();
+        
         public static Task<Message> GetResultCodeMessage(ResultCode code, long chatId)
         {
             return code switch