public static ICelestialObject GenerateNpcShip(GameSession gameSession, int spaceShipClass, int spaceShipType, int standing) { Logger.Debug($"[CelestialObjectsFactory][GenerateNpcShip] Start generate."); var spaceship = gameSession.GetPlayerSpaceShip().ToSpaceship(); Spaceship newCelestialObject = null; switch (spaceShipType) { case 12: newCelestialObject = Fury.Generate(); break; default: break; } if (newCelestialObject != null) { newCelestialObject.PositionX = spaceship.PositionX + Math.Abs(500 + RandomGenerator.GetInteger(-20, 20)); newCelestialObject.PositionY = spaceship.PositionY + Math.Abs(500 + RandomGenerator.GetInteger(-20, 20)); newCelestialObject.Speed = newCelestialObject.MaxSpeed; newCelestialObject.Direction = SpaceMapTools.GetAngleBetweenPoints(newCelestialObject.GetLocation().ToVector2(), spaceship.GetLocation().ToVector2()); } return(newCelestialObject); }
public static List <SpaceMapObjectLocation> Calculate(PointF location, PointF center, double direction, int maxIterations = 500) { const int radius = 30; var result = new List <SpaceMapObjectLocation>(); var orbitInformation = SpaceMapTools.GetRadiusPoint(location, center, radius, direction); var orbitPoint = orbitInformation.StartLocation; var movementRotation = orbitInformation.Rotation; var distance = SpaceMapTools.GetDistance(center, location); if (distance > radius + 2) { var resultApproachMovement = Approach.Calculate(location, orbitPoint, direction, 10); foreach (var objectLocation in resultApproachMovement.Trajectory) { result.Add(objectLocation); } } else { var previousIteration = new SpaceMapObjectLocation { Distance = SpaceMapTools.GetDistance(center, location), Direction = direction, Status = MovementType.Orbit, Coordinates = new PointF(location.X, location.Y) }; result.Add(previousIteration); } // Here we on orbit of celestial object for (var iteration = 0; iteration < 500; iteration++) { var currentIteration = result[result.Count - 1]; distance = SpaceMapTools.GetDistance(center, currentIteration.Coordinates); float speedOrbit = 1; var directionDelta = 0; switch (movementRotation) { case OrbitRotation.Right: speedOrbit = 0.5f; directionDelta = +90; break; case OrbitRotation.Left: speedOrbit = -0.5f; directionDelta = -90; break; } var r = OrbitPrototype.Execute(center.ToVector2(), currentIteration.Coordinates.ToVector2(), speedOrbit, 1); var attackAzimuth = SpaceMapTools.GetAngleBetweenPoints(center.ToVector2(), r) + directionDelta; if (attackAzimuth < 0) { attackAzimuth = 360 + attackAzimuth; } if (attackAzimuth > 360) { attackAzimuth = attackAzimuth - 360; } result.Add(new SpaceMapObjectLocation { Distance = distance, Direction = attackAzimuth, Iteration = result.Count, Coordinates = r.ToPointF() }); } return(result); }
public static List <SpaceMapObjectLocation> CalculateIteration(PointF currentLocation, PointF targetLocation, double direction, double speed, int maxIterations = 2000) { const int agility = 5; var result = new List <SpaceMapObjectLocation>(); // In this case first iteration - start position for calculation. var previousIteration = new SpaceMapObjectLocation { Distance = SpaceMapTools.GetDistance(targetLocation, currentLocation), Direction = direction, Status = MovementType.Default, Coordinates = new PointF(currentLocation.X, currentLocation.Y) }; var currentStepInTurn = speed; for (var iteration = 0; iteration < maxIterations; iteration++) { var location = SpaceMapTools.Move(previousIteration.Coordinates.ToVector2(), 1, previousIteration.Direction); var iterationResult = new SpaceMapObjectLocation { Direction = previousIteration.Direction, Iteration = iteration, Coordinates = location.PointTo, Distance = SpaceMapTools.GetDistance(targetLocation, location.PointTo) }; // 0 - 360 degree var attackAzimuth = SpaceMapTools.GetAngleBetweenPoints(location.PointTo.ToVector2(), targetLocation.ToVector2()); // Turn angle var attackAngle = (int)SpaceMapTools.GetRotateDirection(iterationResult.Direction, attackAzimuth); var currentAgility = 0; if (speed == currentStepInTurn) { currentAgility = agility; } currentStepInTurn++; if (currentStepInTurn > speed) { currentStepInTurn = 0; } switch (attackAngle) { case var _ when attackAngle > 0: // > 0 left turn iterationResult.Direction -= currentAgility; iterationResult.Status = MovementType.Turn; break; case var _ when attackAngle < 0: // < 0 right turn iterationResult.Direction += currentAgility; iterationResult.Status = MovementType.Turn; break; case var _ when attackAngle == 0: // = 0 forward iterationResult.Status = MovementType.Linear; break; } if (iterationResult.Distance >= 2) { result.Add(iterationResult); } else { result.Add(iterationResult); break; } result.Add(iterationResult); previousIteration = iterationResult; } //result.Add(new SpaceMapObjectLocation { ScanRange = 0, Direction = direction, Iteration = result.Count, Coordinates = targetLocation }); return(result); }
public static Result Calculate(PointF currentLocation, PointF targetLocation, double direction, double speed, int maxIterations = 2000) { const int agility = 5; var result = new Result(); // In this case first iteration - start position for calculation. var previousIteration = new SpaceMapObjectLocation { Distance = SpaceMapTools.GetDistance(targetLocation, currentLocation), Direction = direction, Status = MovementType.Default, Coordinates = new PointF(currentLocation.X, currentLocation.Y) }; var currentStepInTurn = speed; for (var iteration = 0; iteration < maxIterations; iteration++) { var location = SpaceMapTools.Move(previousIteration.Coordinates.ToVector2(), 1, previousIteration.Direction); var iterationResult = new SpaceMapObjectLocation { Direction = previousIteration.Direction, Iteration = iteration, Coordinates = location.PointTo, Distance = SpaceMapTools.GetDistance(targetLocation, location.PointTo) }; // 0 - 360 degree var attackAzimuth = SpaceMapTools.GetAngleBetweenPoints(location.PointTo.ToVector2(), targetLocation.ToVector2()); // Turn angle var attackAngle = SpaceMapTools.GetRotateDirection(iterationResult.Direction, attackAzimuth); var currentAgility = 0; if ((int)speed == (int)currentStepInTurn) { currentAgility = agility; if (Math.Abs(attackAngle) < agility) { attackAngle = 0; iterationResult.Direction = attackAzimuth; } } currentStepInTurn++; if (currentStepInTurn > speed) { currentStepInTurn = 0; } switch (attackAngle) { case var _ when attackAngle > 1: // > 0 left turn iterationResult.Direction -= currentAgility; iterationResult.Status = MovementType.Turn; break; case var _ when attackAngle < -1: // < 0 right turn iterationResult.Direction += currentAgility; iterationResult.Status = MovementType.Turn; break; case var _ when attackAngle == 0: // = 0 forward iterationResult.Status = MovementType.Linear; break; case var _ when attackAngle == 1: // = 0 forward iterationResult.Status = MovementType.Linear; break; } if (iterationResult.Distance >= 2) { result.Trajectory.Add(iterationResult); } else { result.Trajectory.Add(iterationResult); break; } iterationResult.Direction = iterationResult.Direction.To360Degrees(); result.Trajectory.Add(iterationResult); previousIteration = iterationResult; if (iterationResult.Status == MovementType.Linear) { var linearIteration = 0; foreach (var points in LinearMovement(iterationResult.Coordinates, targetLocation)) { linearIteration++; result.Trajectory.Add(new SpaceMapObjectLocation { Coordinates = points, Distance = SpaceMapTools.GetDistance(targetLocation, points), Direction = iterationResult.Direction.To360Degrees(), Status = MovementType.Linear, Iteration = iterationResult.Iteration + linearIteration }); } break; } } return(result); }