Exemple #1
0
    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;
            }
        }
    }
Exemple #2
0
        /// <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);
        }