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