Beispiel #1
0
 protected override void OnDeath()
 {
     if (owner != null && !(owner.Equals(null)) && owner.GetUnitsCommanding().Contains(this))
     {
         owner.GetUnitsCommanding().Remove(this);
     }
     base.OnDeath();
 }
Beispiel #2
0
 /// <summary>
 /// Starts the spawning countdown
 /// </summary>
 public override void Activate()
 {
     if (craft != null && craft.GetUnitsCommanding().Count < craft.GetTotalCommandLimit())
     {
         base.Activate();
     }
     else if (craft is PlayerCore player && craft.GetUnitsCommanding().Count >= craft.GetTotalCommandLimit())
     {
         player.alerter.showMessage("Unit limit reached!", "clip_alert");
     }
 }
Beispiel #3
0
 /// <summary>
 /// Starts the spawning countdown
 /// </summary>
 public override void Activate()
 {
     if (craft != null && craft.GetUnitsCommanding().Count < craft.GetTotalCommandLimit())
     {
         //Core.TakeEnergy(-energyCost); i'm not sure what this line of code does, but it seemed to make drones take energy from the user's max energy instead of their current energy
         base.Activate();
     }
     else if (craft is PlayerCore player && craft.GetUnitsCommanding().Count >= craft.GetTotalCommandLimit())
     {
         player.alerter.showMessage("Unit limit reached!", "clip_alert");
     }
 }
Beispiel #4
0
 /// <summary>
 /// Starts the spawning countdown
 /// </summary>
 public override void Activate()
 {
     if (craft != null && craft.GetUnitsCommanding().Count < craft.GetTotalCommandLimit())
     {
         Core.TakeEnergy(-energyCost);
         base.Activate();
     }
     else if (craft as PlayerCore && craft.GetUnitsCommanding().Count >= craft.GetTotalCommandLimit())
     {
         (craft as PlayerCore).alerter.showMessage("Unit limit reached!", "clip_alert");
     }
 }
Beispiel #5
0
    public void SetOwner(IOwner owner)
    {
        this.owner = owner;
        ai.owner   = owner;
        owner.GetUnitsCommanding().Add(this);
        if (owner as AirCarrier || owner as GroundCarrier)
        {
            // GET THE DRONES TO MOVE
            ai.setMode(AirCraftAI.AIMode.Path);
            var path = ScriptableObject.CreateInstance <Path>();
            path.waypoints = new List <Path.Node>();
            var vec = Vector2.zero;
            if (owner as AirCarrier)
            {
                foreach (var ent in BattleZoneManager.getTargets())
                {
                    if (ent && ent is ICarrier && !FactionManager.IsAllied(ent.faction, owner.GetFaction()) && ent.transform)
                    {
                        vec = ent.transform.position;
                    }
                }
            }
            // otherwise this is a ground carrier, drones are defensive for them so set a path to the drone position currently
            else
            {
                var angle = Random.Range(0F, 360);
                vec = owner.GetTransform().position + new Vector3(5 * Mathf.Sin(angle), 5 * Mathf.Cos(angle));
            }

            // TODO: jank, fix this eventually
            var node = new Path.Node();
            node.position = vec;
            node.ID       = 0;
            node.children = new List <int>();
            if (vec != Vector2.zero)
            {
                path.waypoints.Add(node);
            }
            if (owner as AirCarrier)
            {
                ai.setPath(path);
            }
            else
            {
                NodeEditorFramework.Standard.PathData data = new NodeEditorFramework.Standard.PathData();
                data.waypoints = new List <NodeEditorFramework.Standard.PathData.Node>();
                // TODO: LOL THESE TWO ARE DIFFERENT, unify them
                foreach (var point in path.waypoints)
                {
                    var node2 = new NodeEditorFramework.Standard.PathData.Node();
                    node2.ID       = point.ID;
                    node2.children = point.children;
                    node2.position = point.position;
                    data.waypoints.Add(node2);
                }

                ai.setPath(data, null, true);
            }
        }
    }
