12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788 |
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Threading.Tasks;
- using MafiaTelegramBot.CustomCollections.Extensions;
- using MafiaTelegramBot.Models;
- 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;
- 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 PlayersCh.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);
- }
- });
- }
- 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;
- }
- });
- }
-
- public async Task SendRolesToUsers()
- {
- foreach (var player in Players.Values)
- {
- await Bot.SendStickerAsync(player.ChatId, 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 Bot.SendWithMarkdown2(player.ChatId, message, Keyboard.InGamePlayerMenu);
- }
- }
- protected abstract Task<ResultCode> ReadSettings();
- }
- }
|