public ApproacherEngine(SurfacePosition position, IActionEngine prevEngine, IMovementClient client, string owner)
 {
     _position     = position;
     _prevEngine   = prevEngine;
     _client       = client;
     _status       = ApproachStatus.BREAKING;
     _owner        = owner;
     _attemptStart = DateTime.Now;
     _next         = null;
 }
Example #2
0
        public Optional <IActionEngine> ReceiveStatus(StatusUpdateModel model)
        {
            _lastPosition = model.ShipStatus;
            if (_attemptStart.AddSeconds(30) < DateTime.Now)
            {
                return(Optional.From(_prevEngine));
            }

            var location = model.GoldMines.Where(s => s.X == _position.X && s.Y == _position.Y).FirstOrDefault();

            if (_position.Owner == _owner)
            {
                return(Optional.From(_prevEngine));
            }

            if (_lastPosition.XVelocity < 0.01 && _lastPosition.YVelocity < 0.01 && _status == ApproachStatus.BREAKING)
            {
                _status = ApproachStatus.APPROACHING;
                var angle    = CalculateAngle();
                var distance = CalculateDistance();
                _distanceAwayFromBreak = distance;
                _client.Accelerate(angle, 1);
            }
            else if (_status == ApproachStatus.APPROACHING)
            {
                var currDistnace = CalculateDistance();
                if (currDistnace < 100)
                {
                    _client.Break();
                    _status = ApproachStatus.HOMING;
                }
            }
            else if (_status == ApproachStatus.HOMING)
            {
                if (location.Owner == _owner)
                {
                    //we caught it, time to move on
                    return(Optional.From(_prevEngine));
                }
            }
            else
            {
                //still break
                _client.Break();
            }

            return(Optional <IActionEngine> .FromNull());
        }
        public Optional <IActionEngine> ReceiveStatus(StatusUpdateModel model)
        {
            CheckIfOtherMines(model);

            _lastPosition = model.ShipStatus;
            if (_attemptStart.AddSeconds(10) < DateTime.Now)
            {
                return(Optional.From(_prevEngine));
            }

            var location = model.GoldMines.Where(s => s.X == _position.X && s.Y == _position.Y).FirstOrDefault();

            if (location != null && location.Owner == _owner)
            {
                return(Optional.From(_prevEngine));
            }

            if (Math.Abs(_lastPosition.XVelocity) < 0.05 && Math.Abs(_lastPosition.YVelocity) < 0.05 && _status == ApproachStatus.BREAKING)
            {
                _status = ApproachStatus.APPROACHING;
                var angle = CalculateAngle();
                _angle = angle;
                var distance = CalculateDistance();
                _distanceAwayFromBreak = distance;
                _client.Accelerate(angle, 0.7);
            }
            else if (_status == ApproachStatus.APPROACHING)
            {
                _client.Accelerate(_angle, 0.7);
                var currDistnace = CalculateDistance();
                if (currDistnace < 0.35 * _distanceAwayFromBreak)
                {
                    _client.Break();
                    _status = ApproachStatus.HOMING;
                }
            }
            else if (_status == ApproachStatus.HOMING)
            {
                if (location == null)
                {
                    _client.Break();
                    _status = ApproachStatus.APPROACHING;
                }
                if (location != null && location.Owner == _owner)
                {
                    //we caught it, time to move on
                    if (_next != null)
                    {
                        var newApproacher = new ApproacherEngine(_next, _prevEngine, _client, _owner);
                        return(Optional <IActionEngine> .From(newApproacher));
                    }
                    else
                    {
                        return(Optional.From(_prevEngine));
                    }
                }
                else
                {
                    _status = ApproachStatus.APPROACHING;
                    var angle    = CalculateAngle();
                    var distance = CalculateDistance();
                    _distanceAwayFromBreak = distance;
                    _client.Accelerate(angle, 0.7);
                }
            }
            else
            {
                //still break
                _client.Break();
            }

            return(Optional <IActionEngine> .FromNull());
        }