Beispiel #6
0
 /// <summary>
 /// Starts the spawning countdown
 /// </summary>
 protected override void Execute()
 {
     if (craft != null && craft.GetUnitsCommanding().Count < craft.GetTotalCommandLimit())
     {
         isActive = true; // set to active
         isOnCD   = true; // set to on cooldown
         ToggleIndicator();
     }
     else
     {
         Core.TakeEnergy(-energyCost);
     }
     if (craft as PlayerCore && craft.GetUnitsCommanding().Count >= craft.GetTotalCommandLimit())
     {
         (craft as PlayerCore).alerter.showMessage("Unit limit reached!", "clip_alert");
     }
 }
    public void Update()
    {
        // TODO: timers & member boolean variables to reduce checks each frame

        if (!useAbilities)
        {
            return;
        }

        if (timer > Time.time)
        {
            return;
        }
        timer = Time.time + interval;

        // Use abilities if needed
        if (!ai.movement.targetIsInRange())
        {
            if (ai.movement.DistanceToTarget > 5f)
            {
                bool allowSpeed = true;
                if (craft.faction == 0 && PlayerCore.Instance != null && !PlayerCore.Instance.GetIsDead() &&
                    ai.movement.GetTarget() != null)
                {
                    // Don't run away or get behind when escorting a player
                    float ownD    = ((Vector2)ai.movement.GetTarget() - (Vector2)craft.transform.position).sqrMagnitude;
                    float playerD = ((Vector2)ai.movement.GetTarget() - (Vector2)PlayerCore.Instance.transform.position).sqrMagnitude;
                    allowSpeed = playerD < ownD;
                }
                if (allowSpeed)
                {
                    var speeds = GetAbilities(1);
                    int half   = Mathf.CeilToInt(speeds.Count() / 2f);
                    int count  = 0;
                    foreach (var booster in speeds)
                    {
                        booster.Activate();
                        if (booster.GetActiveTimeRemaining() > 0)
                        {
                            if (++count >= half)
                            {
                                break;
                            }
                        }
                    }
                }
            }
        }
        if (craft.GetHealth()[0] < craft.GetMaxHealth()[0] * 0.8f)
        {
            var shellBoosts = GetAbilities(2, 17, 26, 29, 30, 31); // shell heal, shell regen, area restore
            foreach (var booster in shellBoosts)
            {
                if (craft.GetHealth()[0] > craft.GetMaxHealth()[0] * 0.9f)
                {
                    break;
                }
                booster.Activate();
            }
        }
        if (craft.GetHealth()[0] < craft.GetMaxHealth()[0] * 0.25f && Time.time > nextStealth)
        {
            var escapeAbilities = GetAbilities(24, 29, 27); // stealth, absorption, pin down
            foreach (var escapeAbility in escapeAbilities)
            {
                escapeAbility.Activate();
                if (escapeAbility.GetActiveTimeRemaining() > 0f)
                {
                    nextStealth = Time.time + escapeAbility.GetActiveTimeRemaining() + 1.0f;
                    break;
                }
            }
        }
        if (craft.GetHealth()[0] < craft.GetMaxHealth()[0] * 0.2f)
        {
            var retreats = GetAbilities(28); // retreat
            foreach (var retreat in retreats)
            {
                bool CD = retreat.TimeUntilReady() > 0f;
                if (!CD)
                {
                    retreat.Activate();
                    if (retreat.TimeUntilReady() > 0f)
                    {
                        break;
                    }
                }
            }
        }
        if (craft.GetHealth()[1] < craft.GetMaxHealth()[1] * 0.5f)
        {
            var core = GetAbilities(11, 31); // core heal & regen
            foreach (var ability in core)
            {
                ability.Activate();
                if (ability.GetActiveTimeRemaining() > 0)
                {
                    break;
                }
            }
        }
        if (craft.GetHealth()[2] < craft.GetMaxHealth()[2] * 0.5f)
        {
            var energy = GetAbilities(12, 32); // energy add & regen
            foreach (var ability in energy)
            {
                ability.Activate();
                if (ability.GetActiveTimeRemaining() > 0)
                {
                    break;
                }
            }
        }
        var target = craft.GetTargetingSystem().GetTarget();

        if (target != null && target)
        {
            Entity targetEntity = target.GetComponent <Entity>();
            if (targetEntity != null && targetEntity && !targetEntity.GetIsDead())
            {
                var damageBoosts = GetAbilities(25, 33); // damage boost, disrupt
                foreach (var damageBoost in damageBoosts)
                {
                    damageBoost.Activate();
                }
                // TODO: use only if the enemy is close enough!
                var pinDown = GetAbilities(27); // pin down
                if (Time.time > nextPin)
                {
                    foreach (var pin in pinDown)
                    {
                        if (pin.GetActiveTimeRemaining() <= 0)
                        {
                            pin.Activate();
                            if (pin.GetActiveTimeRemaining() > 0f)
                            {
                                nextPin = Time.time + pin.GetActiveTimeRemaining() - 1.5f; // 2 sec activation time, leave 0.5 sec for fleeing
                                break;
                            }
                        }
                    }
                }
            }
        }
        if (craft is IOwner && target != null && target)
        {
            IOwner owner = craft as IOwner;

            if (owner.GetUnitsCommanding().Count < owner.GetTotalCommandLimit())
            {
                var droneSpawns = GetAbilities(10); // drone spawn
                foreach (var droneSpawn in droneSpawns)
                {
                    droneSpawn.Activate();
                }
            }
        }
    }
Beispiel #8
0
 public void SetOwner(IOwner owner)
 {
     this.owner = owner;
     owner.GetUnitsCommanding().Add(this);
 }