Browse Source

Mafia kill process

Tigran 4 years ago
parent
commit
9b3da2a1e7

+ 1 - 3
MafiaTelegramBot/Game/GameRoles/BodyguardRole.cs

@@ -3,8 +3,6 @@ using System.Threading.Tasks;
 using MafiaTelegramBot.Game.GameRooms;
 using MafiaTelegramBot.Game.GameRooms;
 using MafiaTelegramBot.Models;
 using MafiaTelegramBot.Models;
 using MafiaTelegramBot.Resources;
 using MafiaTelegramBot.Resources;
-using Telegram.Bot.Types;
-
 namespace MafiaTelegramBot.Game.GameRoles
 namespace MafiaTelegramBot.Game.GameRoles
 {
 {
     public class BodyguardRole : GameRoom.Role
     public class BodyguardRole : GameRoom.Role
@@ -15,7 +13,7 @@ namespace MafiaTelegramBot.Game.GameRoles
         {
         {
             var targets = Room.Players.Values.Where(p => p.IsAlive && p.Id != Player.Id).ToList();
             var targets = Room.Players.Values.Where(p => p.IsAlive && p.Id != Player.Id).ToList();
             var message = await Bot.SendWithMarkdown2(Player.ChatId, strings.choose_target_to_protect, 
             var message = await Bot.SendWithMarkdown2(Player.ChatId, strings.choose_target_to_protect, 
-                Keyboard.NightChooseTargetKeyboard(targets, Player.Id, true));
+                Keyboard.NightChooseTargetKeyboard(targets, Player.Id));
             MessageId = message.MessageId;
             MessageId = message.MessageId;
         }
         }
 
 

+ 26 - 5
MafiaTelegramBot/Game/GameRoles/DonRole.cs

@@ -13,17 +13,24 @@ namespace MafiaTelegramBot.Game.GameRoles
         public override async Task NightAction()
         public override async Task NightAction()
         {
         {
             Player.IsSpeaker = true;
             Player.IsSpeaker = true;
-            var targets = Room.Players.Values.Except(KnownRoles).Where(p => p.IsAlive).ToList();
+            var alivePlayers = Room.Players.Values.Where(p => p.IsAlive).ToList();
+            var targets = alivePlayers.Except(KnownRoles).ToList();
+            
             var message = await Bot.SendWithMarkdown2(Player.ChatId, strings.choose_player_to_check_role, 
             var message = await Bot.SendWithMarkdown2(Player.ChatId, strings.choose_player_to_check_role, 
                 Keyboard.NightChooseTargetKeyboard(targets, Player.Id));
                 Keyboard.NightChooseTargetKeyboard(targets, Player.Id));
             MessageId = message.MessageId;
             MessageId = message.MessageId;
+            
+            message = await Bot.SendWithMarkdown2(Player.ChatId, strings.choose_player_to_kill, 
+                Keyboard.NightMafiaTargetKeyboard(alivePlayers, Player.Id));
+            MafiaMessageId = message.MessageId;
         }
         }
 
 
         public override async Task ApplyNightActionResult()
         public override async Task ApplyNightActionResult()
         {
         {
             Player.IsSpeaker = false;
             Player.IsSpeaker = false;
-            if (NightTargetId == -1)
-                await Bot.EditMessageAsync(Player.ChatId, MessageId, strings.you_have_not_choosen_target);
+            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
             else
             {
             {
                 var user = Room.Players[NightTargetId];
                 var user = Room.Players[NightTargetId];
@@ -38,8 +45,22 @@ namespace MafiaTelegramBot.Game.GameRoles
 
 
         public override async Task SetNightTarget(long userId)
         public override async Task SetNightTarget(long userId)
         {
         {
-            NightTargetId = userId;
-            await Bot.EditMessageAsync(Player.ChatId, MessageId, $"{strings.you_choose_target} {Room.Players[userId].NickName}");
+            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}");
+            }
+        }
+        
+        public override async Task SetMafiaTarget(long userId)
+        {
+            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}");
+            }
         }
         }
 
 
         public DonRole(GameRoom room, Player player) : base(room, player) { }
         public DonRole(GameRoom room, Player player) : base(room, player) { }

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

@@ -17,24 +17,28 @@ namespace MafiaTelegramBot.Game.GameRoles
             Room.Players[NightTargetId].CanBeBlockedNight = true;
             Room.Players[NightTargetId].CanBeBlockedNight = true;
             NightTargetId = -1;
             NightTargetId = -1;
             var message = await Bot.SendWithMarkdown2(Player.ChatId, strings.choose_player_to_block_night, 
             var message = await Bot.SendWithMarkdown2(Player.ChatId, strings.choose_player_to_block_night, 
-                Keyboard.NightChooseTargetKeyboard(targets, Player.Id, true));
+                Keyboard.NightChooseTargetKeyboard(targets, Player.Id));
             MessageId = message.MessageId;
             MessageId = message.MessageId;
         }
         }
 
 
