123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596 |
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Threading.Tasks;
- using MafiaTelegramBot.Controllers;
- using MafiaTelegramBot.CustomCollections.Extensions;
- using MafiaTelegramBot.Resources;
- namespace MafiaTelegramBot.Game.GameRooms
- {
- public partial class GameRoom
- {
- private ResultCode CanStartGame()
- {
- if (Players.Count < _minPlayers) return ResultCode.TooFewPlayers;
- if (Players.Count > MaxPlayers) return ResultCode.TooManyPlayers;
- return IsRunning ? ResultCode.GameAlreadyRunning : ResultCode.CodeOk;
- }
- public async Task<ResultCode> Prepare()
- {
- var resultCode = CanStartGame();
- if (resultCode != ResultCode.CodeOk) return resultCode;
- resultCode = await ReadSettings();
- if (resultCode != ResultCode.CodeOk) return resultCode;
- StopTimer();
- foreach (var (_, player) in Players) player.IsSpeaker = false;
- await GenerateTurnOrder();
- await AssignRoles();
- return resultCode;
- }
-
- private async Task AssignRoles()
- {
- await Task.Run(async () =>
- {
- var message = strings.in_this_game_we_have;
- var random = new Random();
- var rolesList = new List<Roles>();
- foreach (var (key, value) in Settings)
- {
- rolesList.AddTimes(key, value);
- if (value > 0) message += $"\n{roles.ResourceManager.GetString(key.ToString())} - {value}";
- Settings.Remove(key);
- }
- await PlayersMessageChannel.Send(message);
- for (var i = 0; i < _turnOrder.Count; ++i)
- {
- var user = _turnOrder.Dequeue();
- var value = random.Next(rolesList.Count);
- var next = rolesList.GetAndRemove(value);
- PlayersRole[next].Add(user);
- user.CurrentRole = Role.GetNewRoleInstance(next, this, user);
- _turnOrder.Enqueue(user);
- }
- await SendRolesToUsers();
- await PlayersMessageChannel.UpdateList(Players.Values);
- await MafiaMessageChannel.UpdateList(Players.Values);
- });
- }
- private async Task GenerateTurnOrder()
- {
- await Task.Run(() =>
- {
- var random = new Random();
- var playersCopy = Players.Values.ToList();
- while (playersCopy.Count != 0)
- {
- var player = playersCopy.GetAndRemove(random.Next(playersCopy.Count));
- _turnOrder.Enqueue(player);
- player.TurnOrder = _turnOrder.Count;
- player.IsPlaying = true;
- }
- Players = Players.OrderBy(item => item.Value.TurnOrder)
- .ToDictionary(x => x.Key, x => x.Value);
- });
- }
-
- public async Task SendRolesToUsers()
- {
- foreach (var player in Players.Values)
- {
- await MessageController.SendSticker(player.Info, Stickers.Sticker[player.GetRole().ToString()]);
- var message =
- $"{strings.your_role}: _*{player.GetRoleName()}*_\n" +
- $"{strings.your_turn_order}: _*{player.TurnOrder}*_\n"+
- $"{strings.bot_starting_game}";
- await MessageController.SendText(player.Info, message, Keyboard.InGamePlayerMenu);
- }
- }
- protected abstract Task<ResultCode> ReadSettings();
- }
- }
|