ACR_CreatureBehavior.CreatureObject._FindTargetForDebuff C# (CSharp) Method

_FindTargetForDebuff() private method

This seeks a target for for large terrain-altering or wide effect spells meant to sway battles. It prioritizes distant and high-danger targets.
private _FindTargetForDebuff ( NWScript.NWScriptEngineStructure3 Debuff ) : uint
Debuff NWScript.NWScriptEngineStructure3 Provides the NWTalent for the buff to check against.
return uint
        private uint _FindTargetForDebuff(NWTalent Debuff)
        {
            int SpellId = Script.GetIdFromTalent(Debuff);
            CreatureObject Target = Party.GetFarthest(this, Party.Enemies);
            if (Target != null && Script.GetHasSpellEffect(SpellId, Target.ObjectId) == CLRScriptBase.FALSE)
            {
                foreach (uint Collateral in Script.GetObjectsInShape(CLRScriptBase.SHAPE_SPHERE, CLRScriptBase.RADIUS_SIZE_MEDIUM, Script.GetLocation(Target.ObjectId), false, CLRScriptBase.OBJECT_TYPE_CREATURE, Script.Vector(0.0f, 0.0f, 0.0f)))
                {
                    if (Script.GetIsReactionTypeHostile(Target.ObjectId, ObjectId) != CLRScriptBase.TRUE)
                        Target = null;
                }
                if(Target != null)
                    return Target.ObjectId;
            }
            Target = Party.GetFarthest(this, Party.EnemySpellcasters);
            if (Target != null && Script.GetHasSpellEffect(SpellId, Target.ObjectId) == CLRScriptBase.FALSE)
            {
                foreach (uint Collateral in Script.GetObjectsInShape(CLRScriptBase.SHAPE_SPHERE, CLRScriptBase.RADIUS_SIZE_MEDIUM, Script.GetLocation(Target.ObjectId), false, CLRScriptBase.OBJECT_TYPE_CREATURE, Script.Vector(0.0f, 0.0f, 0.0f)))
                {
                    if (Script.GetIsReactionTypeHostile(Target.ObjectId, ObjectId) != CLRScriptBase.TRUE)
                        Target = null;
                }
                if (Target != null)
                    return Target.ObjectId;
            }
            Target = Party.GetFarthest(this, Party.EnemyHealers);
            if (Target != null && Script.GetHasSpellEffect(SpellId, Target.ObjectId) == CLRScriptBase.FALSE)
            {
                foreach (uint Collateral in Script.GetObjectsInShape(CLRScriptBase.SHAPE_SPHERE, CLRScriptBase.RADIUS_SIZE_MEDIUM, Script.GetLocation(Target.ObjectId), false, CLRScriptBase.OBJECT_TYPE_CREATURE, Script.Vector(0.0f, 0.0f, 0.0f)))
                {
                    if (Script.GetIsReactionTypeHostile(Target.ObjectId, ObjectId) != CLRScriptBase.TRUE)
                        Target = null;
                }
                if (Target != null)
                    return Target.ObjectId;
            }
            Target = Party.GetFarthest(this, Party.EnemySoftTargets);
            if (Target != null && Script.GetHasSpellEffect(SpellId, Target.ObjectId) == CLRScriptBase.FALSE)
            {
                foreach (uint Collateral in Script.GetObjectsInShape(CLRScriptBase.SHAPE_SPHERE, CLRScriptBase.RADIUS_SIZE_MEDIUM, Script.GetLocation(Target.ObjectId), false, CLRScriptBase.OBJECT_TYPE_CREATURE, Script.Vector(0.0f, 0.0f, 0.0f)))
                {
                    if (Script.GetIsReactionTypeHostile(Target.ObjectId, ObjectId) != CLRScriptBase.TRUE)
                        Target = null;
                }
                if (Target != null)
                    return Target.ObjectId;
            }
            foreach(CreatureObject SpellTarget in Party.EnemyHardTargets)
            {
                if (Script.GetHasSpellEffect(SpellId, SpellTarget.ObjectId) == CLRScriptBase.FALSE)
                {
                    foreach (uint Collateral in Script.GetObjectsInShape(CLRScriptBase.SHAPE_SPHERE, CLRScriptBase.RADIUS_SIZE_MEDIUM, Script.GetLocation(Target.ObjectId), false, CLRScriptBase.OBJECT_TYPE_CREATURE, Script.Vector(0.0f, 0.0f, 0.0f)))
                    {
                        if (Script.GetIsReactionTypeHostile(Target.ObjectId, ObjectId) != CLRScriptBase.TRUE)
                            Target = null;
                    }
                    if (Target != null)
                        return Target.ObjectId;
                }
            }
            return OBJECT_INVALID;
        }