-        public override Task ApplyNightActionResult()
+        public override async Task ApplyNightActionResult()
         {
         {
-            Room.Players[NightTargetId].IsBlocked = false;
-            return Task.CompletedTask;
+            if(NightTargetId == -1) await Room.PlayersCh.EditTo(Player.Id, MafiaMessageId, strings.you_have_not_choosen_target);
+            else Room.Players[NightTargetId].IsBlocked = false;
         }
         }
 
 
         public override async Task SetNightTarget(long userId)
         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}");
+            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}");
+            }
         }
         }
 
 
         public override async Task Kill()
         public override async Task Kill()

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

@@ -15,21 +15,25 @@ namespace MafiaTelegramBot.Game.GameRoles
             Player.IsSpeaker = true;
             Player.IsSpeaker = true;
             var targets = Room.Players.Values.Where(p => p.IsAlive).ToList();
             var targets = Room.Players.Values.Where(p => p.IsAlive).ToList();
             var message = await Room.PlayersCh.SendTo(Player.ChatId, strings.choose_player_to_kill, 
             var message = await Room.PlayersCh.SendTo(Player.ChatId, strings.choose_player_to_kill, 
-                Keyboard.NightChooseTargetKeyboard(targets, Player.Id, true));
-            MessageId = message.MessageId;
+                Keyboard.NightMafiaTargetKeyboard(targets, Player.Id));
+            MafiaMessageId = message.MessageId;
         }
         }
 
 
-        public override Task ApplyNightActionResult()
+        public override async Task ApplyNightActionResult()
         {
         {
-            NightTargetId = -1;
             Player.IsSpeaker = false;
             Player.IsSpeaker = false;
-            return Task.CompletedTask;
+            if (MafiaTargetId == -1) await Room.PlayersCh.EditTo(Player.Id, MafiaMessageId, strings.you_have_not_choosen_target);
+            else MafiaTargetId = -1;
         }
         }
 
 
-        public override async Task SetNightTarget(long userId)
+        public override async Task SetMafiaTarget(long userId)
         {
         {
-            NightTargetId = userId;
-            await Room.PlayersCh.EditTo(Player.Id, MessageId, $"{strings.you_choose_target} {Room.Players[userId].NickName}");
+            if(userId == -1) await Room.PlayersCh.EditTo(Player.Id, MafiaMessageId, strings.you_skip_vote);
+            else
+            {
+                NightTargetId = userId;
+                await Room.PlayersCh.EditTo(Player.Id, MafiaMessageId, $"{strings.you_choose_target} {Room.Players[userId].NickName}");
+            }
         }
         }
 
 
         public MafiaRole(GameRoom room, Player player) : base(room, player) { }
         public MafiaRole(GameRoom room, Player player) : base(room, player) { }

+ 12 - 18
MafiaTelegramBot/Game/GameRooms/GameRoom.GameProcess.cs

