public MoveCommand(float x, float y) { X = x; Y = y; Position = new Flattiverse.Vector(x, y); }
internal void TempSetup(Flattiverse.Ship ship, Mapping.Units.PlayerShipMapUnit playerShipMapUnit) { Direction = Position - playerShipMapUnit.PositionInternal; Direction = Direction + playerShipMapUnit.MovementInternal; Time = (1 + (int)(Direction.Length / ship.WeaponShot.Speed.Limit * 0.99f)); if (Time > ship.WeaponShot.Time.Limit) { Time = (int)(ship.WeaponShot.Time.Limit * 0.99f); } Direction.Length /= Time; if (Direction > ship.WeaponShot.Speed.Limit * 0.99f) { Direction.Length = ship.WeaponShot.Speed.Limit * 0.99f; } Load = ship.WeaponShot.Load.Limit * 0.85f; DamageHull = ship.WeaponShot.DamageHull.Limit * 0.95f; DamageShield = ship.WeaponShot.DamageShield.Limit * 0.75f; DamageEnergy = ship.WeaponShot.DamageEnergy.Limit * 0.75f; }
/// <summary> /// /// </summary> protected override void move() { try { if (lastMoveCommand != null && (lastMoveCommand.Position - playerShipMapUnit.PositionInternal) < NeededTileSize) { lastMoveCommand.Reached = true; } lock (syncMoveCommands) { if (userMoveCommands.Count > 0) { lastMoveCommand = userMoveCommands.Dequeue(); // TODO: Wäre vielleicht besser das direkt in der move Funktion zu machen, dass nicht immer ein neuer Pathfinder erzeugt wird //MapPathfinder = currentMap.GetPathFinder(NeededTileSize); //pathfindingMoveCommands = MapPathfinder.Pathfind(playerShipMapUnit.Position, lastMoveCommand.Position); //lastMoveCommand = null; } if ((lastMoveCommand == null || lastMoveCommand.Reached) && pathfindingMoveCommands != null && pathfindingMoveCommands.Count > 0) { lastMoveCommand = pathfindingMoveCommands.First.Value; pathfindingMoveCommands.RemoveFirst(); lastMoveCommand.DontStop = pathfindingMoveCommands.Count > 0; } } if (lastMoveCommand == null) { lastMoveCommand = new MoveCommand(playerShipMapUnit.PositionInternal.X, playerShipMapUnit.PositionInternal.Y); } movement = lastMoveCommand.Position - playerShipMapUnit.PositionInternal; if (movement < 250f && !lastMoveCommand.DontStop) { movement.Length = ship.EngineAcceleration.Limit * movement.Length; movement = movement - playerShipMapUnit.MovementInternal; if (movement > ship.EngineAcceleration.Limit * 0.99f) { movement.Length = ship.EngineAcceleration.Limit * 0.99f; } } else { if (expectedPosition != null && (expectedPosition - playerShipMapUnit.PositionInternal) > 1f) { movement = movement + (expectedPosition - playerShipMapUnit.PositionInternal); //if (movement > ship.EngineAcceleration.Limit * 0.99f) // movement.Length = ship.EngineAcceleration.Limit * 0.99f; } movement.Length = ship.EngineAcceleration.Limit * 0.99f; } ship.Move(movement); expectedPosition = playerShipMapUnit.PositionInternal + movement; } catch (Exception ex) { Debug.WriteLine($"{ship.Name}: Move Exception"); Debug.WriteLine(ex.Message); userMoveCommands.Clear(); lastMoveCommand = null; pathfindingMoveCommands = null; } finally { MoveWaiter.Set(); } }
/// <summary> /// Performs a scan with the ship /// </summary> protected override void scan() { try { List <Flattiverse.ScanInfo> scanInfos = new List <Flattiverse.ScanInfo>(); int scannerCount = ship.ScannerCount; if (scanReference != null) { // We got a reference point so we scan in that direction with a minimal degree because we know the direction float oneFourthDegree = Math.Min(10f, ship.ScannerDegreePerScan / 4f); scanInfos.Add(new Flattiverse.ScanInfo(scanReference.Angle - oneFourthDegree, scanReference.Angle + oneFourthDegree, ship.ScannerArea.Limit * 0.80f)); --scannerCount; } if (EfficientLoading) { --scannerCount; } for (int i = 0; i < scannerCount; i++) { Flattiverse.ScanInfo scanInfo = new Flattiverse.ScanInfo(currentScanDegree, currentScanDegree + ship.ScannerDegreePerScan, ship.ScannerArea.Limit * 0.90f); currentScanDegree += ship.ScannerDegreePerScan; if (currentScanDegree >= 360f) { currentScanDegree -= 360f; } scanInfos.Add(scanInfo); } List <Flattiverse.Unit> scannedUnits = ship.Scan(scanInfos); scanReference = null; // Get the nearest still unit as reference point for (int i = 0; i < scannedUnits.Count; i++) { if ((scannedUnits[i].Mobility == Flattiverse.Mobility.Still || scannedUnits[i].Mobility == Flattiverse.Mobility.Steady) && scannedUnits[i].Kind != Flattiverse.UnitKind.Explosion && (scanReference == null || scannedUnits[i].Position < scanReference)) { scanReference = scannedUnits[i].Position; } } Map map = Map.Create(this, scannedUnits); map.Updated += Map_MapUpdated; Session.MapManager.Add(map); // Let the map manager process all the scanned info Session.MapManager.WaitMerge(); } catch (Exception ex) { Debug.WriteLine($"{ship.Name}: Scan Exception"); Debug.WriteLine(ex.Message); Debug.WriteLine(ex.StackTrace); //TryContinue(); } finally { ScanWaiter.Set(); } }
/// <summary> /// /// </summary> /// <param name="renderTarget"></param> /// <param name="unitList"></param> private void drawUnits(WindowRenderTarget renderTarget, List <MapUnit> unitList) { for (int i = 0; i < unitList.Count; i++) { MapUnit mapUnit = unitList[i]; SharpDX.Vector2 position = new SharpDX.Vector2(X[mapUnit.Position.X], Y[mapUnit.Position.Y]); float radius = Math.Max(X.Prop(mapUnit.Radius), 0.01f); switch (mapUnit) { case AIBaseMapUnit aiBaseMapUnit: Primitives.Circle.Draw(renderTarget, Brushes.SolidColorBrushes.AIBase, position, radius); Primitives.Circle.Draw(renderTarget, Brushes.SolidColorBrushes.White, position, X.Prop(mapUnit.Radius - 3f)); break; case AIDroneMapUnit aiDroneMapUnit: Primitives.Circle.Draw(renderTarget, Brushes.SolidColorBrushes.AIDrone, position, radius); Primitives.Circle.Draw(renderTarget, Brushes.SolidColorBrushes.White, position, X.Prop(mapUnit.Radius - 3f)); break; case AIPlatformMapUnit aiPlatformMapUnit: Primitives.Circle.Draw(renderTarget, Brushes.SolidColorBrushes.AIPlatform, position, radius); Primitives.Circle.Draw(renderTarget, Brushes.SolidColorBrushes.White, position, X.Prop(mapUnit.Radius - 2f)); break; case AIProbeMapUnit aiProbeMapUnit: Primitives.Circle.Draw(renderTarget, Brushes.SolidColorBrushes.AIProbe, position, radius); Primitives.Circle.Draw(renderTarget, Brushes.SolidColorBrushes.White, position, X.Prop(mapUnit.Radius - 2f)); break; case AIShipMapUnit aiShipMapUnit: Primitives.Circle.Draw(renderTarget, Brushes.SolidColorBrushes.AIShip, position, radius); Primitives.Circle.Draw(renderTarget, Brushes.SolidColorBrushes.White, position, X.Prop(mapUnit.Radius - 2f)); break; case AsteroidMapUnit asteroidMapUnit: Primitives.Circle.Draw(renderTarget, Brushes.SolidColorBrushes.Asteroid, position, radius); break; case BlackHoleMapUnit blackHoleMapUnit: for (int c = 0; c < blackHoleMapUnit.GravityWellInfos.Length; c++) { Primitives.Circle.Draw(renderTarget, Brushes.SolidColorBrushes.BlueViolet, position, X.Prop(blackHoleMapUnit.GravityWellInfos[c].Radius), 1f, dashedStrokeStyle); } Primitives.Circle.Draw(renderTarget, Brushes.SolidColorBrushes.BlackHole, position, radius); break; case BuoyMapUnit buoyMapUnit: Primitives.Circle.Draw(renderTarget, Brushes.SolidColorBrushes.Buoy, position, radius); break; case CloakPowerUpMapUnit cloakPowerUpMapUnit: Primitives.Circle.Fill(renderTarget, Brushes.SolidColorBrushes.CloakPowerUp, position, radius); break; case DoubleDamagePowerUpMapUnit doubleDamagePowerUpMapUnit: Primitives.Circle.Fill(renderTarget, Brushes.SolidColorBrushes.DoubleDamagePowerUp, position, radius); break; case EnergyPowerUpMapUnit energyPowerUpMapUnit: Primitives.Circle.Fill(renderTarget, Brushes.SolidColorBrushes.EnergyPowerUp, position, radius); break; case ExplosionMapUnit explosionMapUnit: Primitives.Circle.Draw(renderTarget, Brushes.SolidColorBrushes.Explosion, position, radius); break; case GateMapUnit gateMapUnit: if (gateMapUnit.Switched) { Primitives.Circle.Draw(renderTarget, Brushes.SolidColorBrushes.Red, position, radius); } else { Primitives.Circle.Draw(renderTarget, Brushes.SolidColorBrushes.Green, position, radius, 1f, dashedStrokeStyle); } break; case HastePowerUpMapUnit hastePowerUpMapUnit: Primitives.Circle.Fill(renderTarget, Brushes.SolidColorBrushes.HastePowerUp, position, radius); break; case HullPowerUpMapUnit hullPowerUpMapUnit: Primitives.Circle.Fill(renderTarget, Brushes.SolidColorBrushes.HullPowerUp, position, radius); break; case IonsPowerUpMapUnit ionsPowerUpMapUnit: Primitives.Circle.Fill(renderTarget, Brushes.SolidColorBrushes.IonsPowerUp, position, radius); break; case MeteoroidMapUnit meteoroidMapUnit: Primitives.Circle.Draw(renderTarget, Brushes.SolidColorBrushes.Meteoroid, position, radius); break; case MissionTargetMapUnit missionTargetMapUnit: SolidColorBrush solidColorBrush; if (missionTargetMapUnit.Team == null || missionTargetMapUnit.Team.Name == "None") { solidColorBrush = missionTargetMapUnit.IsHit ? Brushes.SolidColorBrushes.LimeGreen : Brushes.SolidColorBrushes.Red; } else { solidColorBrush = Brushes.SolidColorBrushes.TeamColors[missionTargetMapUnit.Team.Name]; } Primitives.Circle.Draw(renderTarget, solidColorBrush, position, radius); Primitives.Circle.Draw(renderTarget, solidColorBrush, position, X.Prop(mapUnit.Radius + 3f)); if (missionTargetMapUnit.DominationRadius > 0f) { if (missionTargetMapUnit.Team == null) { Primitives.Circle.Draw(renderTarget, Brushes.SolidColorBrushes.GreenYellow, position, X.Prop(missionTargetMapUnit.DominationRadius)); } else { Primitives.Circle.Draw(renderTarget, Brushes.SolidColorBrushes.TeamColors[missionTargetMapUnit.Team.Name], position, X.Prop(missionTargetMapUnit.DominationRadius), X.Prop(4f)); } if (missionTargetMapUnit.DominatingTeam != null) { Primitives.Circle.Draw(renderTarget, Brushes.SolidColorBrushes.TeamColors[missionTargetMapUnit.DominatingTeam.Name], position, X.Prop(missionTargetMapUnit.DominationRadius - 10f), X.Prop(8f), dashedStrokeStyle); } } else { renderTarget.DrawText( missionTargetMapUnit.Name + " (#" + missionTargetMapUnit.SequenceNumber + ")", missionTargetTextFormat, new SharpDX.Mathematics.Interop.RawRectangleF(position.X, position.Y - X.Prop(20f), position.X + 100f, position.Y + 40f), Brushes.SolidColorBrushes.MissionTarget, DrawTextOptions.NoSnap); foreach (Flattiverse.Vector tempHint in missionTargetMapUnit.Hints) { Flattiverse.Vector hint = tempHint * 20f; renderTarget.DrawLine( new SharpDX.Mathematics.Interop.RawVector2(position.X, position.Y), new SharpDX.Mathematics.Interop.RawVector2(position.X + hint.X, position.Y + hint.Y), Brushes.SolidColorBrushes.White, 2f, dashedStrokeStyle); } } break; case MoonMapUnit moonMapUnit: Primitives.Circle.Draw(renderTarget, Brushes.SolidColorBrushes.Moon, position, radius); break; case NebulaMapUnit nebulaMapUnit: // TODO: Nebula color handling break; case ParticlesPowerUpMapUnit particlesPowerUpMapUnit: Primitives.Circle.Fill(renderTarget, Brushes.SolidColorBrushes.ParticlesPowerUp, position, radius); break; case PixelMapUnit pixelMapUnit: // Skip this for now // Unused anyway break; case PlanetMapUnit planetMapUnit: Primitives.Circle.Draw(renderTarget, Brushes.SolidColorBrushes.Planet, position, radius); break; // TODO: Same handling as playership needed case PlayerBaseMapUnit playerBaseMapUnit: Primitives.Circle.Draw(renderTarget, Brushes.SolidColorBrushes.DarkGreen, position, radius); break; case PlayerDroneMapUnit playerDroneMapUnit: Primitives.Circle.Draw(renderTarget, Brushes.SolidColorBrushes.DarkGreen, position, radius); break; case PlayerPlatformMapUnit playerPlatformMapUnit: break; case PlayerProbeMapUnit playerProbeMapUnit: break; case PlayerShipMapUnit playerShipMapUnit: float penThicknessBars = 2f; using (SharpDX.DirectWrite.TextLayout textLayout = new SharpDX.DirectWrite.TextLayout(parent.DirectWriteFactory, playerShipMapUnit.Name, missionTargetTextFormat, 100f, 20f)) { float halfWidth = textLayout.Metrics.Width / 2f; renderTarget.DrawTextLayout(new SharpDX.Mathematics.Interop.RawVector2(position.X - halfWidth, position.Y + radius + Y.Prop(penThicknessBars + 2f)), textLayout, Brushes.SolidColorBrushes.TeamColors[playerShipMapUnit.TeamName], SharpDX.Direct2D1.DrawTextOptions.NoSnap); } if (playerShipMapUnit.Hull > 0f) { Primitives.Arc.Draw(renderTarget, Brushes.SolidColorBrushes.OrangeRed, position, radius - X.Prop(penThicknessBars), 270f, 360f * playerShipMapUnit.Hull, X.Prop(penThicknessBars)); } if (playerShipMapUnit.Shield > 0.01f) { Primitives.Arc.Draw(renderTarget, Brushes.SolidColorBrushes.CadetBlue, position, radius - X.Prop(penThicknessBars * 3f), 270f, 360f * playerShipMapUnit.Shield, X.Prop(penThicknessBars)); } if (playerShipMapUnit.IsOwnShip) { Primitives.Circle.Draw(renderTarget, Brushes.SolidColorBrushes.LightBlue, position, radius); if (currentShip.Name == playerShipMapUnit.Name) { Primitives.Circle.Draw(renderTarget, Brushes.SolidColorBrushes.Red, position, X.Prop(currentShip.MaxShootRadius)); } #region Health, Energy, Shield if (playerShipMapUnit.Energy > 0f) { Primitives.Arc.Draw(renderTarget, Brushes.SolidColorBrushes.BlueViolet, position, radius - X.Prop(penThicknessBars * 2f), 270f, 360f * playerShipMapUnit.Energy, X.Prop(penThicknessBars)); } float weaponLoadPercentage = playerShipMapUnit.CurrentShots / playerShipMapUnit.MaxShots; weaponLoadPercentage = weaponLoadPercentage < 0.01f ? 0.0f : weaponLoadPercentage; if (weaponLoadPercentage > 0f) { Primitives.Arc.Draw(renderTarget, Brushes.SolidColorBrushes.LightGoldenrodYellow, position, radius + X.Prop(penThicknessBars), 270f, 360f * weaponLoadPercentage, X.Prop(penThicknessBars)); } #endregion } else { Primitives.Circle.Draw(renderTarget, Brushes.SolidColorBrushes.IndianRed, position, radius); } break; case QuadDamagePowerUpMapUnit quadDamagePowerUpMapUnit: Primitives.Circle.Fill(renderTarget, Brushes.SolidColorBrushes.QuadDamagePowerUp, position, radius); break; case ShieldPowerUpMapUnit shieldPowerUpMapUnit: Primitives.Circle.Fill(renderTarget, Brushes.SolidColorBrushes.ShieldPowerUp, position, radius); break; case ShotMapUnit shotMapUnit: Primitives.Circle.Draw(renderTarget, Brushes.SolidColorBrushes.Shot, position, radius); break; case ShotProductionPowerUpMapUnit shotProductionPowerUpMapUnit: Primitives.Circle.Fill(renderTarget, Brushes.SolidColorBrushes.ShotProductionPowerUp, position, radius); break; case SpaceJellyFishMapUnit spaceJellyFishMapUnit: Primitives.Circle.Draw(renderTarget, Brushes.SolidColorBrushes.SpaceJellyFish, position, radius); break; case SpaceJellyFishSlimeMapUnit spaceJellyFishSlimeMapUnit: Primitives.Circle.Draw(renderTarget, Brushes.SolidColorBrushes.SpaceJellyFishSlime, position, radius, 1f, dashedStrokeStyle); break; case StormCommencingWhirlMapUnit stormCommencingWhirlMapUnit: Primitives.Circle.Draw(renderTarget, Brushes.SolidColorBrushes.StormCommencingWhirl, position, radius, 1f, dashedStrokeStyle); break; case StormMapUnit stormMapUnit: Primitives.Circle.Draw(renderTarget, Brushes.SolidColorBrushes.Storm, position, radius); break; case StormWhirlMapUnit stormWhirlMapUnit: Primitives.Circle.Draw(renderTarget, Brushes.SolidColorBrushes.StormWhirl, position, radius); break; case SunMapUnit sunMapUnit: for (int c = 0; c < sunMapUnit.CoronaInfos.Length; c++) { Primitives.Circle.Draw(renderTarget, Brushes.SolidColorBrushes.LightYellow, position, X.Prop(sunMapUnit.CoronaInfos[c].Radius), 1f, dashedStrokeStyle); } Primitives.Circle.Draw(renderTarget, Brushes.SolidColorBrushes.Sun, position, radius); break; case SwitchMapUnit switchMapUnit: if (switchMapUnit.Switched) { Primitives.Circle.Draw(renderTarget, Brushes.SolidColorBrushes.Red, position, radius); } else { Primitives.Circle.Draw(renderTarget, Brushes.SolidColorBrushes.Green, position, radius, 1f, dashedStrokeStyle); } break; case TotalRefreshPowerUpMapUnit totalRefreshPowerUpMapUnit: Primitives.Circle.Draw(renderTarget, Brushes.SolidColorBrushes.TotalRefreshPowerUp, position, radius); break; case UnknownMapUnit unknownMapUnit: Primitives.Circle.Draw(renderTarget, Brushes.SolidColorBrushes.Unknown, position, radius); break; case WormHoleMapUnit wormHoleMapUnit: Primitives.Circle.Draw(renderTarget, Brushes.SolidColorBrushes.WormHole, position, radius); break; default: Primitives.Circle.Draw(renderTarget, Brushes.SolidColorBrushes.White, position, radius); break; } } }
/// <summary> /// /// </summary> /// <param name="windowBounds"></param> /// <param name="renderTarget"></param> public override void Render(Size2F windowBounds, WindowRenderTarget renderTarget) { viewCenterX += (destinationViewCenterX - viewCenterX) / 5f; viewCenterY += (destinationViewCenterY - viewCenterY) / 5f; RectangleF sourceRect; Map map = null; PlayerShipMapUnit shipUnit = null; if (currentShip != null && currentShip.IsAlive && mapManager.TryGetPlayerUnit(currentShip.Universe.Name, currentShip.Name, out map, out shipUnit)) { sourceRect = getSourceRectangleF(shipUnit.Position.X, shipUnit.Position.Y, scale, windowBounds.Width, windowBounds.Height); } else { sourceRect = getSourceRectangleF(viewCenterX, viewCenterY, scale, windowBounds.Width, windowBounds.Height); } X = new Transformator(sourceRect.Left, sourceRect.Right, 0, windowBounds.Width); Y = new Transformator(sourceRect.Top, sourceRect.Bottom, 0, windowBounds.Height); // TODO: Default Universe muss gesetzt werden falls ein Schiff nicht am Leben ist List <MapUnit> unitList; if (((map != null && mapManager.TryGetUnits(map, sourceRect, out unitList)) || mapManager.TryGetUnits(currentShip.Universe.Name, sourceRect, out unitList)) && unitList.Count > 0) { drawUnits(renderTarget, unitList); // TODO: Draw HUD //if (shipUnit != null) //{ // renderTarget.DrawRectangle( // new SharpDX.Mathematics.Interop.RawRectangleF( // windowBounds.Width / 2f - 50f, // windowBounds.Height - 20f, // windowBounds.Width / 2f + 50f, // windowBounds.Height), // Brushes.SolidColorBrushes.White); // renderTarget.FillRectangle( // new SharpDX.Mathematics.Interop.RawRectangleF( // windowBounds.Width / 2f - 49f, // windowBounds.Height - 19f, // (windowBounds.Width / 2f - 49f) + 98f * shipUnit.Energy, // windowBounds.Height - 1f), // Brushes.SolidColorBrushes.Violet); //} // TODO: Temp Klick Position if (currentShip != null && currentShip.IsAlive) { Flattiverse.Vector pos = currentShip.DesiredPosition; if (pos != null) { Primitives.Circle.Fill(renderTarget, Brushes.SolidColorBrushes.White, new SharpDX.Vector2(X[pos.X], Y[pos.Y]), 2f); } } if (showScoreBoard) { scoreBoard.Draw(SCOREBOARD_PADDING, SCOREBOARD_PADDING, windowBounds.Width - SCOREBOARD_PADDING * 2f, windowBounds.Height - SCOREBOARD_PADDING * 2f, renderTarget); } //MapPathfinder mapPathfinder = ship.MapPathfinder; //if (mapPathfinder != null) //{ // MapSectionRaster[] rasters = ship.MapPathfinder.Rasters; // for (int i = 0; i < rasters.Length; i++) // { // MapSectionRasterTile[] tiles = rasters[i].Tiles; // for (int t = 0; t < tiles.Length; t++) // { // var tile = tiles[t]; // if ((tile.Status & MapSectionRasterTileStatus.Blocked) == MapSectionRasterTileStatus.Blocked) // { // SharpDX.Mathematics.Interop.RawRectangleF rectangleF = new SharpDX.Mathematics.Interop.RawRectangleF( // X[tile.X - rasters[i].TileSize / 2f], // Y[tile.Y - rasters[i].TileSize / 2f], // X[tile.X + rasters[i].TileSize / 2f], // Y[tile.Y + rasters[i].TileSize / 2f]); // renderTarget.DrawRectangle(rectangleF, Brushes.SolidColorBrushes.White); // renderTarget.DrawRectangle(rectangleF, Brushes.SolidColorBrushes.RedHalfTransparent); // } // } // } //} } }