public ACar(Car original) { X = original.X; Y = original.Y; Speed = new Point(original.SpeedX, original.SpeedY); Angle = original.Angle; EnginePower = original.EnginePower; WheelTurn = original.WheelTurn; AngularSpeed = original.AngularSpeed; Original = original; OutOfMap = false; RemainingNitroTicks = original.RemainingNitroTicks; RemainingNitroCooldownTicks = original.RemainingNitroCooldownTicks; RemainingInactiveTicks = DurabilityObserver.ReactivationTime(original) - MyStrategy.world.Tick; Width = original.Width; Height = original.Height; if (original.Type == CarType.Buggy) { _carAccelerationUp = Const.Game.BuggyEngineForwardPower / original.Mass; _carAccelerationDown = Const.Game.BuggyEngineRearPower / original.Mass; } else { _carAccelerationUp = Const.Game.JeepEngineForwardPower / original.Mass; _carAccelerationDown = Const.Game.JeepEngineRearPower / original.Mass; } }
public bool CheckUseProjectile() { if (world.Tick < Const.Game.InitialFreezeDurationTicks) { return(false); } if (self.ProjectileCount == 0) { return(false); } if (self.RemainingProjectileCooldownTicks > 0) { return(false); } var projectiles = AProjectile.GetProjectiles(new ACar(self)); var shot = new bool[projectiles.Length]; var shotSpeed = 0.0; var checkTicks = MagicConst.OpponentsTicksPrediction * (self.Type == CarType.Buggy ? 0.5 : 0.4); for (var t = 1; t < checkTicks; t++) { for (var prId = 0; prId < projectiles.Length; prId++) { var pr = projectiles[prId]; if (!pr.Exists) { continue; } pr.Move(); for (var i = 0; i < All.Length; i++) { if (t >= All[i].Length) { continue; } var car = All[i][t]; /* * Чужие машинки считать меньшими по размеру * Свои - большими */ if (pr.Intersect(car, car.Original.IsTeammate ? 5 : -(pr.Type == ProjectileType.Tire ? 40 : 5))) { if (pr.Type == ProjectileType.Tire) { // если это я только что выпустил шину if (car.Original.Id == self.Id && Math.Abs(pr.Speed.Length - Const.Game.TireInitialSpeed) < Eps) { continue; } } else { // если это я выпустил шайбу if (car.Original.Id == self.Id) { continue; } } if (car.Original.IsTeammate) // попал в своего { return(false); } if (DurabilityObserver.ReactivationTime(car.Original) + 2 < world.Tick + t || DurabilityObserver.IsActive(car.Original)) { // если он не мертв shot[prId] = true; if (pr.Type == ProjectileType.Tire) { shotSpeed = pr.Speed.Length; } } pr.Exists = false; } } } } var shotCount = shot.Count(val => val); if (self.Type == CarType.Buggy) { return(shotCount >= 3 || shotCount == 2 && self.ProjectileCount > 2); } return(shotCount == 1 && (shotSpeed >= Const.Game.TireInitialSpeed - Eps || shotSpeed >= Const.Game.TireInitialSpeed / 2.5 && self.ProjectileCount > 2)); }