Exemple #1
0
        public void OnStep()
        {
            // Wait for the queued units to finish
            if (!_done && !_intelManager.ProductionQueue.Any())
            {
                foreach (var colony in _eStarts) // Then queue attack move command on each enemy starting location
                {
                    _combatManager.AttackMove(theGang, colony.Point, true);
                }
                _done = true; // Check to make sure we only do it once
            }

            if (_done)   // Once the attack has begun
            {
                foreach (var gangUnit in theGang.Units)
                {
                    // Find the enemys closest base using straight line distance
                    var point = _eStarts.OrderBy(c => MathExtensions.EuclidianDistance(gangUnit.Point, c.Point)).First().Point;

                    // Ïf the adepts are close enough to phase walk to the middle of the base, do it.
                    if (gangUnit.UnitType == BlizzardConstants.Unit.Adept)
                    {
                        if (MathExtensions.EuclidianDistance(gangUnit.Point, point) < 35 && MathExtensions.EuclidianDistance(gangUnit.Point, point) > 5)
                        {
                            _combatManager.UsePointCenteredAbility(BlizzardConstants.Ability.AdeptPhaseShift, gangUnit.Tag, point);
                        }
                    }
                    else if (gangUnit.UnitType == BlizzardConstants.Unit.Phoenix &&
                             !_intelManager.UnitsEnemyVisible.Any(u => u.BuffIds.Contains(BlizzardConstants.Buffs.GravitonBeam)))
                    {
                        // If there is not already an enemy affected by gravition beam, then find a visible unit
                        var eUnit = _intelManager.UnitsEnemyVisible.FirstOrDefault();
                        if (eUnit != null)
                        {
                            // and use Gravition beam on it
                            _combatManager.UseTargetedAbility(BlizzardConstants.Ability.GravitonBeam, gangUnit.Tag, eUnit.Tag);
                        }
                    }
                    else if (gangUnit.UnitType == BlizzardConstants.Unit.Sentry)
                    {
                        // If there are any visible enemies close
                        if (_intelManager.UnitsEnemyVisible.Any(e => MathExtensions.EuclidianDistance(e.Point, gangUnit.Point) < 15))
                        {
                            // Use guardian shield
                            _combatManager.UseTargetlessAbility(BlizzardConstants.Ability.GuardianShield, gangUnit.Tag);
                        }
                    }
                    if (!gangUnit.Orders.Any() && MathExtensions.EuclidianDistance(gangUnit.Point, point) > 5) // If the unit is doing nothing and is not standing on a base
                    {
                        foreach (var colony in _eStarts)                                                       // Queue an attack move command on each enemy starting location
                        {
                            _combatManager.AttackMove(theGang, colony.Point, true);
                        }
                    }
                }
            }
        }
        public void OnStep()
        {
            if (GameConstants.ParticipantRace != Race.Zerg)
            {
                return;
            }
            var queens     = _squadRepo.Get(_queenSquadId);
            var hatcheries = _squadRepo.Get(_hatcheriesId).Units;

            if (queens.Units.Count != 0 && hatcheries.Count != 0)
            {
                foreach (var hatchery in hatcheries)
                {
                    if (!hatchery.BuffIds.Contains(BlizzardConstants.Buffs.QueenSpawnLarvaTimer))
                    {
                        var queen = hatchery.GetClosest(queens.Units);
                        _combatManager.UseTargetedAbility(BlizzardConstants.Ability.SpawnLarva, queen.Tag, hatchery.Tag);
                    }
                }
            }
        }
        public void Execute(CombatRequest request)
        {
            switch (request.CommandCase)
            {
            case CombatRequest.CommandOneofCase.MoveUnit:
                _manager.Move(request.MoveUnit.UnitTag, request.MoveUnit.Point, request.MoveUnit.Queue);
                break;

            case CombatRequest.CommandOneofCase.MoveSquad:
                _manager.Move(_repository.Get().First(s => s.Id.Equals(request.MoveSquad.Squad)),
                              request.MoveSquad.Point, request.MoveSquad.Queue);
                break;

            case CombatRequest.CommandOneofCase.AttackMoveUnit:
                _manager.AttackMove(request.AttackMoveUnit.UnitTag, request.AttackMoveUnit.Point,
                                    request.AttackMoveUnit.Queue);
                break;

            case CombatRequest.CommandOneofCase.AttackMoveSquad:
                _manager.AttackMove(_repository.Get().First(s => s.Id.Equals(request.AttackMoveSquad.Squad)),
                                    request.AttackMoveSquad.Point, request.AttackMoveSquad.Queue);
                break;

            case CombatRequest.CommandOneofCase.AttackUnit:
                _manager.Attack(request.AttackUnit.SourceUnit, request.AttackUnit.TargetUnit,
                                request.AttackUnit.Queue);
                break;

            case CombatRequest.CommandOneofCase.AttackSquad:
                _manager.Attack(_repository.Get().First(s => s.Id.Equals(request.AttackSquad.Squad)),
                                request.AttackSquad.TargetUnit, request.AttackSquad.Queue);
                break;

            case CombatRequest.CommandOneofCase.UseTargetedAbilityUnit:
                _manager.UseTargetedAbility(request.UseTargetedAbilityUnit.AbilityId,
                                            request.UseTargetedAbilityUnit.SourceUnit, request.UseTargetedAbilityUnit.TargetUnit,
                                            request.UseTargetedAbilityUnit.Queue);
                break;

            case CombatRequest.CommandOneofCase.UseTargetedAbilitySquad:
                _manager.UseTargetedAbility(request.UseTargetedAbilitySquad.AbilityId,
                                            _repository.Get().First(s => s.Id.Equals(request.UseTargetedAbilitySquad.Squad)),
                                            request.UseTargetedAbilitySquad.TargetUnit, request.UseTargetedAbilitySquad.Queue);
                break;

            case CombatRequest.CommandOneofCase.UsePointCenteredAbilityUnit:
                _manager.UsePointCenteredAbility(request.UsePointCenteredAbilityUnit.AbilityId,
                                                 request.UsePointCenteredAbilityUnit.SourceUnit, request.UsePointCenteredAbilityUnit.Point);
                break;

            case CombatRequest.CommandOneofCase.UsePointCenteredAbilitySquad:
                _manager.UsePointCenteredAbility(request.UsePointCenteredAbilitySquad.AbilityId,
                                                 _repository.Get().First(s => s.Id.Equals(request.UsePointCenteredAbilitySquad.Squad)),
                                                 request.UsePointCenteredAbilitySquad.Point, request.UsePointCenteredAbilitySquad.Queue);
                break;

            case CombatRequest.CommandOneofCase.UseTargetlessAbilityUnit:
                _manager.UseTargetlessAbility(request.UseTargetlessAbilityUnit.AbilityId,
                                              request.UseTargetlessAbilityUnit.SourceUnit, request.UseTargetlessAbilityUnit.Queue);
                break;

            case CombatRequest.CommandOneofCase.UseTargetlessAbilitySquad:
                _manager.UseTargetlessAbility(request.UseTargetedAbilitySquad.AbilityId,
                                              _repository.Get().First(s => s.Id.Equals(request.UseTargetedAbilitySquad.Squad)),
                                              request.UseTargetedAbilitySquad.Queue);
                break;

            case CombatRequest.CommandOneofCase.SmartMoveUnit:
                if (_intel.TryGet(request.SmartMoveUnit.UnitTag, out IUnit unit))
                {
                    _manager.SmartMove(unit, request.SmartMoveUnit.Point, request.SmartMoveUnit.Queue);
                }
                break;

            case CombatRequest.CommandOneofCase.SmartMoveSquad:
                _manager.SmartMove(_repository.Get().First(s => s.Id.Equals(request.SmartMoveSquad.Squad)),
                                   request.SmartMoveSquad.Point, request.SmartMoveSquad.Queue);
                break;

            case CombatRequest.CommandOneofCase.SmartAttackMoveUnit:
                if (_intel.TryGet(request.SmartMoveUnit.UnitTag, out IUnit u))
                {
                    _manager.SmartAttackMove(u, request.SmartAttackMoveUnit.Point, request.SmartAttackMoveUnit.Queue);
                }
                break;

            case CombatRequest.CommandOneofCase.SmartAttackMoveSquad:
                _manager.SmartAttackMove(
                    _repository.Get().First(s => s.Id.Equals(request.SmartAttackMoveSquad.Squad)),
                    request.SmartAttackMoveSquad.Point, request.SmartAttackMoveSquad.Queue);
                break;

            case CombatRequest.CommandOneofCase.SmartAttackUnit:
                if (_intel.TryGet(request.SmartAttackUnit.SourceUnit, out IUnit un))
                {
                    _manager.SmartAttack(un, request.SmartAttackUnit.TargetUnit, request.SmartAttackUnit.Queue);
                }
                break;

            case CombatRequest.CommandOneofCase.SmartAttackSquad:
                _manager.SmartAttack(_repository.Get().First(s => s.Id.Equals(request.SmartAttackSquad.Squad)),
                                     request.SmartAttackSquad.TargetUnit, request.SmartAttackSquad.Queue);
                break;

            case CombatRequest.CommandOneofCase.SquadRequest:
                var addUnits    = request.SquadRequest.AddUnits;
                var removeUnits = request.SquadRequest.RemoveUnits;
                var createSquad = request.SquadRequest.CreateSquad;
                var removeSquad = request.SquadRequest.RemoveSquad;
                if (request.SquadRequest.AddUnits != null)
                {
                    foreach (var tag in addUnits.Tags)
                    {
                        if (_intel.TryGet(tag, out var addedUnit))
                        {
                            _repository.Get().First(s => s.Id.Equals(request.SquadRequest.AddUnits.SquadId))
                            .AddUnit(addedUnit);
                        }
                    }
                }
                if (removeUnits != null)
                {
                    foreach (var tag in removeUnits.Tags)
                    {
                        if (_intel.TryGet(tag, out var removedUnit))
                        {
                            _repository.Get().First(s => s.Id.Equals(request.SquadRequest.RemoveUnits.SquadId))
                            .RemoveUnit(removedUnit);
                        }
                    }
                }
                if (createSquad != null)
                {
                    _repository.Create(createSquad.Squad.Name, createSquad.Squad.SquadId);
                }
                if (removeSquad != null)
                {
                    _repository.Remove(removeSquad.SquadId);
                }
                break;

            default:
                throw new System.NotImplementedException();
            }
        }