Ejemplo n.º 1
0
    void TickUpdate()
    {
        ComSat.Trace(this, "TickUpdate");
        if (ComSat.EntityExists(target))
        {
            destination = target.position;

            var radius = target.collisionRadius + entity.collisionRadius;
            if ((target.position - entity.position).sqrMagnitude < radius * radius)
            {
                var components = target.GetComponents(typeof(ISabotagable));

                foreach (var c in components)
                {
                    (c as ISabotagable).Sabotage();
                }

                ComSat.DestroyEntity(entity, DestroyReason.HitTarget);
            }
        }
        if (moving)
        {
            if ((destination - entity.position).sqrMagnitude < sqrPositioningAccuracy)
            {
                // Close enough.
                moving = false;
                motor.Stop();
            }
            else
            {
                motor.MoveTowards(destination);
            }
        }
    }
Ejemplo n.º 2
0
    private void PickNewTarget()
    {
        if (targets == null)
        {
            targets = new Entity[] {}
        }
        ;
        targets = targets.Where(t => ComSat.EntityExists(t)).OrderBy(t => (t.position - entity.position).sqrMagnitude).ToArray();
        if (targets.Count() > 0)
        {
            target = targets[0];
            moving = true;
        }
        else
        {
            target = null;
            moving = false;
        }
    }

    void OnDrawGizmosSelected()
    {
        Gizmos.color = Color.red;
        Gizmos.DrawWireSphere(transform.position, detonateRange);

        Gizmos.color = Color.magenta;
        Gizmos.DrawWireSphere(transform.position, explosionRadius);
    }
}
Ejemplo n.º 3
0
    void FireMissile()
    {
        if (missileRecycleDelay > 0)
        {
            return;
        }
        if (missilesLoaded <= 0)
        {
            return;
        }

        missileFireSound.PlayOneShot(missileFireSound.clip);
        ComSat.SpawnEntity(entity, missilePrefab,
                           entity.position, entity.rotation,
                           (Entity ent) => {
            var proj = ent.gameObject.GetComponent <Projectile>();
            if (proj != null && ComSat.EntityExists(combatVehicle.target))
            {
                proj.target = combatVehicle.target;
            }
        });

        missileRecycleDelay = missileRecycleTime;
        missilesLoaded     -= 1;
    }
Ejemplo n.º 4
0
    void Attack(Entity[] targets)
    {
        ComSat.Trace(this, "Attack");
        var validTargets = targets.Where(t => ComSat.EntityExists(t) && t.GetComponent(typeof(ISabotagable)) != null).OrderBy(t => (t.position - entity.position).sqrMagnitude);

        if (!validTargets.Any())
        {
            return;
        }
        target = validTargets.First();
        moving = true;
    }
Ejemplo n.º 5
0
    void TickUpdate()
    {
        ComSat.Trace(this, "TickUpdate");

                if(!powerSink.poweredOn) {
                        target = null;
                        audio.Stop();
                        return;
                }

                if(!ComSat.EntityExists(target)) {
                        // Magic. Destroyed GameObjects compare against null.
                        // Explicitly set to null to avoid keeping it around.
                        target = null;
                        audio.Stop();

                        // Search for victims.
                        target = ComSat.FindEntityWithinRadius(entity.position, attackRange, entity.team);
                        if(target != null) {
                                audio.Play();
                        }
                } else {
                        var dp = target.position - entity.position;

                        DReal targetTurretAngle;

                        var projectileProjectile = projectilePrefab.GetComponent<Projectile>();
                        if(projectileProjectile != null && powerSink.Powered()) {
                                var aimSpot = Utility.PredictShot(entity.position, projectileProjectile.initialSpeed,
                                                                  target.position, target.velocity);
                                targetTurretAngle = DReal.Mod(DVector2.ToAngle(aimSpot - entity.position) - entity.rotation, DReal.TwoPI);
                        } else {
                                targetTurretAngle = DReal.Mod(DVector2.ToAngle(dp) - entity.rotation, DReal.TwoPI);
                        }

                        // Turn turret to point at target.
                        TurnTurret(targetTurretAngle);
                        // Fire when pointing the gun at the target.
                        if(targetTurretAngle == turretRotation) {
                                Fire();
                        }

                        // Stop shooting when out of range.
                        if(dp.sqrMagnitude >= attackRange * attackRange) {
                                audio.Stop();
                                target = null;
                        }
                }

                if(fireDelay > 0) {
                        fireDelay -= ComSat.tickRate;
                }
    }
