Esempio n. 1
0
    private void Update()
    {
        if (!_gameOn)
        {
            return;
        }

        _cdTimer -= Time.deltaTime;
        if (_cdTimer < 0)
        {
            _buildCtrl.DisassembleAllBelow(_pursuitCtrl.ScreenBottom());
            _cdTimer = DisassembleTime;
        }

        if (_mainProvider.HasMore())
        {
            if (_mainProvider.IsReadyForMore())
            {
                while (_mainProvider.HasNext())
                {
                    Construct(_mainProvider.Next());
                }
            }
        }
        else
        {
            var last = _stuff[_idOfLast].GetComponent <Vehicle>();
            var pos  = new Vector2(last.transform.position.x, last.transform.position.z);
            var scd  = new CarDescriptor(pos, last.Velocity.z, last.Size);
            scd.SetID(_idOfLast);
            _mainProvider.Reset(scd);
        }

        TraveledDistance = _avatar.transform.position.z;
    }
Esempio n. 2
0
    private void Initialize()
    {
        CurrentState = State.Idle;
        _avatarCtrl  = AvatarController.GetInstance();
        _avatar      = _avatarCtrl.Avatar;
        _avatar.OnSuccsefulEating += () => { Score += 1; };
        _avatar.OnDeath           += DeathHandler;
        _buildCtrl = BuildController.GetInstance();
        _buildCtrl.SetMeteorController();
        _taskCtrl                 = TaskController.GetInstance();
        _taskCtrl.Avatar          = _avatar;
        _taskCtrl.TaskCompleted  += (ITask x) => Debug.Log(x);
        DuringDistanceTask.Avatar = _avatar.transform;
        _pursuitCtrl              = PursuitController.GetInstance();
        _pursuitCtrl.AvatarTf     = _avatar.transform;
        _pursuitCtrl.Catched     += CatchedHandler;
        _idGen        = new IDGenerator();
        _stuff        = new SortedDictionary <int, GameObject>();
        _mainProvider = new MultiGeneratorProvider(_stuff, _pursuitCtrl, _idGen);
        _mainProvider.SetIDGenerator(_idGen);
        _firstCarPos  = new Vector2(0, 1);
        _firstCarDesc = new CarDescriptor(_firstCarPos, 0, 1);
        _playStats    = new PlayStatistics();
        _globStats    = GlobalStatistics.GetInstance();
//
        Vehicle.Avatar = _avatar;
        ProjectileGun.SetAvatar(_avatar);
        _isInitialized = true;
    }
Esempio n. 3
0
 //todo front pos
 public void Reset(CarDescriptor enter)
 {
     _generator.UseInitGen = true;
     _generator.Reset();
     _readinessTestHandler = _generator.ReadinessTestHandler ?? DefaultReadinessTest;
     _generator.DescriptorList.Clear();
     _generator.DescriptorList.AddLast(enter);
 }
 public void Reset()
 {
     _count        = Random.Range(_minCount, _maxCount + 1);
     _isNextCar    = _isNextPuddle = false;
     _carBuffer    = null;
     _puddleBuffer = null;
     _i            = 0;
 }
Esempio n. 5
0
    public static CarDescriptor FarthestCar(LinkedList <IDescriptorWithID> list)
    {
        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;
            }
        }
        if (car == null)
        {
            throw new Exception("There is not a carDescriptor in list");
        }
        return(car);
    }
Esempio n. 6
0
    public void GenerateBlock(LinkedList <IDescriptorWithID> list)
    {
        if (_firstNotSecondBlock)
        {
            if (_sandvichProb - Random.Range(0, 1f) <= 0)
            {
                _blockGen.GenerateBlock(list, 0, Random.Range(1, 4));
            }
            else
            {
                _sandvich = true;
                _blockGen.GenerateBlock(list, 0xAF, Random.Range(1, 3));
            }
            _firstNotSecondBlock = false;
        }
        else if (!_third)
        {
            if (!_sandvich)
            {
                byte mask = 0;
                foreach (var car in list)
                {
                    mask |= MaskLine(SS.Road.LineNumFromPosX(((CarDescriptor)car).Position.x));
                }
                _blockGen.GenerateBlock(list, mask, Random.Range(2, 4));
                var           maxVel = list.Max <IDescriptorWithID>((e) => (e as CarDescriptor).Velocity);
                var           polNum = Random.Range(0, list.Count);
                var           i      = list.Count - 1;
                CarDescriptor mem    = null;
                foreach (CarDescriptor car in list)
                {
                    if (i == polNum)
                    {
                        mem = car;
                    }
                    car.Velocity = maxVel;
                    i--;
                }
                list.Remove(mem);
                list.AddLast(new PoliceDescriptor(mem.Position, maxVel, _sideSpeed, _radius));
            }
            else
            {
                _blockGen.GenerateBlock(list, 0xDF, 1);
                CarDescriptor c   = (CarDescriptor)list.First();
                Vector2       pos = c.Position;
                pos.x -= SS.Road.LineWidth * 2;
                list.AddLast(new PoliceDescriptor(pos, c.Velocity, _sideSpeed, _radius));
                pos.x += SS.Road.LineWidth * 4;
                list.AddLast(new PoliceDescriptor(pos, c.Velocity, _sideSpeed, _radius));
            }

            _third = true;
        }
        else
        {
            var node = list.First;
            while (node != null)
            {
                var desc = node.Value;
                node = node.Next;
                if (desc is PoliceDescriptor)
                {
                    list.Remove(desc);
                }
            }
            _blockGen.GenerateBlock(list, 0, Random.Range(1, 4));
            HasMore = false;
        }
    }
