Beispiel #1
0
 void OnCraftDestroyed(Craft craft)
 {
     if (craft == PlayerControl.instance.craft)
     {
         StartCoroutine(GameOver());
     }
     else if (craft.gameObject.layer == Layers.Enemy)
     {
         Messenger <Enemy> .Broadcast(MessageTypes.EnemyDestroyed, craft.GetComponent <Enemy>());
     }
 }
Beispiel #2
0
    public void ChangeOnglet()
    {
        player.plans.changed = false;
        int i = 0;

        while (i < table.Count)
        {
            Destroy(table[i].gameObject);
            ++i;
        }
        bool existfood      = false;
        bool existfurniture = false;
        bool existtool      = false;

        table = new List <Craft>();
        foreach (Plan plan in plans)
        {
            if (plan.type == PlanType.FOOD)
            {
                existfood = true;
            }
            else if (plan.type == PlanType.FURNITURE)
            {
                existfurniture = true;
            }
            else if (plan.type == PlanType.TOOL)
            {
                existtool = true;
            }
            if (plan.type == onglet)
            {
                GameObject g     = Instantiate(prefabPlan, transform);
                Craft      craft = g.GetComponent(typeof(Craft)) as Craft;
                craft.GetComponent <RectTransform>().anchoredPosition = new Vector3(0, -25 - table.Count * 45, 0);
                craft.plan   = plan;
                craft.parent = this;
                table.Add(craft);
            }
        }
        foreach (SpecialPlan specialPlan in player.plans.plans)
        {
            foreach (Plan plan in specialPlan.plans)
            {
                if (plan.type == PlanType.FOOD)
                {
                    existfood = true;
                }
                else if (plan.type == PlanType.FURNITURE)
                {
                    existfurniture = true;
                }
                else if (plan.type == PlanType.TOOL)
                {
                    existtool = true;
                }
                if (plan.type == onglet)
                {
                    GameObject g     = Instantiate(prefabPlan, transform);
                    Craft      craft = g.GetComponent(typeof(Craft)) as Craft;
                    craft.GetComponent <RectTransform>().anchoredPosition = new Vector3(0, -25 - table.Count * 45, 0);
                    craft.plan   = plan;
                    craft.parent = this;
                    table.Add(craft);
                }
            }
        }
        if (existfood)
        {
            food.transform.GetChild(0).GetComponent <Image>().color = new Color(1, 1, 1, 1);
        }
        else
        {
            food.transform.GetChild(0).GetComponent <Image>().color = new Color(1, 1, 1, 0.5f);
        }
        if (existfurniture)
        {
            furniture.transform.GetChild(0).GetComponent <Image>().color = new Color(1, 1, 1, 1);
        }
        else
        {
            furniture.transform.GetChild(0).GetComponent <Image>().color = new Color(1, 1, 1, 0.5f);
        }
        if (existtool)
        {
            tool.transform.GetChild(0).GetComponent <Image>().color = new Color(1, 1, 1, 1);
        }
        else
        {
            tool.transform.GetChild(0).GetComponent <Image>().color = new Color(1, 1, 1, 0.5f);
        }


        GetComponent <RectTransform>().sizeDelta = new Vector2(GetComponent <RectTransform>().sizeDelta.x, 50 + (table.Count - 1) * 45);
    }
    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.GetComponent <TractorBeam>() != null)
        {
            if ((craft.GetComponent <TractorBeam>().GetTractorTarget() == null || craft.GetComponent <TractorBeam>().GetTractorTarget().GetComponent <ShellPart>() != null))
            {
                var yoinkPart = GetAbilities(40); // steal the player's parts lmao
                foreach (var ability in yoinkPart)
                {
                    ability.Activate();
                    if (ability.GetActiveTimeRemaining() > 0)
                    {
                        break;
                    }
                }
            }
        }
        if (craft is IOwner owner && target != null && target)
        {
            if (owner.GetUnitsCommanding().Count < owner.GetTotalCommandLimit())
            {
                var droneSpawns = GetAbilities(10); // drone spawn
                foreach (var droneSpawn in droneSpawns)
                {
                    droneSpawn.Activate();
                }
            }
        }
    }