فهرست منبع

Dame role realization

Tigran 4 سال پیش
والد
کامیت
e15355d8a9

+ 59 - 4
MafiaTelegramBot/Game/GameRoles/DameRole.cs

@@ -1,16 +1,71 @@
+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
 {
     public class DameRole : GameRoom.Role
     {
         public override Roles RoleKey => Roles.Dame;
-        public override Task NightAction() { return Task.CompletedTask; }
-        public override Task ApplyNightActionResult() { return Task.CompletedTask; }
-        public override Task SetNightTarget(long userId) { return new (()=>new Message()); }
+        public override async Task NightAction()
+        {
+            NightTargetId = -1;
+            Player.IsSpeaker = true;
+            var alivePlayers = Room.Players.Values.Where(p => p.IsAlive).ToList();
+            NightTargetList = alivePlayers.Where(p=> p.CanBeBlockedDay).ToList();
+            
+            var message = await Bot.SendWithMarkdown2(Player.ChatId, strings.choose_player_to_block, 
+                Keyboard.NightChooseTargetKeyboard(NightTargetList, Player.Id));
+            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()
+        {
+            Player.IsSpeaker = false;
+            if (NightTargetId != -2 && MafiaTargetId != -2)
+            {
+                if (MafiaTargetId == -1) await Room.PlayersCh.EditTo(Player.Id, MafiaMessageId, strings.you_have_not_choosen_target);
+                else MafiaTargetId = -1;
+                if (NightTargetId == -1) await SetRandomNightTarget();
+                if(Room.Players.ContainsKey(NightTargetId))
+                {
+                    Room.Players[NightTargetId].IsBlocked = true;
+                    Room.Players[NightTargetId].CanBeBlockedDay = false;
+                    await Room.PlayersCh.SendTo(NightTargetId, strings.dame_block_you);
+                }
+            }
+        }
+
+        public override async Task SetNightTarget(long userId)
+        {
+            if (!Room.Players.ContainsKey(userId)) 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} {Room.Players[NightTargetId].NickName}");
+            }
+        }
+        
+        public override async Task SetMafiaTarget(long userId)
+        {
+            if(userId == -1) await Room.PlayersCh.EditTo(Player.Id, MafiaMessageId, strings.you_skip_vote);
+            else
+            {
+                if (!Room.Players.ContainsKey(userId)) 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[MafiaTargetId].NickName}");
+                }
+            }
+        }
         public DameRole(GameRoom room, Player player) : base(room, player) { }
     }
 }

+ 1 - 1
MafiaTelegramBot/Game/GameRoles/HookerRole.cs

@@ -16,7 +16,7 @@ namespace MafiaTelegramBot.Game.GameRoles
         {
             NightTargetId = -1;
             NightTargetList = Room.Players.Values.Where(p => p.IsAlive && p.Id != Player.Id && p.CanBeBlockedNight).ToList();
-            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, 
                 Keyboard.NightChooseTargetKeyboard(NightTargetList, Player.Id));
             MessageId = message.MessageId;
         }

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