Esempio n. 7
0
 public void SetInfo(CarDescriptor itemInfo)
 {
     item = itemInfo;
 }
 public SimpleCar(CarDescriptor desc) : this(desc.Velocity)
 {
 }
    public void GenerateBlock(LinkedList <IDescriptorWithID> list)
    {
        ++_i;

        if (_i > 1 && _i <= _count)
        {
            list.Clear();
            var lines       = _ss.Road.LinesCount;
            var actualCount = 0;
            for (var i = 0; i < lines; ++i)
            {
                if (_isActual[i])
                {
                    ++actualCount;
                }
            }
            var meteorCount = _metAmountDistr.Next();
            meteorCount = meteorCount < actualCount ? meteorCount : actualCount - 1;
            while (meteorCount > 0)
            {
                var i = Random.Range(0, lines);
                if (!_isActual[i])
                {
                    continue;
                }
                _isActual[i] = false;
                var time = Random.Range(_ss.TimeWindow * LowTimeBound, _ss.TimeWindow * TopTimeBound);
                var to   = _lastOnLine[i].Position;
                to.y += _lastOnLine[i].Velocity * time + Vehicle.LengthStatic(_lastOnLine[i].Size) / 2;
                var from = new Vector2(to.x, _launcher.position.z);
                list.AddLast(new MeteorDescriptor(from, to, time));
                --meteorCount;
            }

            float commonLowerBound = 0;
            for (var i = 0; i < lines; ++i)
            {
                var car   = _lastOnLine[i];
                var bound = car.Position.y + Vehicle.LengthStatic(car.Size) + (_isActual[i] ? _ss.MinCarGap : TinyCarGap);
                _lowerBounds[i] = bound;
                if (!_isActual[i])
                {
                    continue;
                }

                _isActual[i] = false;
                if (bound > commonLowerBound)
                {
                    commonLowerBound = bound;
                }
                for (var l = 0; l < lines; ++l)
                {
                    bound = _ss.TopBound(i, l, car.Size) + car.Position.y;
                    if (_topBounds[l] < bound)
                    {
                        _topBounds[l] = bound;
                    }
                }
            }
            for (var i = 0; i < lines; i++)
            {
                if (_lowerBounds[i] < commonLowerBound)
                {
                    _lowerBounds[i] = commonLowerBound;
                }
            }

            var carCount = 0;
            for (var i = 0; i < lines; i++)
            {
                if (_topBounds[i] > _lowerBounds[i])
                {
                    ++carCount;
                }
            }
            if (carCount > _carCountDistr.Next())
            {
                carCount = _carCountDistr.Current;
            }

            do
            {
                var i = Random.Range(0, lines);
                if (_lastOnLine[i].Position.y < _lowerBounds[i] &&
                    _lowerBounds[i] < _topBounds[i])
                {
                    _isActual[i] = true;
                    var pos = new Vector2(_ss.Road.LinePosXFromNum(i),
                                          Random.Range(_lowerBounds[i], _topBounds[i]));
                    _lastOnLine[i] = new CarDescriptor(pos, _ss.NormalCarSpeed, _carSizeDistr.Next());
                    list.AddLast(_lastOnLine[i]);
                    --carCount;
                }
            } while (carCount > 0);
        }
        else if (_i == 1)
        {
            var tmp1 = _ss.MinCarSpeed;
            var tmp2 = _ss.MaxCarSpeed;
            _ss.MinCarSpeed = _ss.NormalCarSpeed * .9f;
            _ss.MinCarSpeed = _ss.NormalCarSpeed * 1.1f;
            _blockGen.GenerateBlock(list);
            _ss.MinCarSpeed = tmp1;
            _ss.MaxCarSpeed = tmp2;
            foreach (CarDescriptor e in list)
            {
                var line = _ss.Road.LineNumFromPosX(e.Position.x);
                _lastOnLine[line] = e;
                _isActual[line]   = true;
            }
        }
    }
    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)));
            }
        }
    }