void Initialize() { if (!Const.Initialized) { Const.Initialized = true; Const.TileSize = Const.Game.TrackTileSize; Const.TileMargin = Const.Game.TrackTileMargin; Const.CarDiagonalHalfLength = Geom.Gypot(Const.Game.CarWidth, Const.Game.CarHeight) / 2; Const.BonusDiagonalHalfLength = Geom.Gypot(Const.Game.BonusSize / 2 - MagicConst.BonusSafeMargin, Const.Game.BonusSize / 2 - MagicConst.BonusSafeMargin); Const.MapWidth = Const.TileSize * world.Width; Const.MapHeight = Const.TileSize * world.Height; } Teammate = world.Cars.FirstOrDefault(car => car.IsTeammate && car.Id != self.Id); ComputedPath.Remove(self.Id); if (Teammate != null) TeammateCar = ComputedPath.ContainsKey(Teammate.Id) ? ComputedPath[Teammate.Id] : null; if (Players == null) // check for first call { MyTiles = new ATile[world.Height, world.Width]; for (var i = 0; i < world.Height; i++) for (var j = 0; j < world.Width; j++) MyTiles[i, j] = new ATile(i, j, TileType.Unknown); } // intialize tiles var t = world.TilesXY; for (var i = 0; i < world.Height; i++) { for (var j = 0; j < world.Width; j++) { if (MyTiles[i, j].Type == TileType.Unknown && t[j][i] != TileType.Unknown) MyTiles[i, j] = new ATile(i, j, t[j][i]); MyTiles[i, j].Weight = 0; } } // intialize waypoints var wp = world.Waypoints; Waypoints = new Cell[wp.Length]; for(var i = 0; i < Waypoints.Length; i++) Waypoints[i] = new Cell(wp[i][1], wp[i][0]); Players = new Dictionary<long, Player>(); foreach (var player in world.Players) Players[player.Id] = player; foreach (var car in world.Cars) { DurabilityObserver.Watch(car); } var tires = world.Projectiles.Where(x => x.Type == ProjectileType.Tire).ToArray(); Tires = new AProjectile[tires.Length][]; #if DEBUG var trajectories = Tires.Select(x => new Points()).ToArray(); #endif for (var i = 0; i < tires.Length; i++) { Tires[i] = new AProjectile[MagicConst.ProjectilePredictionTicks]; Tires[i][0] = new AProjectile(tires[i]); for (var j = 1; j < MagicConst.ProjectilePredictionTicks; j++) { Tires[i][j] = Tires[i][j - 1].Clone(); Tires[i][j].Move(); #if DEBUG trajectories[i].Add(new Point(Tires[i][j])); #endif } } #if DEBUG foreach (var tr in trajectories) Visualizer.SegmentsDrawQueue.Add(new object[] {Brushes.Indigo, tr, 0.0}); #endif Bonuses = world.Bonuses.Select(b => new ABonus(b)).ToArray(); OilSlicks = world.OilSlicks.Select(s => new AOilSlick(s)).ToArray(); EnumerateNeigbours(GetCell(self), to => { var center = GetCenter(to); MyTiles[to.I, to.J].Weight += Math.Abs(self.GetAngleTo(center.X, center.Y)); }); foreach (var bonus in Bonuses) { var cell = GetCell(bonus); MyTiles[cell.I, cell.J].AddBonus(bonus); } foreach (var slick in OilSlicks) { var cell = GetCell(slick); MyTiles[cell.I, cell.J].AddSlick(slick); } Opponents = world.Cars.Where(car => !car.IsTeammate && !car.IsFinishedTrack).ToArray(); PrepareOpponentsPath(); if (OpponentsCars != null) Others = OpponentsCars .Concat(TeammateCar == null ? new ACar[][] { } : new[] { TeammateCar }) .ToArray(); ComputedPath.Clear(); if (self.TeammateIndex == 1 && OpponentsCars != null) { foreach (var opp in OpponentsCars) ComputedPath[opp[0].Original.Id] = opp; } }
void Initialize() { if (!Const.Initialized) { Const.Initialized = true; Const.TileSize = Const.Game.TrackTileSize; Const.TileMargin = Const.Game.TrackTileMargin; Const.CarDiagonalHalfLength = Geom.Gypot(Const.Game.CarWidth, Const.Game.CarHeight) / 2; Const.BonusDiagonalHalfLength = Geom.Gypot(Const.Game.BonusSize / 2 - MagicConst.BonusSafeMargin, Const.Game.BonusSize / 2 - MagicConst.BonusSafeMargin); Const.MapWidth = Const.TileSize * world.Width; Const.MapHeight = Const.TileSize * world.Height; } Teammate = world.Cars.FirstOrDefault(car => car.IsTeammate && car.Id != self.Id); ComputedPath.Remove(self.Id); if (Teammate != null) { TeammateCar = ComputedPath.ContainsKey(Teammate.Id) ? ComputedPath[Teammate.Id] : null; } if (Players == null) // check for first call { MyTiles = new ATile[world.Height, world.Width]; for (var i = 0; i < world.Height; i++) { for (var j = 0; j < world.Width; j++) { MyTiles[i, j] = new ATile(i, j, TileType.Unknown); } } } // intialize tiles var t = world.TilesXY; for (var i = 0; i < world.Height; i++) { for (var j = 0; j < world.Width; j++) { if (MyTiles[i, j].Type == TileType.Unknown && t[j][i] != TileType.Unknown) { MyTiles[i, j] = new ATile(i, j, t[j][i]); } MyTiles[i, j].Weight = 0; } } // intialize waypoints var wp = world.Waypoints; Waypoints = new Cell[wp.Length]; for (var i = 0; i < Waypoints.Length; i++) { Waypoints[i] = new Cell(wp[i][1], wp[i][0]); } Players = new Dictionary <long, Player>(); foreach (var player in world.Players) { Players[player.Id] = player; } foreach (var car in world.Cars) { DurabilityObserver.Watch(car); } var tires = world.Projectiles.Where(x => x.Type == ProjectileType.Tire).ToArray(); Tires = new AProjectile[tires.Length][]; #if DEBUG var trajectories = Tires.Select(x => new Points()).ToArray(); #endif for (var i = 0; i < tires.Length; i++) { Tires[i] = new AProjectile[MagicConst.ProjectilePredictionTicks]; Tires[i][0] = new AProjectile(tires[i]); for (var j = 1; j < MagicConst.ProjectilePredictionTicks; j++) { Tires[i][j] = Tires[i][j - 1].Clone(); Tires[i][j].Move(); #if DEBUG trajectories[i].Add(new Point(Tires[i][j])); #endif } } #if DEBUG foreach (var tr in trajectories) { Visualizer.SegmentsDrawQueue.Add(new object[] { Brushes.Indigo, tr, 0.0 }); } #endif Bonuses = world.Bonuses.Select(b => new ABonus(b)).ToArray(); OilSlicks = world.OilSlicks.Select(s => new AOilSlick(s)).ToArray(); EnumerateNeigbours(GetCell(self), to => { var center = GetCenter(to); MyTiles[to.I, to.J].Weight += Math.Abs(self.GetAngleTo(center.X, center.Y)); }); foreach (var bonus in Bonuses) { var cell = GetCell(bonus); MyTiles[cell.I, cell.J].AddBonus(bonus); } foreach (var slick in OilSlicks) { var cell = GetCell(slick); MyTiles[cell.I, cell.J].AddSlick(slick); } Opponents = world.Cars.Where(car => !car.IsTeammate && !car.IsFinishedTrack).ToArray(); PrepareOpponentsPath(); if (OpponentsCars != null) { Others = OpponentsCars .Concat(TeammateCar == null ? new ACar[][] { } : new[] { TeammateCar }) .ToArray(); } ComputedPath.Clear(); if (self.TeammateIndex == 1 && OpponentsCars != null) { foreach (var opp in OpponentsCars) { ComputedPath[opp[0].Original.Id] = opp; } } }