@@ -72,8 +72,8 @@ namespace MafiaTelegramBot.Game.GameRooms
                 foreach (var player in Players.Values)
                 {
                     player.CurrentRole.KnownRoles.Add(player);
-                    if(player.GetRole() is Roles.Don or Roles.Mafia) player.CurrentRole.KnownRoles.AddRange(
-                        Players.Values.Where(p=> player.Id != p.Id && p.GetRole() is Roles.Mafia or Roles.Don)
+                    if(player.GetRole() is Roles.Don or Roles.Mafia or Roles.Dame) player.CurrentRole.KnownRoles.AddRange(
+                        Players.Values.Where(p=> player.Id != p.Id && p.GetRole() is Roles.Mafia or Roles.Don or Roles.Dame)
                     );
                 }
                 resetEvent.WaitOne();
@@ -111,7 +111,7 @@ namespace MafiaTelegramBot.Game.GameRooms
             
             var discussionTimer = new Timer {AutoReset = false, Interval = 60 * 1000};
             var discussionEnded = new ManualResetEvent(false);
-            foreach (var player in Players.Values) player.IsSpeaker = true;
+            foreach (var player in Players.Values.Where(player => !player.IsBlocked)) player.IsSpeaker = true;
             discussionTimer.Elapsed += async (_, _) =>
             {
                 foreach (var player in Players.Values) player.IsSpeaker = false;
@@ -127,13 +127,16 @@ namespace MafiaTelegramBot.Game.GameRooms
             for (var i = 0; i < turnsCount; ++i)
             {
                 var player = _turnOrder.Dequeue();
-                if(!player.IsPlaying || !player.IsAlive) continue;
-                if (firstPlayer == null) player.IsFirst = true;
-                await PlayersCh.Send($"{strings.now_turn} ({player.TurnOrder}) {player.NickName}");
-                if (TimerEnabled) await Bot.SendWithMarkdown2(player.ChatId, strings.you_turn_say);
-                await player.CurrentRole.SpeakAction();
-                if (Players.ContainsKey(player.Id)) await player.CurrentRole.VotingAction();
-                if (player.IsFirst) firstPlayer = player;
+                if(!Players.ContainsKey(player.Id) || !player.IsAlive) continue;
+                if (!player.IsBlocked)
+                {
+                    if (firstPlayer == null) player.IsFirst = true;
+                    await PlayersCh.Send($"{strings.now_turn} ({player.TurnOrder}) {player.NickName}");
+                    if (TimerEnabled) await Bot.SendWithMarkdown2(player.ChatId, strings.you_turn_say);
+                    await player.CurrentRole.SpeakAction();
+                    if (Players.ContainsKey(player.Id)) await player.CurrentRole.VotingAction();
+                    if (player.IsFirst) firstPlayer = player;
+                }
                 else _turnOrder.Enqueue(player);
             }
             firstPlayer!.IsFirst = false;
@@ -159,6 +162,8 @@ namespace MafiaTelegramBot.Game.GameRooms
                 {
                     if(doctorId != player.Id) player.CanBeHealed = true;
                     player.CanBeBlockedNight = true;
+                    player.CanBeBlockedDay = true;
+                    player.IsBlocked = false;
                 }
                 timer.Start();
                 resetEvent.WaitOne();
@@ -215,8 +220,8 @@ namespace MafiaTelegramBot.Game.GameRooms
                 var contendersCopy = contenders.ToList();
                 VoteUpList.Clear();
                 VoteKillList.Clear();
-                foreach (var contender in contendersCopy) await contender.CurrentRole.DefenceAction();
-                var votersPlayers = Players.Values.Where(p => p.IsAlive).ToArray();
+                foreach (var contender in contendersCopy.Where(p => !p.IsBlocked)) await contender.CurrentRole.DefenceAction();
+                var votersPlayers = Players.Values.Where(p => p.IsAlive && !p.IsBlocked).ToArray();
                 Timer votingTimer = new() {Interval = 20 * 1000, AutoReset = false};
                 var resetEvent = new ManualResetEvent(false);
                 votingTimer.Elapsed += (_, _) => resetEvent.Set();

+ 6 - 3
MafiaTelegramBot/Game/GameRooms/GameRoom.Role.cs

@@ -59,9 +59,12 @@ namespace MafiaTelegramBot.Game.GameRooms
                 }
                 else
                 {
-                    await Room.PlayersCh.SendExcept(Player.Id, $"{strings.to_player} {Player.NickName} {strings.issued_posthumous_minute}");
-                    await Room.PlayersCh.SendTo(Player.ChatId, strings.you_will_be_dispatched);
-                    await SpeakAction(enableTimer: true);
+                    if (!Player.IsBlocked)
+                    {
+                        await Room.PlayersCh.SendExcept(Player.Id, $"{strings.to_player} {Player.NickName} {strings.issued_posthumous_minute}");
+                        await Room.PlayersCh.SendTo(Player.ChatId, strings.you_will_be_dispatched);
+                        await SpeakAction(enableTimer: true);
+                    }
                     await Kill();
                 }
             }

+ 2 - 2
MafiaTelegramBot/Resources/strings.Designer.cs

@@ -717,9 +717,9 @@ namespace MafiaTelegramBot {
             }
         }
         
-        internal static string choose_player_to_block_night {
+        internal static string choose_player_to_block {
             get {
-                return ResourceManager.GetString("choose_player_to_block_night", resourceCulture);
+                return ResourceManager.GetString("choose_player_to_block", resourceCulture);
             }
         }
         

+ 3 - 3
MafiaTelegramBot/Resources/strings.resx

@@ -286,7 +286,7 @@
         <value>У Вас есть минута, чтобы что-то сказать</value>
     </data>
     <data name="dame_block_you" xml:space="preserve">
-        <value>Дама заблокировала вас. Вы не сможете разговаривать и голосовать в этот день.</value>
+        <value>Дама заткнула вам рот кляпом. Вы не сможете разговаривать и голосовать в этот день.</value>
     </data>
     <data name="hooker_block_you" xml:space="preserve">
         <value>Проститутка переспала с вами. Ваши действия этой ночью ограничены.</value>
@@ -354,11 +354,11 @@
     <data name="current_enabled_roles" xml:space="preserve">
         <value>Текущая рассадка в комнате:</value>
     </data>
-    <data name="choose_player_to_block_night" xml:space="preserve">
+    <data name="choose_player_to_block" xml:space="preserve">
         <value>Выберите цель для блокировки</value>
     </data>
     <data name="you_blocked" xml:space="preserve">
-        <value>Вы заблокированы</value>
+        <value>Вы заблокированы, у вас кляп во рту</value>
     </data>
     <data name="now_you_cant_speak" xml:space="preserve">
         <value>Сейчас вы не можете разговаривать</value>