Example #1
0
    private void RemoveSanctuaryTargets()
    {
        if (Sanctuary.ProtectedTargets == null)
        {
            return;
        }

        List <GameObject> protected_melee_actors = AvailableMeleeTargets
                                                   .Where(target => target.GetComponent <Actor>() != null && Sanctuary.ProtectedTargets.ContainsKey(target.GetComponent <Actor>()) && !Me.Actions.Decider.Threat.Threats.ContainsKey(target.GetComponent <Actor>()))
                                                   .ToList();

        List <GameObject> protected_ranged_actors = AvailableRangedTargets
                                                    .Where(target => target.GetComponent <Actor>() != null && Sanctuary.ProtectedTargets.ContainsKey(target.GetComponent <Actor>()) && !Me.Actions.Decider.Threat.Threats.ContainsKey(target.GetComponent <Actor>()))
                                                    .ToList();

        foreach (var target in protected_melee_actors)
        {
            if (!Me.Actions.SavingThrow(Proficiencies.Attribute.Wisdom, Sanctuary.ProtectedTargets[target.GetComponent <Actor>()].ChallengeRating))
            {
                AvailableMeleeTargets.Remove(target);
            }
        }

        foreach (var target in protected_ranged_actors)
        {
            if (!Me.Actions.SavingThrow(Proficiencies.Attribute.Wisdom, Sanctuary.ProtectedTargets[target.GetComponent <Actor>()].ChallengeRating))
            {
                AvailableMeleeTargets.Remove(target);
            }
        }
    }
Example #2
0
    public GameObject TargetEnemy()
    {
        IdentifyEnemies();
        RemoveSanctuaryTargets();

        if (AvailableMeleeTargets.Any() && AvailableMeleeTargets.Contains(Threat.PrimaryThreat()?.gameObject))
        {
            TargetMelee();
        }
        else if (AvailableRangedTargets.Any() && AvailableRangedTargets.Contains(Threat.PrimaryThreat()?.gameObject))
        {
            TargetRanged();
        }
        else
        {
            Target = null;
        }

        return(Target);
    }
Example #3
0
    private void SetEnemyRanges()
    {
        if (Me == null)
        {
            return;
        }

        float  melee_range   = Me.Actions.Combat.MeleeRange();
        Weapon ranged_weapon = Me.Actions.Combat.EquippedRangedWeapon;
        Weapon combat_spell  = Me.Actions.Combat.CombatSpells.FirstOrDefault(); // TODO: cycle through spells and choose the longest ranged.

        if (Enemies.Any())
        {
            AvailableMeleeTargets.AddRange(Enemies
                                           .Where(actor => actor != null && Me.SeparationFrom(actor.transform) <= melee_range)
                                           .OrderBy(actor => actor.Health.CurrentHitPoints)
                                           .Select(actor => actor.gameObject)
                                           .Distinct()
                                           .ToList());

            if (ranged_weapon != null)
            {
                AvailableRangedTargets.AddRange(Enemies
                                                .Where(actor => actor != null && Me.SeparationFrom(actor.transform) <= ranged_weapon.Range)
                                                .OrderBy(actor => actor.Health.CurrentHitPoints)
                                                .Select(actor => actor.gameObject)
                                                .Distinct()
                                                .ToList());
            }

            if (combat_spell != null)
            {
                AvailableRangedTargets.AddRange(Enemies
                                                .Where(actor => actor != null && Me.SeparationFrom(actor.transform) <= combat_spell.GetComponent <Spell>().range)
                                                .OrderBy(actor => actor.Health.CurrentHitPoints)
                                                .Select(actor => actor.gameObject)
                                                .Distinct()
                                                .ToList());
            }
        }

        if (Me.Actions.Decider.HostileStructures.Any())
        {
            AvailableMeleeTargets.AddRange(Me.Actions.Decider.HostileStructures
                                           .Where(structure => Me.SeparationFrom(structure.transform) <= melee_range + Me.Actions.Movement.StoppingDistance())
                                           .Select(structure => structure.gameObject)
                                           .Distinct()
                                           .ToList());

            if (ranged_weapon != null)
            {
                AvailableRangedTargets.AddRange(Me.Actions.Decider.HostileStructures
                                                .Where(structure => Me.SeparationFrom(structure.transform) <= ranged_weapon.Range + Me.Actions.Movement.StoppingDistance())
                                                .Select(structure => structure.gameObject)
                                                .Distinct()
                                                .ToList());
            }

            if (combat_spell != null)
            {
                AvailableRangedTargets.AddRange(Me.Actions.Decider.HostileStructures
                                                .Where(structure => Me.SeparationFrom(structure.transform) <= combat_spell.GetComponent <Spell>().range + Me.Actions.Movement.StoppingDistance())
                                                .Select(structure => structure.gameObject)
                                                .Distinct()
                                                .ToList());
            }
        }
    }
Example #4
0
 private void ClearTargets()
 {
     AvailableMeleeTargets.Clear();
     AvailableRangedTargets.Clear();
     Target = null;
 }