Ejemplo n.º 6
0
    // (Client)
    void AttackCommand(int team, int entityID, int[] targetIDs)
    {
        targetIDs = targetIDs ?? new int[] {};
        var entity  = EntityFromID(entityID);
        var targets = targetIDs.Select(id => EntityFromID(id)).Where(e => ComSat.EntityExists(e)).ToArray();

        if (entity != null && targets.Any() && entity.team == team)
        {
            Log("{" + tickID + "} " + entity + "[" + entityID + "] attack " + string.Join(", ", targetIDs.Select(x => x.ToString()).ToArray()));
            entity.gameObject.SendMessage("Attack", targets, SendMessageOptions.DontRequireReceiver);
        }
    }
Ejemplo n.º 7
0
 void Update()
 {
     if (combatVehicle.mode == CombatVehicle.Mode.ATTACK && ComSat.EntityExists(combatVehicle.target))
     {
         laser.enabled = true;
         laser.SetPosition(0, laserOrigin.transform.position);
         laser.SetPosition(1, combatVehicle.target.transform.position);
     }
     else
     {
         laser.enabled = false;
     }
 }
Ejemplo n.º 8
0
    DReal barrelRecycleTime = 2;            // Delay before refiring one barrel.

    void FireOneBarrel(int sign)
    {
        audio.PlayOneShot(audio.clip);
        ComSat.SpawnEntity(entity, projectilePrefab,
                           entity.position, entity.rotation,
                           (Entity ent) => {
            var proj = ent.gameObject.GetComponent <Projectile>();
            if (proj != null && ComSat.EntityExists(combatVehicle.target))
            {
                proj.target = combatVehicle.target;
            }
        });
    }
Ejemplo n.º 9
0
    private void PickNewTarget()
    {
        if (targets == null)
        {
            targets = new Entity[] {}
        }
        ;
        targets = targets.Where(t => ComSat.EntityExists(t)).OrderBy(t => (t.position - entity.position).sqrMagnitude).ToArray();
        target  = targets.FirstOrDefault();
        if (target != null)
        {
            motor.Move(target.position);
        }
    }
}
Ejemplo n.º 10
0
 void FireOneBarrel(int sign, GameObject barrel)
 {
     if (ComSat.RateLimit())
     {
         barrel.SendMessage("Fire");
     }
     ComSat.SpawnEntity(entity, projectilePrefab,
                        entity.position, entity.rotation + turretRotation,
                        (Entity ent) => {
         var proj = ent.gameObject.GetComponent <Projectile>();
         if (proj != null && ComSat.EntityExists(combatVehicle.target))
         {
             proj.target = combatVehicle.target;
         }
     });
 }
Ejemplo n.º 11
0
 void TickUpdate()
 {
     if (!ComSat.EntityExists(target))
     {
         PickNewTarget();
     }
     if (target == null)
     {
         return;
     }
     if ((target.position - entity.position).sqrMagnitude < 4 + target.collisionRadius * target.collisionRadius && damageDelay-- <= 0)
     {
         target.Damage(1);
         damageDelay = 3;
     }
 }
Ejemplo n.º 12
0
    void Fire()
    {
        if(fireDelay > 0) {
                        return;
                }

                fireDelay = barrelRecycleTime;
                ComSat.SpawnEntity(entity, projectilePrefab,
                                   entity.position, entity.rotation + turretRotation,
                                   (Entity ent) => {
                                           var proj = ent.gameObject.GetComponent<Projectile>();
                                           if(proj != null && ComSat.EntityExists(target)) {
                                                   proj.target = target;
                                           }
                                   });
                turretBarrel.SendMessage("Fire");
    }
