public void Reset()
 {
     _count        = Random.Range(_minCount, _maxCount + 1);
     _isNextCar    = _isNextPuddle = false;
     _carBuffer    = null;
     _puddleBuffer = null;
     _i            = 0;
 }
    public void GenerateBlock(LinkedList <IDescriptorWithID> list)
    {
        if (_i == 0)
        {
            CarDescriptor car = null;
            foreach (var e in list)
            {
                var descriptor = e as CarDescriptor;
                if (descriptor != null && (car == null || car.Position.y < descriptor.Position.y))
                {
                    car = descriptor;
                }
            }
            list.Clear();
            car.Position.y += Random.Range(_ss.MinCarGap, _ss.MaxJumpDistance * MaxDistanceMultiplier) +
                              Vehicle.LengthStatic(car.Size);
            _carBuffer = new SlidingCarDescriptor(car.Position, (car.Velocity + _ss.NormalCarSpeed) / 2, _minAngle,
                                                  _maxAngle, _minSideSpeed, _maxSideSpeed, true);
            list.AddLast(_carBuffer);
            ++_i;
        }
        else
        {
            list.Clear();
            if (_isNextCar)
            {
                Vector2 pos = _carBuffer.Position;
                pos.x  = _ss.Road.LinePosXFromNum(Random.Range(0, _ss.Road.LinesCount));
                pos.y += Random.Range(_ss.MinCarGap, _ss.MaxJumpDistance * MaxDistanceMultiplier) +
                         Vehicle.LengthStatic();
                _carBuffer = new SlidingCarDescriptor(pos, _ss.NormalCarSpeed, _minAngle, _maxAngle,
                                                      _minSideSpeed, _maxSideSpeed, _i < InitialCarsCount);
                list.AddLast(_carBuffer);
                _isNextCar = false;
                ++_i;
            }

            if (_isNextPuddle)
            {
                _puddleBuffer = new OilPuddleDescriptor(
                    new Vector2(_ss.Road.MiddlePosition, _puddleBuffer.Position.y + _puddleBuffer.Length),
                    PuddleLength, _ss.Road.Width,
                    _i < _count ? OilPuddleDescriptor.PosState.Transitional : OilPuddleDescriptor.PosState.Last);
                list.AddFirst(_puddleBuffer);
                _isNextPuddle = false;
            }
            else if (_i - 1 == InitialCarsCount)
            {
                _puddleBuffer = new OilPuddleDescriptor(
                    new Vector2(_ss.Road.MiddlePosition, _carBuffer.Position.y + PuddleLength / 2),
                    PuddleLength, _ss.Road.Width, OilPuddleDescriptor.PosState.First);
                list.AddFirst(_puddleBuffer);
            }

            //todo декорацию масловоза + len?
            if (_i == _count)
            {
                var carY = ((CarDescriptor)list.Last.Value).Position.y;
                while (_puddleBuffer.Position.y + _puddleBuffer.Length / 2 - carY < _ss.MaxJumpDistance)
                {
                    _puddleBuffer             = _puddleBuffer.Clone();
                    _puddleBuffer.Position.y += _puddleBuffer.Length;
                    list.AddLast(_puddleBuffer);
                }
                _puddleBuffer.State = OilPuddleDescriptor.PosState.Last;

                list.AddLast(new OilEndDescriptor(new Vector2(_ss.Road.MiddlePosition,
                                                              _puddleBuffer.Position.y + _puddleBuffer.Length / 2)));
            }
        }
    }