public override void Shoot() { base.Shoot(); if (_canShoot) { int side = 1; for (int i = 0; i < 2; i++) { GameObject inst = Instantiate(_bulletPrefab, _fireOutputPositions[0].position, _fireOutputPositions[0].rotation); WaveBullet bulletScript = inst.GetComponent <WaveBullet>(); bulletScript.Damage = _damage; bulletScript.MovementSpeed = _bulletSpeed; bulletScript.SideToStart = (Sides)side; side *= -1; } } }
/// <summary> /// Handle the scan event. /// /// Predict whether the enemy has fired. /// Fire a wave bullet atth /// </summary> /// <param name="evnt"></param> /// <inheritdoc/> public override void OnScannedRobot(ScannedRobotEvent evnt) { var name = evnt.Name; var absBearing = evnt.BearingRadians + this.HeadingRadians; int direction = (Math.Sin(evnt.HeadingRadians - absBearing) * evnt.Velocity < 0) ? -1 : 1; // if fighting one-on-one, maintain radar lock if (this.GunHeat < 1.0 && this.Others == 1) { var turn = this.HeadingRadians + evnt.BearingRadians - this.RadarHeadingRadians; this.SetTurnRadarRightRadians(this.radarFactor * Utils.NormalRelativeAngle(turn)); } // get the updated enemy data snapshot var enemyData = new EnemyData() { Name = name, Location = new Point() { X = this.X + Math.Sin(absBearing) * evnt.Distance, Y = this.Y + Math.Cos(absBearing) * evnt.Distance }, Time = evnt.Time, Energy = evnt.Energy, HeadingRadians = evnt.HeadingRadians, BearingRadians = evnt.BearingRadians, Velocity = evnt.Velocity }; // predict whether the enemy has fired a bullet since last scan // skip this step if there are many robots left on the field to avoid noise if (this.Others <= 2) { if (enemies.ContainsKey(name)) { var energyDrop = enemies[name].Energy - enemyData.Energy; if (energyDrop >= 0.1 && energyDrop <= 3) { this.enemyBullets.Add(new WaveBullet() { TargetName = this.Name, StartPoint = enemyData.Location, StartBearing = Utils.NormalRelativeAngle(Math.PI - absBearing), Power = energyDrop, Direction = direction, Time = this.Time }); } } } // update the enemy data this.enemies[name] = enemyData; // process targeting statistics var targetStatistics = this.statistics.GetStatistics(name); // add the enemy data to pattern history for pattern matching targeting //targetStatistics.PatternHistory.Add(enemyData); // fire a wave bullet at the enemy double power = GetFirePower(evnt.Distance); var location = new Point() { X = this.X, Y = this.Y }; var waveBullet = new WaveBullet() { TargetName = name, StartPoint = location, StartBearing = absBearing, Power = power, Direction = direction, Time = this.Time }; enemyData.LastBullet = waveBullet; targetStatistics.WaveBullets.Add(waveBullet); }