@@ -151,27 +151,21 @@ namespace MafiaTelegramBot.Game.GameRooms
             {
             {
                 var beforeKill = Players.Values.ToDictionary(p=>p.Id,p=>p.IsAlive);
                 var beforeKill = Players.Values.ToDictionary(p=>p.Id,p=>p.IsAlive);
                 var mafiaNotAgree = "";
                 var mafiaNotAgree = "";
+                var votes = Players.Values.Where(p=> p.IsAlive && p.CurrentRole.MafiaTargetId != -1)
+                    .GroupBy(p => p.CurrentRole.MafiaTargetId)
+                    .Select(item => new {id = item.Key, count = item.Count()})
+                    .ToList();
+                if (votes.Count == 0) mafiaNotAgree = strings.mafia_not_kill_message;
+                else {
+                    var max = votes.Max(item => item.count);
+                    var maxObjects = votes.Where(item => item.count == max).ToList();
+                    if(maxObjects.Count == 1) await Players[maxObjects[0].id].CurrentRole.Kill();
+                }
+                    
                 foreach (var (role, players) in PlayersRole)
                 foreach (var (role, players) in PlayersRole)
                 {
                 {
                     if (role is Roles.Mafia)
                     if (role is Roles.Mafia)
-                    {
-                        var votes = players.Where(p=> p.IsAlive && p.CurrentRole.NightTargetId != -1)
-                            .GroupBy(p => p.CurrentRole.NightTargetId)
-                            .Select(item => new {id = item.Key, count = item.Count()})
-                            .ToList();
-                        if (votes.Count > 0)
-                        {
-                            var max = votes.Max(item => item.count);
-                            var maxCount = votes.Count(item => item.count == max);
-                            if (maxCount > 1) continue;
-                            var selected = votes.First(item => item.count == max).id;
-                            if (selected == -1) continue;
-                            await Players[selected].CurrentRole.Kill();
-                        }
-                        else
-                            mafiaNotAgree = strings.mafia_not_kill_message;
                         foreach (var mafia in players) await mafia.CurrentRole.ApplyNightActionResult();
                         foreach (var mafia in players) await mafia.CurrentRole.ApplyNightActionResult();
-                    }
                     else if (players.Count == 1)
                     else if (players.Count == 1)
                     {
                     {
                         var player = players[0];
                         var player = players[0];
@@ -259,7 +253,7 @@ namespace MafiaTelegramBot.Game.GameRooms
                 .Select(item => new {id = item.Key, count = item.Count()})
                 .Select(item => new {id = item.Key, count = item.Count()})
                 .ToList();
                 .ToList();
             List<Player> result = new();
             List<Player> result = new();
-            if (votes.Count <= 0) return result;
+            if (votes.Count == 0) return result;
             var max = votes.Max(item => item.count);
             var max = votes.Max(item => item.count);
             var maxObjects = votes.Where(item => item.count == max);
             var maxObjects = votes.Where(item => item.count == max);
             result.AddRange(maxObjects.Select(obj => Players[obj.id]));
             result.AddRange(maxObjects.Select(obj => Players[obj.id]));

+ 4 - 1
MafiaTelegramBot/Game/GameRooms/GameRoom.QueryHandler.cs

@@ -36,9 +36,12 @@ namespace MafiaTelegramBot.Game.GameRooms
                         await _room.PutUpVote(player.Id, long.Parse(data[2]), messageId, true);
                         await _room.PutUpVote(player.Id, long.Parse(data[2]), messageId, true);
                         player.CurrentRole.VoteActionComplete.Set();
                         player.CurrentRole.VoteActionComplete.Set();
                         break;
                         break;
-                    case Callback.Target:
+                    case Callback.NightTarget:
                         await player.CurrentRole.SetNightTarget(long.Parse(data[2]));
                         await player.CurrentRole.SetNightTarget(long.Parse(data[2]));
                         break;
                         break;
+                    case Callback.MafiaTarget:
+                        await player.CurrentRole.SetMafiaTarget(long.Parse(data[2]));
+                        break;
                     default:
                     default:
                         await _room.PlayersCh.SendTo(chatId, strings.not_supported_in_game);
                         await _room.PlayersCh.SendTo(chatId, strings.not_supported_in_game);
                         break;
                         break;

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

@@ -19,12 +19,16 @@ namespace MafiaTelegramBot.Game.GameRooms
             protected readonly Player Player;
             protected readonly Player Player;
             public readonly List<Player> KnownRoles = new();
             public readonly List<Player> KnownRoles = new();
             public long NightTargetId = -1;
             public long NightTargetId = -1;
+            public long MafiaTargetId = -1;
             public readonly ManualResetEvent TalkingActionComplete = new(false);
             public readonly ManualResetEvent TalkingActionComplete = new(false);
             public readonly ManualResetEvent VoteActionComplete = new(false);
             public readonly ManualResetEvent VoteActionComplete = new(false);
             protected int MessageId = -1;
             protected int MessageId = -1;
+            protected int MafiaMessageId = -1;
             public abstract Roles RoleKey { get; }
             public abstract Roles RoleKey { get; }
             public virtual Task NightAction() { return Task.CompletedTask; }
             public virtual Task NightAction() { return Task.CompletedTask; }
+            public virtual Task SetMafiaTarget(long userId) { return Task.CompletedTask; }
             public virtual Task ApplyNightActionResult() { return Task.CompletedTask; }
             public virtual Task ApplyNightActionResult() { return Task.CompletedTask; }
+            public virtual Task SetNightTarget(long userId) { return Task.CompletedTask; }
 
 
             public async Task CancelNightActionResult(string message)
             public async Task CancelNightActionResult(string message)
             {
             {
@@ -34,7 +38,6 @@ namespace MafiaTelegramBot.Game.GameRooms
                 Player.IsSpeaker = false;
                 Player.IsSpeaker = false;
                 await Room.PlayersCh.SendTo(Player.ChatId, message);
                 await Room.PlayersCh.SendTo(Player.ChatId, message);
             }
             }
-            public virtual Task SetNightTarget(long userId) { return Task.CompletedTask; }
             
             
             public virtual async Task Dispatch()
             public virtual async Task Dispatch()
             {
             {

+ 2 - 2
MafiaTelegramBot/Resources/Callback.cs

@@ -22,7 +22,7 @@ namespace MafiaTelegramBot.Resources
         ApplyRolesChange,
         ApplyRolesChange,
         Vote,
         Vote,
         VoteToKill,
         VoteToKill,
-        Skip,
-        Target
+        MafiaTarget,
+        NightTarget
     }
     }
 }
 }

+ 24 - 4
MafiaTelegramBot/Resources/Keyboard.cs

@@ -153,19 +153,39 @@ namespace MafiaTelegramBot.Resources
             return inlineButtons;
             return inlineButtons;
         }
         }
 
 
-        public static InlineKeyboardMarkup NightChooseTargetKeyboard(List<Player> players, long userId, bool showMafia = false)
+        public static InlineKeyboardMarkup NightChooseTargetKeyboard(List<Player> players, long userId)
         {
         {
             players.Sort((x, y) => x.TurnOrder - y.TurnOrder);
             players.Sort((x, y) => x.TurnOrder - y.TurnOrder);
-            var inlineButtons = new InlineKeyboardButton[players.Count][];
+            var inlineButtons = new InlineKeyboardButton[players.Count + 1][];
+            for (var i = 0; i<players.Count; ++i)
+            {
+                inlineButtons[i] = new[] {
+                    InlineKeyboardButton.WithCallbackData($"({players[i].TurnOrder}) {players[i].NickName}", 
+                        $"{Callback.NightTarget}|{userId}|{players[i].Id}")
+                };
+            }
+            inlineButtons[players.Count] = new[] {
+                InlineKeyboardButton.WithCallbackData(strings.skip, $"{Callback.NightTarget}|{userId}|-1")
+            };
+            return inlineButtons;
+        }
+
+        public static InlineKeyboardMarkup NightMafiaTargetKeyboard(List<Player> players, long userId)
+        {
+            players.Sort((x, y) => x.TurnOrder - y.TurnOrder);
+            var inlineButtons = new InlineKeyboardButton[players.Count + 1][];
             for (var i = 0; i<players.Count; ++i)
             for (var i = 0; i<players.Count; ++i)
             {
             {
                 inlineButtons[i] = new[]
                 inlineButtons[i] = new[]
                 {
                 {
                     InlineKeyboardButton.WithCallbackData($"({players[i].TurnOrder}) " +
                     InlineKeyboardButton.WithCallbackData($"({players[i].TurnOrder}) " +
-                        $"{players[i].NickName}{(showMafia && players[i].GetRole() is Roles.Mafia or Roles.Don ? " - " + players[i].GetRoleName() : "")}", 
-                        $"{Callback.Target}|{userId}|{players[i].Id}")
+                        $"{players[i].NickName}{(players[i].GetRole() is Roles.Mafia or Roles.Don ? " - " + players[i].GetRoleName() : "")}", 
+                        $"{Callback.MafiaTarget}|{userId}|{players[i].Id}")
                 };
                 };
             }
             }
+            inlineButtons[players.Count] = new[] {
+                InlineKeyboardButton.WithCallbackData(strings.skip, $"{Callback.NightTarget}|{userId}|-1")
+            };
             return inlineButtons;
             return inlineButtons;
         }
         }