private void ProcessActiveCombats() { var fightsToDelete = new List <Guid>(); foreach (var fight in _combatRepository.GetAllFights()) { if (fight.NextRound > DateTime.Now) { continue; } fight.Round++; fight.NextRound = DateTime.Now.AddSeconds(FightRoundTimer); var attackers = fight.Fighters.Where(x => x.Side == FighterSide.Attacking).ToList(); var defenders = fight.Fighters.Where(x => x.Side == FighterSide.Defending).ToList(); var actions = new List <FighterAction>(); actions.AddRange(defenders.Select(x => GetFighterAction(x, attackers))); actions.AddRange(attackers.Select(x => GetFighterAction(x, defenders))); foreach (var action in actions) { var fighter = fight.Fighters.FirstOrDefault(x => x.Id == action.Fighter); if (fighter == null) { continue; } if (fighter.Health <= 0) { continue; } foreach (var attack in action.Attacks.SelectMany(x => x.Damages)) { var victimFighter = fight.Fighters.FirstOrDefault(x => x.Id == attack.Victim); if (victimFighter == null) { continue; } victimFighter.Health -= attack.Damage; } } _combatSender.Report(fight, actions); if (fight.Round >= 5) { _combatSender.EndFight(fight); fightsToDelete.Add(fight.Id); } } _combatRepository.RemoveFights(fightsToDelete); }