Beispiel #1
0
            public Task AskForInteractionTarget(IEnumerable <IPerson> players, Role role, ICity city)
            {
                result.Append(role.DayTime == DayTime.Night ? "Город засыпает" : "Город просыпается");
                result.Append("\n");

                targets = new Dictionary <Role, IPerson>();

                var victims = new List <IPerson>();

                foreach (var player in players)
                {
                    result.Append($"Просыпается {role.Name} {player.Name}");
                    result.Append("\n");
                    var name = city.Population
                               .Where(person => person.NightRole is null || !person.NightRole.Equals(role))
                               .First(person => person.IsAlive).Name;
                    victims.Add(city.GetPersonByName(name));
                }

                if (victims.Count == 0)
                {
                    targets[role] = null;
                }
                else
                {
                    targets[role] = victims[0];
                }

                return(Task.CompletedTask);
            }
Beispiel #2
0
        public async Task <IPerson> GetInteractionTarget(Role role, ICity city)
        {
            if (!cityVotingPools.ContainsKey(city.Name))
            {
                return(null);
            }

            var votingPool = cityVotingPools[city.Name];

            var result = votingPool.ExtractRoleVoteWinner(role);

            if (!votingPool.IsEmpty)
            {
                return(city.GetPersonByName(result));
            }

            var lockTaken = false;

            try
            {
                await cityVotingSemaphore.WaitAsync();

                lockTaken = true;

                cityVotingPools.TryRemove(city.Name, out votingPool);
            }
            finally
            {
                if (lockTaken)
                {
                    cityVotingSemaphore.Release();
                }
            }

            return(city.GetPersonByName(result));
        }