Ejemplo n.º 13
0
    void TickUpdate()
    {
        ComSat.Trace(this, "TickUpdate");
        if (ComSat.EntityExists(target))
        {
            var dir         = target.position - entity.position;     // also vector to dest.
            var targetAngle = DVector2.ToAngle(dir);
            var baseAngle   = Utility.CalculateNewAngle(entity.rotation, targetAngle, DReal.Radians(turnSpeed));
            entity.rotation = baseAngle;
        }
        entity.velocity = DVector2.FromAngle(entity.rotation) * speed;
        DVector2 newPosition = entity.position + entity.velocity * ComSat.tickRate;

        // FIXME: this should do something to account for hitting fast-moving projectiles.
        DVector2 hitPosition;
        Entity   hit = ComSat.LineCast(entity.position, newPosition, out hitPosition, entity.team);

        if (hit != null && (!hit.hitOnlyIfTargetted || hit == target))
        {
            hit.Damage((int)ComputeDamage());

            var position = new Vector3((float)hitPosition.y, 0, (float)hitPosition.x);
            var rotation = Quaternion.AngleAxis((float)entity.rotation, Vector3.up);
            if (impactPrefab != null && ComSat.RateLimit())
            {
                ObjectPool.Instantiate(impactPrefab, position, rotation);
            }

            //if(trail) {
            //        trail.transform.parent = null;
            //        trail.autodestruct = true;
            //        trail = null;
            //}

            if (!penetrates || speed < minPenetrationSpeed)
            {
                ComSat.DestroyEntity(entity, DestroyReason.HitTarget);
                return;
            }
            else
            {
                speed -= penetrationSpeedReduction;
            }
        }
    }
Ejemplo n.º 14
0
    void FireGun()
    {
        if (gunRecycleDelay > 0)
        {
            return;
        }

        ComSat.SpawnEntity(entity, gunPrefab,
                           entity.position, entity.rotation,
                           (Entity ent) => {
            var proj = ent.gameObject.GetComponent <Projectile>();
            if (proj != null && ComSat.EntityExists(combatVehicle.target))
            {
                proj.target = combatVehicle.target;
            }
        });

        gunRecycleDelay = gunRecycleTime;
    }
Ejemplo n.º 15
0
    void TickUpdate()
    {
        for (int i = 0; i < teamPowerSupply.Length; i++)
        {
            teamPowerSupply[i] = 0;
            teamPowerUse[i]    = 0;
        }

        sinks.RemoveAll(s => !ComSat.EntityExists(s.e));
        sources.RemoveAll(s => !ComSat.EntityExists(s.e));

        foreach (var s in sinks)
        {
            if (s.thing.poweredOn)
            {
                teamPowerUse[s.e.team] += s.thing.powerUsage;
            }
        }
        foreach (var s in sources)
        {
            teamPowerSupply[s.e.team] += s.thing.currentPower;
        }
    }
Ejemplo n.º 16
0
    void Fire()
    {
        if (fireDelayTime > 0)
        {
            return;
        }
        // Fire left.
        fireDelayTime = barrelRecycleTime;

        if (ComSat.RateLimit())
        {
            barrel.SendMessage("Fire");
        }
        ComSat.SpawnEntity(entity, combatVehicle.projectilePrefab,
                           entity.position, entity.rotation + turretRotation,
                           (Entity ent) => {
            var proj = ent.gameObject.GetComponent <Projectile>();
            if (proj != null && ComSat.EntityExists(combatVehicle.target))
            {
                proj.target = combatVehicle.target;
            }
        });
    }
Ejemplo n.º 17
0
 void TickUpdate()
 {
     ComSat.Trace(this, "TickUpdate");
     if (ComSat.EntityExists(target))
     {
         moving      = true;
         destination = target.position;
         if ((destination - entity.position).sqrMagnitude < detonateRange * detonateRange)
         {
             Detonate();
             return;
         }
     }
     else if (targets != null && targets.Any())
     {
         PickNewTarget();
     }
     if (moving)
     {
         if ((ComSat.RandomValue() % 500) == 0)
         {
             Detonate();
             return;
         }
         if ((destination - entity.position).sqrMagnitude < sqrPositioningAccuracy)
         {
             // Close enough.
             moving = false;
             motor.Stop();
         }
         else
         {
             motor.MoveTowards(destination);
         }
     }
 }
