예제 #1
0
        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);
        }