public EnemyBot(ScannedRobotEvent ev, EnemyBot previous, double robotX, double robotY, double robotHeading, int hits) { Name = ev.Name; Energy = ev.Energy; Heading = ev.Heading; HeadingRad = ev.HeadingRadians; Time = ev.Time; Bearing = ev.Bearing; Distance = ev.Distance; X = robotX; Y = robotY; Hits = hits; PreviousEntry = previous; Velocity = ev.Velocity; }
public Point GetLastTargetCoordinates(bool tryOptimize = false) { if (TargetEnemyName == null || !KnownEnemies.ContainsKey(TargetEnemyName)) { return(new Point()); } var lastScanStatus = KnownEnemies[TargetEnemyName]; if ((lastScanStatus?.Energy ?? 0) == 0) { lastScanStatus = null; } double?x = LastBulletHit?.Bullet?.X; double?y = LastBulletHit?.Bullet?.Y; if (KnownEnemies.ContainsKey(TargetEnemyName)) { lastScanStatus = KnownEnemies[TargetEnemyName]; if (LastBulletHit == null || lastScanStatus.Time > LastBulletHit.Time) { x = lastScanStatus.X; y = lastScanStatus.Y; } if (tryOptimize) { EnemyBot curEnemy = lastScanStatus; List <EnemyBot> interesting = new List <EnemyBot>(); for (var i = 0; i < 100; i++) { interesting.Add(curEnemy); if (!curEnemy.IsTarget) { break; } if (curEnemy.PreviousEntry == null) { break; } curEnemy = curEnemy.PreviousEntry; } var target = interesting.Select(i => new { Amount = interesting.Count(i2 => BoundCompare(i.X, i2.X, 10) && BoundCompare(i.Y, i2.Y, 10)), X = i.X, Y = i.Y }).ToArray(); if (target.Max(t => t.Amount) > 10) { x = target.OrderByDescending(t => t.Amount).FirstOrDefault()?.X; y = target.OrderByDescending(t => t.Amount).FirstOrDefault()?.Y; } } } return(new Point { X = x ?? 0, Y = y ?? 0 }); }