Ejemplo n.º 18
0
    void TickUpdate()
    {
        ComSat.Trace(this, "TickUpdate");

        if (combatVehicle.mode == CombatVehicle.Mode.IDLE)
        {
            combatVehicle.mode        = CombatVehicle.Mode.MOVE;
            combatVehicle.destination = entity.position;
        }

        if (ComSat.EntityExists(combatVehicle.target))
        {
            var dist        = combatVehicle.target.position - entity.position;
            var sqrDist     = dist.sqrMagnitude;
            var targetAngle = DReal.Mod(DVector2.ToAngle(dist), DReal.TwoPI);

            // Get targetAngle within +/- pi of entity.rotation.
            if (targetAngle < entity.rotation - DReal.PI)
            {
                targetAngle += DReal.TwoPI;
            }
            else if (targetAngle > entity.rotation + DReal.PI)
            {
                targetAngle -= DReal.TwoPI;
            }

            if (sqrDist < missileRange * missileRange)
            {
                FireMissile();
            }

            if (sqrDist < gunRange * gunRange && DReal.Abs(entity.rotation - targetAngle) < 1)
            {
                FireGun();
                if (!gunFireSound.isPlaying)
                {
                    gunFireSound.Play();
                }
            }
            else
            {
                gunFireSound.Stop();
            }
        }
        else
        {
            gunFireSound.Stop();
        }

        if (missilesLoaded < maxMissiles)
        {
            if (missileReloadTime <= 0)
            {
                missileReloadTime = missileReloadDelay;
            }
            else
            {
                missileReloadTime -= ComSat.tickRate;
                if (missileReloadTime <= 0)
                {
                    missilesLoaded += 1;
                }
            }
        }

        if (missileRecycleDelay > 0)
        {
            missileRecycleDelay -= ComSat.tickRate;
        }

        if (gunRecycleDelay > 0)
        {
            gunRecycleDelay -= ComSat.tickRate;
        }
    }
Ejemplo n.º 19
0
    private void PickNewTarget()
    {
        if (targets == null)
        {
            targets = new Entity[] {}
        }
        ;
        targets = targets.Where(t => ComSat.EntityExists(t)).OrderBy(t => (t.position - entity.position).sqrMagnitude).ToArray();
        if (targets.Count() > 0)
        {
            target = targets[0];
            mode   = Mode.ATTACK;
        }
        else
        {
            target = null;
            mode   = Mode.IDLE;
        }
    }

    void TickUpdate()
    {
        ComSat.Trace(this, "TickUpdate");
        if (mode == Mode.ATTACK && !ComSat.EntityExists(target))
        {
            PickNewTarget();
            if (!ComSat.EntityExists(target))
            {
                vehicle.Stop();
            }
        }

        if (mode == Mode.ATTACK)
        {
            var distVec = target.position - entity.position;
            var dist    = distVec.magnitude;

            DReal targetTurretAngle;

            var projectileProjectile = projectilePrefab != null?projectilePrefab.GetComponent <Projectile>() : null;

            if (projectileProjectile != null)
            {
                var aimSpot = Utility.PredictShot(entity.position, projectileProjectile.initialSpeed,
                                                  target.position, target.velocity);

                targetTurretAngle = DReal.Mod(DVector2.ToAngle(aimSpot - entity.position) - entity.rotation, DReal.TwoPI);
            }
            else
            {
                targetTurretAngle = DReal.Mod(DVector2.ToAngle(distVec) - entity.rotation, DReal.TwoPI);
            }

            // Turn turret to point at target when close.
            if (dist >= attackRange * 2)
            {
                targetTurretAngle = turretAutoResets ? 0 : turretRotation;
            }
            turretRotation = Utility.CalculateNewAngle(turretRotation, targetTurretAngle, turretTurnSpeed);
            SendMessage("TurnTurret", turretRotation);

            if (dist < attackDistance)
            {
                // Close enough.
                movingToTarget = false;
                vehicle.Stop();
            }
            else if (movingToTarget || (dist >= attackRange))
            {
                movingToTarget = true;
                // Approach target.
                vehicle.MoveTowards(target.position);
            }

            // Fire when in range and pointing the gun at the target.
            if (dist < attackRange && targetTurretAngle == turretRotation)
            {
                SendMessage("Fire");
            }
        }
        else if (mode == Mode.MOVE)
        {
            // Move towards.
            if ((destination - entity.position).sqrMagnitude < sqrPositioningAccuracy)
            {
                // Close enough.
                mode = Mode.IDLE;
                vehicle.Stop();
            }
            else
            {
                vehicle.MoveTowards(destination);
            }
            if (turretAutoResets)
            {
                turretRotation = Utility.CalculateNewAngle(turretRotation, 0, turretTurnSpeed);
                SendMessage("TurnTurret", turretRotation);
            }
        }
        else if (mode == Mode.IDLE)
        {
            vehicle.Stop();
            if (turretAutoResets)
            {
                turretRotation = Utility.CalculateNewAngle(turretRotation, 0, turretTurnSpeed);
                SendMessage("TurnTurret", turretRotation);
            }
        }
    }
}