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); }
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)); }