Exemple #1
0
    public void UseWeapon()
    {
        if (currentWeapon == null || isOnCooldown)
        {
            return;
        }

        OnUseWeapon.Invoke();

        CharacterTeamAssigner myTeam = GetComponent <CharacterTeamAssigner>();

        foreach (Collider2D collider in GetCollidersInWeaponRange())
        {
            HealthTracker tracker = collider.GetComponentInParent <HealthTracker>();
            if (tracker != null)
            {
                CharacterTeamAssigner otherTeam = collider.GetComponentInParent <CharacterTeamAssigner>();
                if (otherTeam == null || myTeam == null || myTeam.team != otherTeam.team)
                {
                    tracker.TakeDamage(currentWeapon.damage);

                    Rigidbody2D rb = collider.GetComponentInParent <Rigidbody2D>();
                    if (rb != null)
                    {
                        rb.AddForce((rb.position - (Vector2)transform.position).normalized * currentWeapon.force, ForceMode2D.Impulse);
                    }
                }
            }
        }

        StartCoroutine(WaitForCooldown(currentWeapon.cooldown));
    }
Exemple #2
0
    public override void UpdateLogic(CharacterLogicController controller)
    {
        NavigationTargeter    targeter          = controller.GetComponent <NavigationTargeter>();
        WaypointChainFollower follower          = controller.GetComponent <WaypointChainFollower>();
        HealthTracker         tracker           = controller.GetComponent <HealthTracker>();
        ExcitementTracker     excitementTracker = controller.GetComponent <ExcitementTracker>();
        CharacterTeamAssigner teamAssigner      = controller.GetComponent <CharacterTeamAssigner>();
        WeaponController      weaponController  = controller.GetComponent <WeaponController>();

        bool canAttack  = !weaponController.isOnCooldown;
        bool isPanicked = tracker.currentHealth / tracker.maxHealth <= panicPercentage;

        List <CharacterTeamAssigner> enemiesInVision = new List <CharacterTeamAssigner>();
        List <Potion> potionsInVision = new List <Potion>();

        foreach (Collider2D collider in Physics2D.OverlapCircleAll(controller.transform.position, visionRange))
        {
            CharacterTeamAssigner otherTeamAssigner = collider.GetComponent <CharacterTeamAssigner>();
            Potion potion = collider.GetComponent <Potion>();

            if (otherTeamAssigner != null && otherTeamAssigner.team != teamAssigner.team)
            {
                enemiesInVision.Add(otherTeamAssigner);
            }

            if (potion != null)
            {
                potionsInVision.Add(potion);
            }
        }

        List <CharacterTeamAssigner> enemiesInAttackRange = ClosestUtility.ThresholdList(controller.transform, enemiesInVision, enemyAttackRange);

        bool inCombat = enemiesInAttackRange.Count > 0;

        if (inCombat)
        {
            excitementTracker.GainExcitement(excitementGainedWhenInCombatPerSecond * Time.deltaTime * (isPanicked ? panicExcitementMultiplier : 1.0f));
        }

        if (inCombat && !isPanicked && canAttack)
        {
            targeter.target = ClosestUtility.GetClosestInList(controller.transform, enemiesInAttackRange).transform;
            return;
        }

        bool canGetToPotion = potionsInVision.Count > 0;
        bool wantsPotion    = tracker.currentHealth < tracker.maxHealth;

        if (wantsPotion && canGetToPotion)
        {
            targeter.target = ClosestUtility.GetClosestInList(controller.transform, potionsInVision).transform;
            return;
        }

        targeter.target = follower.currentWaypoint;
    }
Exemple #3
0
    private void OnTriggerEnter2D(Collider2D collision)
    {
#if UNITY_EDITOR
        if (!EditorApplication.isPlaying)
        {
            return;
        }
#endif
        CharacterTeamAssigner teamAssigner = collision.GetComponent <CharacterTeamAssigner>();
        if (teamAssigner != null && teamAssigner.team == potionSettings.teamToHeal)
        {
            HealthTracker tracker = collision.GetComponent <HealthTracker>();
            tracker.RestoreHealth(potionSettings.healAmount);
        }
        gameObject.SetActive(false);
    }
Exemple #4
0
    public bool AreEnemiesInRange()
    {
        CharacterTeamAssigner myTeam = GetComponent <CharacterTeamAssigner>();

        foreach (Collider2D collider in GetCollidersInWeaponRange())
        {
            HealthTracker tracker = collider.GetComponentInParent <HealthTracker>();
            if (tracker != null)
            {
                CharacterTeamAssigner otherTeam = collider.GetComponentInParent <CharacterTeamAssigner>();
                if (otherTeam == null || myTeam == null || myTeam.team != otherTeam.team)
                {
                    return(true);
                }
            }
        }
        return(false);
    }
Exemple #5
0
        public override void UpdateLogic(CharacterLogicController controller)
        {
            NavigationTargeter targeter = controller.GetComponent <NavigationTargeter>();

            if (targeter == null)
            {
                return;
            }

            if (targeter.target != null)
            {
                return;
            }

            Transform target          = null;
            float     closestDistance = Mathf.Infinity;

            foreach (Collider2D collider in Physics2D.OverlapCircleAll(controller.transform.position, seekRange))
            {
                CharacterTeamAssigner assigner = collider.GetComponent <CharacterTeamAssigner>();
                if (assigner != null)
                {
                    if (assigner.team == teamToSeek)
                    {
                        float distance = Vector2.Distance(controller.transform.position, assigner.transform.position);
                        if (distance < closestDistance)
                        {
                            target          = assigner.transform;
                            closestDistance = distance;
                        }
                    }
                }
            }
            targeter.target = target;
            targeter.RecomputeWaypoints();
        }