public static bool IsObjectInRange(ICelestialObject celestialObject, int distance, PointF point) { var w = Math.Abs(celestialObject.PositionX - point.X); var h = Math.Abs(celestialObject.PositionY - point.Y); return(w < distance && h < distance); }
private static void DrawSpaceship(IScreenInfo screenInfo, ICelestialObject spaceShip) { var screenCoordinates = UITools.ToScreenCoordinates(screenInfo, new PointF(spaceShip.PositionX, spaceShip.PositionY)); var ship = (Spaceship)spaceShip; var color = Color.Black; switch (ship.Classification) { case 200: color = Color.DarkOliveGreen; break; case 201: color = Color.DarkGray; break; case 202: color = Color.DarkRed; break; case 203: color = Color.SeaGreen; break; } screenInfo.GraphicSurface.FillEllipse(new SolidBrush(color), screenCoordinates.X - 2, screenCoordinates.Y - 2, 4, 4); screenInfo.GraphicSurface.DrawEllipse(new Pen(color), screenCoordinates.X - 4, screenCoordinates.Y - 4, 8, 8); }
private void RecalculateGeneralObjectLocation(GameSession gameSession, ICelestialObject celestialObject, EngineSettings settings) { var speedInTick = celestialObject.Speed / settings.UnitsPerSecond; var position = GeometryTools.MoveObject( new PointF(celestialObject.PositionX, celestialObject.PositionY), speedInTick, celestialObject.Direction); if (celestialObject is Missile missile) { var target = gameSession.GetCelestialObject(missile.TargetId).ToSpaceship(); var direction = GeometryTools.Azimuth(target.GetLocation(), missile.GetLocation()); position = GeometryTools.MoveObject(new PointF(celestialObject.PositionX, celestialObject.PositionY), speedInTick, direction); } Logger.Debug($"Object '{celestialObject.Name}' id='{celestialObject.Id}' moved from {celestialObject.GetLocation()} to {position}"); celestialObject.PreviousPositionX = celestialObject.PositionX; celestialObject.PreviousPositionY = celestialObject.PositionY; celestialObject.PositionX = position.X; celestialObject.PositionY = position.Y; }
public void AddCommandOpenFire(ICelestialObject missile) { var playerShip = _gameSession.GetPlayerSpaceShip(); var targetPointInSpace = new PointInSpace { Id = RandomGenerator.GetId(), PositionY = missile.PositionY, PositionX = missile.PositionX, Speed = 0, Direction = 0, Name = "Missile Target", Signature = 1, Classification = (int)CelestialObjectTypes.PointInMap, IsScanned = true }; missile.PositionX = playerShip.PositionX; missile.PositionY = playerShip.PositionY; //missile.OwnerId = playerShip.Id; AddCelestialObject(targetPointInSpace); AddMissile(playerShip, missile); Command(_gameSession.Id, missile.Id, targetPointInSpace.Id, 0, 0, (int)CommandTypes.Fire); }
private void FillControls(Spaceship targetSpaceship, ICelestialObject playerSpaceship) { txtCelestialObjectName.Text = targetSpaceship.Name; var shieldsMax = (int)targetSpaceship.ShieldsMax; var shieldCurrent = (int)targetSpaceship.Shields; crlShields.Maximum = shieldsMax; crlShields.CurrentValue = shieldCurrent; crlShields.Refresh(); if (txtDirection.Text != Math.Round(targetSpaceship.Direction, 2) + "") { txtDirection.Text = Math.Round(targetSpaceship.Direction, 2) + ""; } if (txtSpeed.Text != Math.Round(targetSpaceship.Speed, 2) + "") { txtSpeed.Text = Math.Round(targetSpaceship.Speed, 2) + ""; } if (txtDistance.Text != Math.Round(GeometryTools.Distance(targetSpaceship.GetLocation(), playerSpaceship.GetLocation()), 2) + "") { txtDistance.Text = Math.Round(GeometryTools.Distance(targetSpaceship.GetLocation(), playerSpaceship.GetLocation()), 2) + ""; } }
public static void DrawMissile(ICelestialObject celestialObject, PointF location, Graphics graphics, ScreenParameters screenParameters) { // Convert celestial object coordinates to screen coordinates var screenCoordinates = UI.ToScreenCoordinates(screenParameters, location); graphics.FillEllipse(new SolidBrush(Color.DarkOliveGreen), screenCoordinates.X - 2, screenCoordinates.Y - 2, 4, 4); }
public static void DrawSpaceship(ICelestialObject spaceShip, PointF location, Graphics graphics, ScreenParameters screenParameters) { var screenCoordinates = UI.ToScreenCoordinates(screenParameters, new PointF(location.X, location.Y)); var ship = (Spaceship)spaceShip; var color = Color.Black; switch (ship.Classification) { case 200: color = Color.DarkOliveGreen; break; case 201: color = Color.DarkGray; break; case 202: color = Color.DarkRed; break; case 203: color = Color.SeaGreen; break; } graphics.FillEllipse(new SolidBrush(color), screenCoordinates.X - 2, screenCoordinates.Y - 2, 4, 4); graphics.DrawEllipse(new Pen(color), screenCoordinates.X - 4, screenCoordinates.Y - 4, 8, 8); }
public void Event_SelectCelestialObject(ICelestialObject celestialObject, ICelestialObject spaceship) { if (txtObjectName.InvokeRequired) { RefreshCallback d = Event_SelectCelestialObject; Invoke(d, celestialObject, spaceship); return; } if (celestialObject != null) { txtObjectName.Text = celestialObject.Name; txtObjectClassification.Text = celestialObject.Classification.ToString(); txtDirection.Text = $@"{celestialObject.Direction:N2}%"; txtDistance.Text = $@"{Coordinates.GetDistance(celestialObject.GetLocation(), spaceship.GetLocation()):N2}%"; txtSignature.Text = $@"{celestialObject.Signature:N2}%"; txtSpeed.Text = $@"{celestialObject.Speed:N2}%"; } else { if (SelectedCelestialObject == null) { txtObjectName.Text = @"No Object Selected"; txtObjectClassification.Text = @""; txtDirection.Text = @"???"; txtDistance.Text = @"???"; txtSignature.Text = @"???"; txtSpeed.Text = @"???"; } } }
public void SelectCelestialObject(ICelestialObject celestialObject) { Logger.Info("A celestial object is selected."); _gameSession.SelectedObject = celestialObject.DeepClone(); OnSelectCelestialObject?.Invoke(celestialObject); }
public static void DrawArrow(IScreenInfo screenInfo, ICelestialObject currentObject, Color color, int arrowSize = 4) { var screenCoordinates = UITools.ToScreenCoordinates(screenInfo, new PointF(currentObject.PositionX, currentObject.PositionY)); var endArrowPoint = GeometryTools.MoveObject(screenCoordinates, 12, currentObject.Direction); DrawArrow(screenInfo.GraphicSurface, new SpaceMapVector(screenCoordinates, endArrowPoint, currentObject.Direction), color, arrowSize); }
public static void DrawSpaceshipInformation(ICelestialObject celestialObject, Graphics graphics, ScreenParameters screenParameters) { var screenCoordinates = UI.ToScreenCoordinates(screenParameters, new PointF(celestialObject.PositionX, celestialObject.PositionY)); var drawSpaceshipInformationAngle = 0; var drawSpaceshipInformationShelf = 0; var pen = new Pen(Color.DimGray, 2); if (celestialObject.Direction >= 0 && celestialObject.Direction < 90) { drawSpaceshipInformationAngle = 135; drawSpaceshipInformationShelf = 90; } if (celestialObject.Direction >= 90 && celestialObject.Direction < 180) { drawSpaceshipInformationAngle = 45; drawSpaceshipInformationShelf = 90; } if (celestialObject.Direction >= 180 && celestialObject.Direction < 270) { drawSpaceshipInformationAngle = 135; drawSpaceshipInformationShelf = 90; } if (celestialObject.Direction >= 270 && celestialObject.Direction < 360) { drawSpaceshipInformationAngle = 45; drawSpaceshipInformationShelf = 90; } var footCoordinates = OutlandAreaCommon.Tools.MoveCelestialObjects(screenCoordinates, DrawSpaceshipInformationLenght, drawSpaceshipInformationAngle); graphics.DrawLine(pen, screenCoordinates.X, screenCoordinates.Y, footCoordinates.X, footCoordinates.Y); var shelfCoordinates = OutlandAreaCommon.Tools.MoveCelestialObjects(footCoordinates, DrawSpaceshipInformationShelfLenght, drawSpaceshipInformationShelf); graphics.DrawLine(pen, footCoordinates.X, footCoordinates.Y, shelfCoordinates.X, shelfCoordinates.Y); var pointInformationBase = new PointF(footCoordinates.X + 3, footCoordinates.Y); #region Detail information graphics.FillRectangle(new SolidBrush(Color.Chartreuse), new RectangleF(pointInformationBase.X, pointInformationBase.Y - 13, 10, 10)); using (var font = new Font("Times New Roman", 10, FontStyle.Bold, GraphicsUnit.Pixel)) { graphics.DrawString($"{celestialObject.Name}", font, new SolidBrush(Color.WhiteSmoke), new PointF(pointInformationBase.X + 15, pointInformationBase.Y - 13)); } // TODO: Check size string for draw line length #endregion }
public static bool IsSpaceship(this ICelestialObject celestialObject) { if (celestialObject == null) { return(false); } return(celestialObject.Classification >= 200 && celestialObject.Classification < 299); }
private static void DrawAsteroid(IScreenInfo screenInfo, ICelestialObject spaceShip) { var screenCoordinates = UITools.ToScreenCoordinates(screenInfo, new PointF(spaceShip.PositionX, spaceShip.PositionY)); var color = Color.Gray; screenInfo.GraphicSurface.FillEllipse(new SolidBrush(color), screenCoordinates.X - 2, screenCoordinates.Y - 2, 4, 4); screenInfo.GraphicSurface.DrawEllipse(new Pen(color), screenCoordinates.X - 4, screenCoordinates.Y - 4, 8, 8); }
public static void DrawCelestialObjectCoordinates(ICelestialObject celestialObject, Graphics graphics, ScreenParameters screenParameters) { var screenCoordinates = UI.ToScreenCoordinates(screenParameters, new PointF(celestialObject.PositionX - 25, celestialObject.PositionY + 10)); using (var font = new Font("Times New Roman", 12, FontStyle.Regular, GraphicsUnit.Pixel)) { graphics.DrawString($"({celestialObject.PositionX} : {celestialObject.PositionY})", font, new SolidBrush(Color.DimGray), new PointF(screenCoordinates.X - 15, screenCoordinates.Y)); } }
public void ForceUpdate(ICelestialObject celestialObject) { foreach (var mapObject in _gameSession.SpaceMap.CelestialObjects.Where(mapObject => mapObject.Id == celestialObject.Id)) { mapObject.Direction = celestialObject.Direction; mapObject.PositionY = celestialObject.PositionY; mapObject.PositionX = celestialObject.PositionX; mapObject.Speed = celestialObject.Speed; } }
public GranularObjectInformation(ICelestialObject celestialObject, int drawInterval) { Id = celestialObject.Id; CelestialObject = celestialObject.DeepClone(); WayPoints = Coordinates.GetWayPoints( new PointF(celestialObject.PreviousPositionX, celestialObject.PreviousPositionY), new PointF(celestialObject.PositionX, celestialObject.PositionY), drawInterval); }
private PointF GetTargetLocation(Spaceship targetSpaceship, ICelestialObject missile, double distance) { var firstIterationFlightTime = distance / missile.Speed; var targetSpaceshipNextPoint = Coordinates.MoveObject( targetSpaceship.GetLocation(), (int)(targetSpaceship.Speed * firstIterationFlightTime), targetSpaceship.Direction); return(targetSpaceshipNextPoint); }
private static void DrawMissile(IScreenInfo screenInfo, ICelestialObject celestialObject) { var screenCoordinates = UITools.ToScreenCoordinates(screenInfo, new PointF(celestialObject.PositionX, celestialObject.PositionY)); var missile = celestialObject as Missile; var color = Color.Blue; screenInfo.GraphicSurface.FillEllipse(new SolidBrush(color), screenCoordinates.X - 2, screenCoordinates.Y - 2, 4, 4); screenInfo.GraphicSurface.DrawEllipse(new Pen(color), screenCoordinates.X - 4, screenCoordinates.Y - 4, 8, 8); }
public static void DrawPointInSpace(ICelestialObject celestialObject, ICelestialObject spaceShip, Graphics graphics, ScreenParameters screenParameters) { var screenCoordinates = UI.ToScreenCoordinates(screenParameters, new PointF(celestialObject.PositionX, celestialObject.PositionY)); var radarLinePen = new Pen(Color.FromArgb(60, 60, 60), 1); graphics.DrawLine(radarLinePen, screenCoordinates.X - 15, screenCoordinates.Y, screenCoordinates.X + 15, screenCoordinates.Y); graphics.DrawLine(radarLinePen, screenCoordinates.X, screenCoordinates.Y - 15, screenCoordinates.X, screenCoordinates.Y + 15); graphics.FillEllipse(new SolidBrush(Color.Black), screenCoordinates.X - 5, screenCoordinates.Y - 5, 10, 10); }
//------------------------------------------------------------------------------------ private static void DrawTrajectory(Graphics graphics, ICelestialObject celestialObject, IEnumerable <SpaceMapObjectLocation> results, SortedDictionary <int, GranularObjectInformation> turnMapInformation, int turnStep, Color color, ScreenParameters screenParameters) { var points = new List <PointF>(); var startDrawingPosition = new PointF(-10000, -10000); var initialDrawingPosition = new PointF(-10000, -10000); var iteration = -1; if (celestialObject.Classification == CelestialObjectTypes.Missile.ToInt()) { return; } foreach (var position in results) { var screenCoordinates = UI.ToScreenCoordinates(screenParameters, new PointF(position.Coordinates.X, position.Coordinates.Y)); iteration++; if (iteration == 0) { initialDrawingPosition = new PointF(screenCoordinates.X, screenCoordinates.Y); continue; } if (iteration == 1) { startDrawingPosition = new PointF(screenCoordinates.X, screenCoordinates.Y); } points.Add(new PointF(screenCoordinates.X, screenCoordinates.Y)); } var currentPosition = UI.ToScreenCoordinates(screenParameters, GetCurrentLocation(turnMapInformation, celestialObject, turnStep, screenParameters.DrawInterval)); graphics.DrawLine(new Pen(color) { DashStyle = DashStyle.Dash }, initialDrawingPosition, startDrawingPosition); points.Add(currentPosition); if (points.Count > 2) { graphics.DrawCurve(new Pen(color) { DashStyle = DashStyle.Dash }, points.ToArray()); } }
public static void DrawActiveCelestialObject(ICelestialObject celestialObject, Graphics graphics, ScreenParameters screenParameters) { if (celestialObject == null) { return; } var screenCoordinates = UI.ToScreenCoordinates(screenParameters, new PointF(celestialObject.PositionX, celestialObject.PositionY)); graphics.FillEllipse(new SolidBrush(Color.WhiteSmoke), screenCoordinates.X - 2, screenCoordinates.Y - 2, 4, 4); graphics.FillEllipse(new SolidBrush(Color.WhiteSmoke), screenCoordinates.X - 5, screenCoordinates.Y - 5, 10, 10); }
public static void DrawCelestialObjectDirection(ICelestialObject celestialObject, PointF location, Graphics graphics, ScreenParameters screenParameters) { var screenCoordinates = UI.ToScreenCoordinates(screenParameters, new PointF(location.X, location.Y)); if ((CelestialObjectTypes)celestialObject.Classification == CelestialObjectTypes.Explosion) { return; } var move = SpaceMapTools.Move(screenCoordinates, 8, 6, celestialObject.Direction); SpaceMapGraphics.DrawArrow(graphics, move, Color.DimGray); }
private void MapMouseMove(object sender, MouseEventArgs e) { Logger.Debug(TraceMessage.Execute(this, $"MapMouseMove]")); mouseCoordinates = e.Location; var mouseCoordinatesInternal = OutlandAreaCommon.Tools.ToRelativeCoordinates(e.Location, _screenParameters.Center); var mouseMapCoordinates = OutlandAreaCommon.Tools.ToTacticalMapCoordinates(mouseCoordinatesInternal, _screenParameters.CenterScreenOnMap); var celestialObjectInRange = SessionTools.GetObjectInRange(_gameSession, 15, new PointF(mouseMapCoordinates.X, mouseMapCoordinates.Y)); MouseMoveCelestialObject = celestialObjectInRange?.DeepClone(); }
public void AddCommandAlignTo(ICelestialObject celestialObject) { var playerShip = _gameSession.GetPlayerSpaceShip(); if ((CelestialObjectTypes)celestialObject.Classification == CelestialObjectTypes.PointInMap) { celestialObject.Id = RandomGenerator.GetId(); celestialObject.Name = "Point in space"; celestialObject.Classification = (int)CelestialObjectTypes.PointInMap; AddCelestialObject(celestialObject); } Command(_gameSession.Id, playerShip.Id, celestialObject.Id, 0, 0, (int)CommandTypes.AlignTo); }
public static void DrawLongLine(IScreenInfo screenInfo, ICelestialObject currentObject, Color color) { var screenCoordinates = UITools.ToScreenCoordinates(screenInfo, new PointF(currentObject.PositionX, currentObject.PositionY)); var line = new SpaceMapVector( screenCoordinates, GeometryTools.MoveObject(screenCoordinates, 4000, currentObject.Direction), currentObject.Direction); using var dashedPen = new Pen(color, 2) { DashStyle = DashStyle.DashDot }; screenInfo.GraphicSurface.DrawLine(dashedPen, line.PointFrom.X, line.PointFrom.Y, line.PointTo.X, line.PointTo.Y); }
public void AddMissile(ICelestialObject playerShip, ICelestialObject celestialObject) { var missile = (IMissile)celestialObject; _gameServer.AddCelestialObject( _gameSession.Id, celestialObject.Id, celestialObject.PositionX, celestialObject.PositionY, (int)celestialObject.Direction, celestialObject.Speed, celestialObject.Classification, celestialObject.Name, missile.AmmoId, celestialObject.OwnerId, playerShip.Id); }
private Hashtable EnqueueMovementHistory(ICelestialObject mapCelestialObject, Hashtable allObjectsHistory) { var previousIteration = new SpaceMapObjectLocation { Distance = SpaceMapTools.GetDistance(mapCelestialObject.GetLocation(), mapCelestialObject.GetLocation()), Direction = mapCelestialObject.Direction, Status = MovementType.Linear, Coordinates = mapCelestialObject.GetLocation() }; if (allObjectsHistory.ContainsKey(mapCelestialObject.Id) == false) { // New celestial object in history collection var initialIteration = new SpaceMapObjectLocation { Distance = SpaceMapTools.GetDistance(mapCelestialObject.GetLocation(), mapCelestialObject.GetLocation()), Direction = mapCelestialObject.Direction, Status = MovementType.Linear, Coordinates = Coordinates.MoveObject(mapCelestialObject.GetLocation(), 2000, (mapCelestialObject.Direction - 180).To360Degrees()) }; var initialHistory = new FixedSizedQueue <SpaceMapObjectLocation>(_historyBufferSize); initialHistory.Enqueue(initialIteration); initialHistory.Enqueue(previousIteration); allObjectsHistory.Add(mapCelestialObject.Id, initialHistory); return(allObjectsHistory); } // Add new history point to exist celestial object movement history if (!(allObjectsHistory[mapCelestialObject.Id] is FixedSizedQueue <SpaceMapObjectLocation> currentObjectMovementHistory)) { return(allObjectsHistory); } currentObjectMovementHistory.Enqueue(previousIteration); allObjectsHistory[mapCelestialObject.Id] = currentObjectMovementHistory; return(allObjectsHistory); }
private void RefreshSelectedInfoControl(ICelestialObject celestialObject, SortedDictionary <int, GranularObjectInformation> granularObjectInformations, int i) { if (celestialObject == null) { OnRefreshSelectedCelestialObject?.Invoke(null, null); return; } var location = DrawMapTools.GetCurrentLocation(granularTurnInformation, celestialObject, turnStep, _screenParameters.DrawInterval); var selectedCelestialObject = celestialObject.DeepClone(); selectedCelestialObject.PositionX = location.X; selectedCelestialObject.PositionY = location.Y; OnRefreshSelectedCelestialObject?.Invoke(selectedCelestialObject, _gameSession.GetPlayerSpaceShip()); }
public static void DrawPreTarget(ICelestialObject celestialObject, Graphics graphics, ScreenParameters screenParameters) { var screenCoordinates = UI.ToScreenCoordinates(screenParameters, new PointF(celestialObject.PositionX, celestialObject.PositionY)); var radarLinePen = new Pen(Color.FromArgb(60, 60, 60), 1); graphics.DrawEllipse(radarLinePen, screenCoordinates.X - 12, screenCoordinates.Y - 12, 24, 24); graphics.DrawEllipse(radarLinePen, screenCoordinates.X - 22, screenCoordinates.Y - 22, 44, 44); graphics.DrawEllipse(radarLinePen, screenCoordinates.X - 32, screenCoordinates.Y - 32, 64, 64); graphics.DrawLine(radarLinePen, screenCoordinates.X - 45, screenCoordinates.Y, screenCoordinates.X + 45, screenCoordinates.Y); graphics.DrawLine(radarLinePen, screenCoordinates.X, screenCoordinates.Y - 45, screenCoordinates.X, screenCoordinates.Y + 45); graphics.FillEllipse(new SolidBrush(Color.Black), screenCoordinates.X - 10, screenCoordinates.Y - 10, 20, 20); }
public static void RemoveCelestialObject(this GameSession session, ICelestialObject celestialObject) { if (celestialObject == null) { return; } var result = new List <ICelestialObject>(); foreach (var mapCelestialObject in session.SpaceMap.CelestialObjects) { if (mapCelestialObject.Id != celestialObject.Id) { result.Add(mapCelestialObject); } } session.SpaceMap.CelestialObjects = result; }