private bool checkHit(PCar self, PTire tire)
        {
            double selfRadius  = 0.5 * Math.Sqrt(game.CarWidth * game.CarWidth + game.CarHeight * game.CarHeight);
            double checkRadius = selfRadius + game.TireRadius;

            self.setEnginePower(1);
            MoveToAngleFunction mover = new MoveToAngleFunction(new Vector(path[0].DirOut.X, path[0].DirOut.Y).Angle);

            for (int i = 0; i < MaxCheckTicks; i++)
            {
                Vector lastDistance = tire.LastPos - self.LastPos;
                Vector distance     = tire.Pos - self.Pos;

                if (lastDistance.Length > checkRadius && distance.Length < checkRadius)
                {
                    return(true);
                }

                tire.Iteration(1);
                mover.Iteration(self, 1);
            }

            return(false);
        }
        private bool isRunTire(PCar self, PCar[] their, PCar[] enemies)
        {
            Logger.instance.Assert(null != self, "Self car is null.");

            PCar ignored = self;

            PTire tire = new PTire(self.Pos, self.Dir * game.TireInitialSpeed, game);

            int tireRebound = maxTireRebound;

            for (int i = 0; i < tireCalculateTicks; i++)
            {
                tire.Iteration(1);

                foreach (PCar physicCar in their)
                {
                    physicCar.Iteration(1);

                    Vector collisionNormal = null;
                    if (tireCollisionWithCar(tire.Pos, physicCar, out collisionNormal, 2))
                    {
                        if (ignored == physicCar)
                        {
                            continue;
                        }

                        return(false);
                    }
                }

                foreach (PCar physicCar in enemies)
                {
                    physicCar.Iteration(1);

                    Vector collisionNormal = null;
                    if (tireCollisionWithCar(tire.Pos, physicCar, out collisionNormal, 0.25))
                    {
                        if (null == collisionNormal)
                        {
                            return(false);
                        }

                        double angleDot         = Math.Abs(tire.Speed.Normalize().Dot(collisionNormal));
                        double angleCross       = Math.Abs(tire.Speed.Normalize().Cross(collisionNormal));
                        bool   correctFireAngle = (Math.Abs(tire.Speed.Dot(physicCar.Speed)) > 70 && angleDot > 0.5) ||
                                                  (Math.Abs(tire.Speed.Cross(physicCar.Speed)) > 70 && angleCross > 0.5);
                        return(correctFireAngle && physicCar.Car.Durability > 1.0e-9 && !physicCar.Car.IsFinishedTrack);
                    }
                }

                Vector collisionNormalWithMap = tireCollisionWithMap(tire.Pos, tire.LastPos);
                if (null != collisionNormalWithMap)
                {
                    ignored = null;
                    tire.HitTireWitMap(collisionNormalWithMap);
                    tireRebound--;
                }

                if (!tire.Valid() || tireRebound < 0)
                {
                    return(false);
                }
            }

            return(false);
        }