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; }
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; }
//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; }
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); }
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; } }
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))); } } }