Exemple #1
0
        public override Spell DoDispel(Mobile toDispel)
        {
            Spell spell = null;

            if (spell == null)
            {
                if (!m_Mobile.DisallowAllMoves && m_Mobile.InRange(toDispel, 4) && !toDispel.Paralyzed)
                {
                    spell = new TeleportSpell(m_Mobile, null);
                }
                else if (Utility.Random(1) == 0 && !m_Mobile.InRange(toDispel, 3) && !toDispel.Paralyzed && !toDispel.Frozen)
                {
                    spell = new ParalyzeSpell(m_Mobile, null);
                }
                else
                {
                    if (toDispel is Daemon)
                    {
                        return(new MassDispelSpell(m_Mobile, null));
                    }
                    else
                    {
                        return(new DispelSpell(m_Mobile, null));
                    }
                }
            }

            return(spell);
        }
Exemple #2
0
        public virtual Spell DoDispel(Mobile toDispel)
        {
            Spell spell = null;

            if (!m_Mobile.Summoned && Utility.Random(0, 4 + (m_Mobile.Hits == 0 ? m_Mobile.HitsMax : (m_Mobile.HitsMax / m_Mobile.Hits))) >= 3)
            {
                if (m_Mobile.Hits < (m_Mobile.HitsMax - 50))
                {
                    spell = new GreaterHealSpell(m_Mobile, null);
                }
                else if (m_Mobile.Hits < (m_Mobile.HitsMax - 20))
                {
                    spell = new HealSpell(m_Mobile, null);
                }
            }

            if (spell == null)
            {
                if (!m_Mobile.DisallowAllMoves && Utility.Random((int)m_Mobile.GetDistanceToSqrt(toDispel)) == 0)
                {
                    spell = new TeleportSpell(m_Mobile, null);
                }
                else if (Utility.Random(3) == 0 && !m_Mobile.InRange(toDispel, 3) && !toDispel.Paralyzed && !toDispel.Frozen)
                {
                    spell = new ParalyzeSpell(m_Mobile, null);
                }
                else
                {
                    spell = new DispelSpell(m_Mobile, null);
                }
            }

            return(spell);
        }
Exemple #3
0
        public virtual Spell DoDispel(Mobile toDispel)
        {
            if (!SmartAI)
            {
                if (ScaleBySkill(DispelChance, SkillName.Magery) > Utility.RandomDouble())
                {
                    return(new DispelSpell(m_Mobile, null));
                }

                return(ChooseSpell(toDispel));
            }

            Spell spell = CheckCastHealingSpell();

            if (spell == null)
            {
                if (!m_Mobile.DisallowAllMoves && Utility.Random((int)m_Mobile.GetDistanceToSqrt(toDispel)) == 0)
                {
                    spell = new TeleportSpell(m_Mobile, null);
                }
                else if (Utility.Random(3) == 0 && !m_Mobile.InRange(toDispel, 3) && !toDispel.Paralyzed && !toDispel.Frozen)
                {
                    spell = new ParalyzeSpell(m_Mobile, null);
                }
                else
                {
                    spell = new DispelSpell(m_Mobile, null);
                }
            }

            return(spell);
        }
Exemple #4
0
        public virtual Spell DoDispel(Mobile toDispel)
        {
            if (!SmartAI)
            {
                if (ScaleByMagery(DispelChance) > Utility.RandomDouble())
                {
                    if (toDispel is Daemon)
                    {
                        return(new MassDispelSpell(m_Mobile, null));
                    }
                    else
                    {
                        return(new DispelSpell(m_Mobile, null));
                    }
                }

                return(ChooseSpell(toDispel));
            }

            Spell spell = null;

            if (!m_Mobile.Summoned && Utility.Random(0, 4 + (m_Mobile.Hits == 0 ? m_Mobile.HitsMax : (m_Mobile.HitsMax / m_Mobile.Hits))) >= 3)
            {
                if (m_Mobile.Hits < (m_Mobile.HitsMax - 50))
                {
                    spell = new GreaterHealSpell(m_Mobile, null);
                }
                else if (m_Mobile.Hits < (m_Mobile.HitsMax - 20))
                {
                    spell = new HealSpell(m_Mobile, null);
                }
            }

            if (spell == null)
            {
                if (!m_Mobile.DisallowAllMoves && Utility.Random((int)m_Mobile.GetDistanceToSqrt(toDispel)) == 0)
                {
                    spell = new TeleportSpell(m_Mobile, null);
                }
                else if (Utility.Random(3) == 0 && !m_Mobile.InRange(toDispel, 3) && !toDispel.Paralyzed && !toDispel.Frozen)
                {
                    spell = new ParalyzeSpell(m_Mobile, null);
                }
                else
                {
                    if (toDispel is Daemon)
                    {
                        return(new MassDispelSpell(m_Mobile, null));
                    }
                    else
                    {
                        return(new DispelSpell(m_Mobile, null));
                    }
                }
            }

            return(spell);
        }
Exemple #5
0
        public override Spell ChooseSpell(Mobile c)
        {
            Mobile com   = m_Mobile.Combatant;
            Spell  spell = null;

            int healChance = (m_Mobile.Hits == 0 ? m_Mobile.HitsMax : (m_Mobile.HitsMax / m_Mobile.Hits));

            switch (Utility.Random(1 + healChance))
            {
            default:
            case 0:                     // Heal ourself
            {
                if (!m_Mobile.Summoned)
                {
                    m_Mobile.DebugSay("I am going to heal myself");
                    if (m_Mobile.Hits < (m_Mobile.HitsMax - 50))
                    {
                        spell = new GreaterHealSpell(m_Mobile, null);
                    }
                    else if (m_Mobile.Hits < (m_Mobile.HitsMax - 10))
                    {
                        spell = new HealSpell(m_Mobile, null);
                    }
                }

                break;
            }

            case 1:                     // Set up a combo
            {
                if (m_Mobile.Mana < 40 && m_Mobile.Mana > 15)
                {
                    if (c.Paralyzed)
                    {
                        m_Mobile.DebugSay("I am going to meditate");

                        m_Mobile.UseSkill(SkillName.Meditation);
                    }
                }
                else if (m_Mobile.Mana > 60)
                {
                    Combo = 0;
                    m_Mobile.DebugSay("I am going to combo and paralyze");
                    if (!c.Paralyzed)
                    {
                        spell = new ParalyzeSpell(m_Mobile, null);
                    }
                }

                break;
            }
            }

            return(spell);
        }
Exemple #6
0
        public virtual Spell ChooseSpell(Mobile c)
        {
            Spell spell = null;

            if (!SmartAI)
            {
                spell = CheckCastHealingSpell();

                if (spell != null)
                {
                    return(spell);
                }

                switch (Utility.Random(15))
                {
                case 0:
                case 1:         // Poison them
                {
                    if (c.Poisoned)
                    {
                        goto default;
                    }

                    m_Mobile.DebugSay("Attempting to poison");

                    spell = new PoisonSpell(m_Mobile, null);
                    break;
                }

                case 2:         // Bless ourselves
                {
                    m_Mobile.DebugSay("Blessing myself");

                    spell = GetRandomBuffSpell();        //new BlessSpell(this.m_Mobile, null);
                    break;
                }

                case 3:
                case 4:     // Curse them
                {
                    m_Mobile.DebugSay("Attempting to curse");

                    spell = GetRandomCurseSpell();
                    break;
                }

                case 5:         // Paralyze them
                {
                    if (c.Paralyzed || m_Mobile.Skills[SkillName.Magery].Value <= 50.0)
                    {
                        goto default;
                    }

                    m_Mobile.DebugSay("Attempting to paralyze");

                    spell = new ParalyzeSpell(m_Mobile, null);
                    break;
                }

                case 6:     // Drain mana
                {
                    m_Mobile.DebugSay("Attempting to drain mana");

                    spell = GetRandomManaDrainSpell();
                    break;
                }

                default:     // Damage them
                {
                    m_Mobile.DebugSay("Just doing damage");

                    spell = GetRandomDamageSpell();
                    break;
                }
                }

                return(spell);
            }

            spell = CheckCastHealingSpell();

            if (spell != null)
            {
                return(spell);
            }

            switch (Utility.Random(3))
            {
            case 0:     // Poison them
            {
                if (c.Poisoned)
                {
                    goto case 1;
                }

                spell = new PoisonSpell(m_Mobile, null);
                break;
            }

            case 1:     // Deal some damage
            {
                spell = GetRandomDamageSpell();

                break;
            }

            default:     // Set up a combo
            {
                if (m_Mobile.Mana > 15 && m_Mobile.Mana < 40)
                {
                    if (c.Paralyzed && !c.Poisoned && !m_Mobile.Meditating)
                    {
                        m_Mobile.DebugSay("I am going to meditate");

                        m_Mobile.UseSkill(SkillName.Meditation);
                    }
                    else if (!c.Poisoned)
                    {
                        spell = new ParalyzeSpell(m_Mobile, null);
                    }
                }
                else if (m_Mobile.Mana > 60)
                {
                    if (Utility.RandomBool() && !c.Paralyzed && !c.Frozen && !c.Poisoned)
                    {
                        m_Combo = 0;
                        spell   = new ParalyzeSpell(m_Mobile, null);
                    }
                    else
                    {
                        m_Combo = 1;
                        spell   = new ExplosionSpell(m_Mobile, null);
                    }
                }

                break;
            }
            }

            return(spell);
        }
        public virtual Spell ChooseSpell(Mobile c)
        {
            Spell spell = null;

            if (!SmartAI)
            {
                spell = CheckCastHealingSpell();

                if (spell != null)
                {
                    return(spell);
                }

                switch (Utility.Random(16))
                {
                case 0:
                case 1:                         // Poison them
                {
                    //m_Mobile.DebugSay( "Attempting to poison" );

                    if (!c.Poisoned)
                    {
                        spell = new PoisonSpell(m_Mobile, null);
                    }

                    break;
                }

                case 2:                         // Bless ourselves.
                {
                    //m_Mobile.DebugSay( "Blessing myself" );

                    spell = new BlessSpell(m_Mobile, null);
                    break;
                }

                case 3:
                case 4:                         // Curse them.
                {
                    //m_Mobile.DebugSay( "Attempting to curse" );

                    spell = GetRandomCurse();
                    break;
                }

                case 5:                         // Paralyze them.
                {
                    //m_Mobile.DebugSay( "Attempting to paralyze" );

                    if (m_Mobile.Skills[SkillName.Magery].Value > 50.0)
                    {
                        spell = new ParalyzeSpell(m_Mobile, null);
                    }

                    break;
                }

                case 6:                         // Drain mana
                {
                    //m_Mobile.DebugSay( "Attempting to drain mana" );

                    spell = GetRandomManaDrainSpell();
                    break;
                }

                case 7:
                {
                    //m_Mobile.DebugSay( "Attempting to Invis" );

                    if (spell == null)
                    {
                        spell = new InvisibilitySpell(m_Mobile, null);
                    }

                    break;
                }

                default:                         // Damage them.
                {
                    //m_Mobile.DebugSay( "Just doing damage" );

                    spell = GetRandomDamage();
                    break;
                }
                }

                return(spell);
            }

            spell = CheckCastHealingSpell();

            if (spell != null)
            {
                return(spell);
            }

            switch (Utility.Random(2)) // Removido COMBO Utility.Random( 3 )
            {
            default:
            case 0:                     // Poison them
            {
                if (!c.Poisoned)
                {
                    spell = new PoisonSpell(m_Mobile, null);
                }

                break;
            }

            case 1:                     // Deal some damage
            {
                spell = GetRandomDamageSpell();

                break;
            }

            case 2:                     // Set up a combo
            {
                if (m_Mobile.Mana < 40 && m_Mobile.Mana > 15)
                {
                    if (c.Paralyzed && !c.Poisoned)
                    {
                        m_Mobile.DebugSay("I am going to meditate");

                        m_Mobile.UseSkill(SkillName.Meditation);
                    }
                    else if (!c.Poisoned)
                    {
                        spell = new ParalyzeSpell(m_Mobile, null);
                    }
                }
                else if (m_Mobile.Mana > 60)
                {
                    if (Utility.Random(2) == 0 && !c.Paralyzed && !c.Frozen && !c.Poisoned)
                    {
                        m_Combo = 0;
                        spell   = new ParalyzeSpell(m_Mobile, null);
                    }
                    else
                    {
                        m_Combo = 1;
                        spell   = new ExplosionSpell(m_Mobile, null);
                    }
                }

                break;
            }
            }

            return(spell);
        }
Exemple #8
0
        public virtual Spell ChooseSpell(Mobile c)
        {
            if (!SmartAI)
            {
                if (!m_Mobile.Summoned && ScaleByMagery(HealChance) > Utility.RandomDouble())
                {
                    if (m_Mobile.Hits < (m_Mobile.HitsMax - 50))
                    {
                        return(new GreaterHealSpell(m_Mobile, null));
                    }
                    else if (m_Mobile.Hits < (m_Mobile.HitsMax - 10))
                    {
                        return(new HealSpell(m_Mobile, null));
                    }
                }

                return(GetRandomDamageSpell());
            }

            if (c.Int > 70 && m_Mobile.CanBeginAction(typeof(DefensiveSpell)))
            {
                return(new MagicReflectSpell(m_Mobile, null));
            }

            if (c.Dex > 60 && m_Mobile.CanBeginAction(typeof(DefensiveSpell)))
            {
                return(new ReactiveArmorSpell(m_Mobile, null));
            }


            Spell spell = null;

            int healChance = (m_Mobile.Hits == 0 ? m_Mobile.HitsMax : (m_Mobile.HitsMax / m_Mobile.Hits));

            if (m_Mobile.Summoned)
            {
                healChance = 0;
            }

            switch (Utility.Random(1 + healChance))
            {
            default:
            case 0:                     // Heal ourself
            {
                if (!m_Mobile.Summoned)
                {
                    if (m_Mobile.Hits < (m_Mobile.HitsMax - 50))
                    {
                        spell = new GreaterHealSpell(m_Mobile, null);
                    }
                    else if (m_Mobile.Hits < (m_Mobile.HitsMax - 10))
                    {
                        spell = new HealSpell(m_Mobile, null);
                    }
                }

                break;
            }

            //case 1: // Poison them
            //{
            //	if ( !c.Poisoned )
            //		spell = new PoisonSpell( m_Mobile, null );
            //
            //	break;
            //	}
            //case 2: // Deal some damage
            //	{
            //		spell = GetRandomDamageSpell();
            //
            //		break;
            //	}
            case 1:                     // Set up a combo
            {
                if (m_Mobile.Mana < 50 && m_Mobile.Mana > 15)
                {
                    if (c.Paralyzed && !c.Poisoned)
                    {
                        if (c.Hits < 45)
                        {
                            spell = new ExplosionSpell(m_Mobile, null);
                        }

                        if (c.Hits < 30)
                        {
                            spell = new EnergyBoltSpell(m_Mobile, null);
                        }

                        m_Mobile.DebugSay("I am going to meditate");

                        m_Mobile.UseSkill(SkillName.Meditation);
                    }
                    else if (!c.Poisoned)
                    {
                        spell = new ParalyzeSpell(m_Mobile, null);
                    }
                }
                else if (m_Mobile.Mana > 80)
                {
                    m_Combo = 1;
                    spell   = new ExplosionSpell(m_Mobile, null);
                }

                break;
            }
            }

            return(spell);
        }
Exemple #9
0
        public virtual Spell ChooseSpell(Mobile c)
        {
            Spell spell = null;

            if (!SmartAI)
            {
                spell = CheckCastHealingSpell();

                if (spell != null)
                {
                    return(spell);
                }

                switch (Utility.Random(16))
                {
                case 0:
                {
                    spell = new FireballSpell(m_Mobile, null);
                    break;
                }

                case 1:
                {
                    m_Mobile.DebugSay("Protecting myself");

                    spell = new ProtectionSpell(m_Mobile, null);
                    break;
                }

                case 2:         // Poison them
                {
                    m_Mobile.DebugSay("Attempting to poison");

                    if (!c.Poisoned)
                    {
                        spell = new PoisonSpell(m_Mobile, null);
                    }

                    break;
                }

                case 3:         // Bless ourselves.
                {
                    m_Mobile.DebugSay("Blessing myself");

                    spell = new BlessSpell(m_Mobile, null);
                    break;
                }

                case 4:
                {
                    m_Mobile.DebugSay("Summoning FIRE FIELD!!!");

                    spell = new FireFieldSpell(m_Mobile, null);
                    break;
                }

                case 5:
                case 6:     // Curse them.
                {
                    m_Mobile.DebugSay("Attempting to curse");

                    spell = GetRandomCurseSpell();
                    break;
                }

                case 7:         // Paralyze them.
                {
                    m_Mobile.DebugSay("Attempting to paralyze");

                    if (m_Mobile.Skills[SkillName.Magery].Value > 50.0)
                    {
                        spell = new ParalyzeSpell(m_Mobile, null);
                    }

                    break;
                }

                case 8:     // Drain mana
                {
                    m_Mobile.DebugSay("Attempting to drain mana");

                    spell = GetRandomManaDrainSpell();
                    break;
                }

                default:     // Damage them.
                {
                    m_Mobile.DebugSay("Just doing damage");

                    spell = GetRandomDamageSpell();
                    break;
                }
                }

                return(spell);
            }

            spell = CheckCastHealingSpell();

            if (spell != null)
            {
                return(spell);
            }

            if (!c.Poisoned && c.Spell != null && c.Mana > (c.ManaMax / 2))
            {
                return(GetRandomManaDrainSpell());
            }

            if (m_Mobile.Hits < (m_Mobile.HitsMax / 2) && 0.30 > Utility.RandomDouble())
            {
                spell = new ProtectionSpell(m_Mobile, null);

                if (spell == null)
                {
                    spell = new BlessSpell(m_Mobile, null);
                }

                if (spell != null)
                {
                    return(spell);
                }
            }

            if (c.Hits < (c.HitsMax * 0.30))  //They're dying, set up a kill combo
            {
                m_Combo = 0;

                if (!c.Poisoned)
                {
                    spell = new PoisonSpell(m_Mobile, null);
                }
                else
                {
                    spell = new ParalyzeSpell(m_Mobile, null);
                }
            }

            switch (Utility.Random(10))
            {
            default:
            case 0:     // Deal some damage
            {
                spell = GetRandomDamageSpell();
                break;
            }

            case 1:     // Poison them
            {
                if (!c.Poisoned)
                {
                    spell = new PoisonSpell(m_Mobile, null);
                }

                break;
            }

            case 2:     // Set up a combo
            {
                if (m_Mobile.Mana < 40 && m_Mobile.Mana > 15)
                {
                    if (c.Paralyzed && !c.Poisoned)
                    {
                        m_Mobile.DebugSay("I am going to meditate");

                        m_Mobile.UseSkill(SkillName.Meditation);
                    }
                    else if (!c.Poisoned)
                    {
                        spell = new ParalyzeSpell(m_Mobile, null);
                    }
                }
                else if (m_Mobile.Mana > 60)
                {
                    if (Utility.Random(2) == 0 && !c.Paralyzed && !c.Frozen && !c.Poisoned)
                    {
                        m_Combo = 0;
                        spell   = new ParalyzeSpell(m_Mobile, null);
                    }
                    else
                    {
                        m_Combo = 1;
                        spell   = new ExplosionSpell(m_Mobile, null);
                    }
                }

                break;
            }

            case 3:
            {
                spell = GetRandomCurseSpell();
                break;
            }
            }

            return(spell);
        }
Exemple #10
0
        public override Spell ChooseSpell(Mobile c)
        {
            Spell spell = CheckCastHealingSpell();

            if (spell != null)
            {
                return(spell);
            }

            switch (Utility.Random(16))
            {
            case 0:
            case 1:
            case 2:                     // Poison them
            {
                m_Mobile.DebugSay("Attempting to poison");

                if (!c.Poisoned)
                {
                    spell = new PoisonSpell(m_Mobile, null);
                }

                break;
            }

            case 3:                     // Bless ourselves.
            {
                m_Mobile.DebugSay("Blessing myself");

                spell = new BlessSpell(m_Mobile, null);

                break;
            }

            case 4:                     // Sleep
            {
                m_Mobile.DebugSay("¡A dormir!");

                spell = new SleepSpell(m_Mobile, null);

                break;
            }

            case 5:                     // Curse them.
            {
                m_Mobile.DebugSay("Attempting to curse");

                spell = GetRandomCurseSpell(c);
                break;
            }

            case 6:
            case 7:                     // Paralyze them.
            {
                m_Mobile.DebugSay("Attempting to paralyze");

                if (m_Mobile.Skills[SkillName.Magery].Value > 50.0)
                {
                    spell = new ParalyzeSpell(m_Mobile, null);
                }

                break;
            }

            case 8:                     // Drain mana
            {
                m_Mobile.DebugSay("Attempting to drain mana");

                spell = GetRandomManaDrainSpell(c);
                break;
            }

            default:                     // Damage them.
            {
                m_Mobile.DebugSay("Just doing damage");

                spell = GetRandomDamageSpell(c);
                break;
            }
            }

            return(spell);
        }
Exemple #11
0
        public override bool Think()
        {
            Mobile combatant = m_Guard.Combatant;

            if (combatant == null || combatant.Deleted || !combatant.Alive || combatant.IsDeadBondedPet || !m_Mobile.CanSee(combatant) || !m_Mobile.CanBeHarmful(combatant, false) || combatant.Map != m_Mobile.Map)
            {
                // Our combatant is deleted, dead, hidden, or we cannot hurt them
                // Try to find another combatant

                if (AcquireFocusMob(m_Mobile.RangePerception, m_Mobile.FightMode, false, false, true))
                {
                    m_Mobile.Combatant = combatant = m_Mobile.FocusMob;
                    m_Mobile.FocusMob  = null;
                }
                else
                {
                    m_Mobile.Combatant = combatant = null;
                }
            }

            if (combatant != null && (!m_Mobile.InLOS(combatant) || !m_Mobile.InRange(combatant, 12)))
            {
                if (AcquireFocusMob(m_Mobile.RangePerception, m_Mobile.FightMode, false, false, true))
                {
                    m_Mobile.Combatant = combatant = m_Mobile.FocusMob;
                    m_Mobile.FocusMob  = null;
                }
                else if (!m_Mobile.InRange(combatant, 36))
                {
                    m_Mobile.Combatant = combatant = null;
                }
            }

            Mobile dispelTarget = FindDispelTarget(true);

            if (m_Guard.Target != null && m_ReleaseTarget == DateTime.MinValue)
            {
                m_ReleaseTarget = DateTime.Now + TimeSpan.FromSeconds(10.0);
            }

            if (m_Guard.Target != null && DateTime.Now > m_ReleaseTarget)
            {
                Target targ = m_Guard.Target;

                Mobile toHarm = (dispelTarget == null ? combatant : dispelTarget);

                if ((targ.Flags & TargetFlags.Harmful) != 0 && toHarm != null)
                {
                    if (m_Guard.Map == toHarm.Map && (targ.Range < 0 || m_Guard.InRange(toHarm, targ.Range)) && m_Guard.CanSee(toHarm) && m_Guard.InLOS(toHarm))
                    {
                        targ.Invoke(m_Guard, toHarm);
                    }
                    else if (targ is DispelSpell.InternalTarget)
                    {
                        targ.Cancel(m_Guard, TargetCancelType.Canceled);
                    }
                }
                else if ((targ.Flags & TargetFlags.Beneficial) != 0)
                {
                    targ.Invoke(m_Guard, m_Guard);
                }
                else
                {
                    targ.Cancel(m_Guard, TargetCancelType.Canceled);
                }

                m_ReleaseTarget = DateTime.MinValue;
            }

            if (dispelTarget != null)
            {
                if (Action != ActionType.Combat)
                {
                    Action = ActionType.Combat;
                }

                m_Guard.Warmode = true;

                RunFrom(dispelTarget);
            }
            else if (combatant != null)
            {
                if (Action != ActionType.Combat)
                {
                    Action = ActionType.Combat;
                }

                m_Guard.Warmode = true;

                RunTo(combatant);
            }
            else if (m_Guard.Orders.Movement != MovementType.Stand)
            {
                Mobile toFollow = null;

                if (m_Guard.Town != null && m_Guard.Orders.Movement == MovementType.Follow)
                {
                    toFollow = m_Guard.Orders.Follow;

                    if (toFollow == null)
                    {
                        toFollow = m_Guard.Town.Sheriff;
                    }
                }

                if (toFollow != null && toFollow.Map == m_Guard.Map && toFollow.InRange(m_Guard, m_Guard.RangePerception * 3) && Town.FromRegion(toFollow.Region) == m_Guard.Town)
                {
                    if (Action != ActionType.Combat)
                    {
                        Action = ActionType.Combat;
                    }

                    if (m_Mobile.CurrentSpeed != m_Mobile.ActiveSpeed)
                    {
                        m_Mobile.CurrentSpeed = m_Mobile.ActiveSpeed;
                    }

                    m_Guard.Warmode = true;

                    RunTo(toFollow);
                }
                else
                {
                    if (Action != ActionType.Wander)
                    {
                        Action = ActionType.Wander;
                    }

                    if (m_Mobile.CurrentSpeed != m_Mobile.PassiveSpeed)
                    {
                        m_Mobile.CurrentSpeed = m_Mobile.PassiveSpeed;
                    }

                    m_Guard.Warmode = false;

                    WalkRandomInHome(2, 2, 1);
                }
            }
            else
            {
                if (Action != ActionType.Wander)
                {
                    Action = ActionType.Wander;
                }

                m_Guard.Warmode = false;
            }

            if ((IsDamaged || IsPoisoned) && m_Guard.Skills.Healing.Base > 20.0)
            {
                TimeSpan ts = TimeUntilBandage;

                if (ts == TimeSpan.MaxValue)
                {
                    StartBandage();
                }
            }

            if (m_Mobile.Spell == null && DateTime.Now >= m_Mobile.NextSpellTime)
            {
                Spell spell = null;

                DateTime toRelease = DateTime.MinValue;

                if (IsPoisoned)
                {
                    Poison p = m_Guard.Poison;

                    TimeSpan ts = TimeUntilBandage;

                    if (p != Poison.Lesser || ts == TimeSpan.MaxValue || TimeUntilBandage < TimeSpan.FromSeconds(1.5) || (m_Guard.HitsMax - m_Guard.Hits) > Utility.Random(250))
                    {
                        if (IsAllowed(GuardAI.Bless))
                        {
                            spell = new CureSpell(m_Guard, null);
                        }
                        else
                        {
                            UseItemByType(typeof(BaseCurePotion));
                        }
                    }
                }
                else if (IsDamaged && (m_Guard.HitsMax - m_Guard.Hits) > Utility.Random(200))
                {
                    if (IsAllowed(GuardAI.Magic) && ((m_Guard.Hits * 100) / Math.Max(m_Guard.HitsMax, 1)) < 10 && m_Guard.Home != Point3D.Zero && !m_Guard.InRange(m_Guard.Home, 15) && m_Guard.Mana >= 11)
                    {
                        spell = new RecallSpell(m_Guard, null, new RunebookEntry(m_Guard.Home, m_Guard.Map, "Guard's Home", null, 0), null);
                    }
                    else if (IsAllowed(GuardAI.Bless))
                    {
                        if (m_Guard.Mana >= 11 && (m_Guard.Hits + 30) < m_Guard.HitsMax)
                        {
                            spell = new GreaterHealSpell(m_Guard, null);
                        }
                        else if ((m_Guard.Hits + 10) < m_Guard.HitsMax && (m_Guard.Mana < 11 || (m_Guard.NextCombatTime - DateTime.Now) > TimeSpan.FromSeconds(2.0)))
                        {
                            spell = new HealSpell(m_Guard, null);
                        }
                    }
                    else if (m_Guard.CanBeginAction(typeof(BaseHealPotion)))
                    {
                        UseItemByType(typeof(BaseHealPotion));
                    }
                }
                else if (dispelTarget != null && (IsAllowed(GuardAI.Magic) || IsAllowed(GuardAI.Bless) || IsAllowed(GuardAI.Curse)))
                {
                    if (!dispelTarget.Paralyzed && m_Guard.Mana > (ManaReserve + 20) && 40 > Utility.Random(100))
                    {
                        spell = new ParalyzeSpell(m_Guard, null);
                    }
                    else
                    {
                        spell = new DispelSpell(m_Guard, null);
                    }
                }

                if (combatant != null)
                {
                    if (m_Combo != null)
                    {
                        if (spell == null)
                        {
                            spell = SpellCombo.Process(m_Guard, combatant, ref m_Combo, ref m_ComboIndex, ref toRelease);
                        }
                        else
                        {
                            m_Combo      = null;
                            m_ComboIndex = -1;
                        }
                    }
                    else if (20 > Utility.Random(100) && IsAllowed(GuardAI.Magic))
                    {
                        if (80 > Utility.Random(100))
                        {
                            m_Combo      = (IsAllowed(GuardAI.Smart) ? SpellCombo.Simple : SpellCombo.Strong);
                            m_ComboIndex = -1;

                            if (m_Guard.Mana >= (ManaReserve + m_Combo.Mana))
                            {
                                spell = SpellCombo.Process(m_Guard, combatant, ref m_Combo, ref m_ComboIndex, ref toRelease);
                            }
                            else
                            {
                                m_Combo = null;

                                if (m_Guard.Mana >= (ManaReserve + 40))
                                {
                                    spell = RandomOffenseSpell();
                                }
                            }
                        }
                        else if (m_Guard.Mana >= (ManaReserve + 40))
                        {
                            spell = RandomOffenseSpell();
                        }
                    }

                    if (spell == null && 2 > Utility.Random(100) && m_Guard.Mana >= (ManaReserve + 10))
                    {
                        int strMod = GetStatMod(m_Guard, StatType.Str);
                        int dexMod = GetStatMod(m_Guard, StatType.Dex);
                        int intMod = GetStatMod(m_Guard, StatType.Int);

                        List <Type> types = new List <Type>();

                        if (strMod <= 0)
                        {
                            types.Add(typeof(StrengthSpell));
                        }

                        if (dexMod <= 0 && IsAllowed(GuardAI.Melee))
                        {
                            types.Add(typeof(AgilitySpell));
                        }

                        if (intMod <= 0 && IsAllowed(GuardAI.Magic))
                        {
                            types.Add(typeof(CunningSpell));
                        }

                        if (IsAllowed(GuardAI.Bless))
                        {
                            if (types.Count > 1)
                            {
                                spell = new BlessSpell(m_Guard, null);
                            }
                            else if (types.Count == 1)
                            {
                                spell = (Spell)Activator.CreateInstance(types[0], new object[] { m_Guard, null });
                            }
                        }
                        else if (types.Count > 0)
                        {
                            if (types[0] == typeof(StrengthSpell))
                            {
                                UseItemByType(typeof(BaseStrengthPotion));
                            }
                            else if (types[0] == typeof(AgilitySpell))
                            {
                                UseItemByType(typeof(BaseAgilityPotion));
                            }
                        }
                    }

                    if (spell == null && 2 > Utility.Random(100) && m_Guard.Mana >= (ManaReserve + 10) && IsAllowed(GuardAI.Curse))
                    {
                        if (!combatant.Poisoned && 40 > Utility.Random(100))
                        {
                            spell = new PoisonSpell(m_Guard, null);
                        }
                        else
                        {
                            int strMod = GetStatMod(combatant, StatType.Str);
                            int dexMod = GetStatMod(combatant, StatType.Dex);
                            int intMod = GetStatMod(combatant, StatType.Int);

                            ArrayList types = new ArrayList();

                            if (strMod >= 0)
                            {
                                types.Add(typeof(WeakenSpell));
                            }

                            if (dexMod >= 0 && IsAllowed(GuardAI.Melee))
                            {
                                types.Add(typeof(ClumsySpell));
                            }

                            if (intMod >= 0 && IsAllowed(GuardAI.Magic))
                            {
                                types.Add(typeof(FeeblemindSpell));
                            }

                            if (types.Count > 1)
                            {
                                spell = new CurseSpell(m_Guard, null);
                            }
                            else if (types.Count == 1)
                            {
                                spell = (Spell)Activator.CreateInstance((Type)types[0], new object[] { m_Guard, null });
                            }
                        }
                    }
                }

                if (spell != null && (m_Guard.HitsMax - m_Guard.Hits + 10) > Utility.Random(100))
                {
                    Type type = null;

                    if (spell is GreaterHealSpell)
                    {
                        type = typeof(BaseHealPotion);
                    }
                    else if (spell is CureSpell)
                    {
                        type = typeof(BaseCurePotion);
                    }
                    else if (spell is StrengthSpell)
                    {
                        type = typeof(BaseStrengthPotion);
                    }
                    else if (spell is AgilitySpell)
                    {
                        type = typeof(BaseAgilityPotion);
                    }

                    if (type == typeof(BaseHealPotion) && !m_Guard.CanBeginAction(type))
                    {
                        type = null;
                    }

                    if (type != null && m_Guard.Target == null && UseItemByType(type))
                    {
                        if (spell is GreaterHealSpell)
                        {
                            if ((m_Guard.Hits + 30) > m_Guard.HitsMax && (m_Guard.Hits + 10) < m_Guard.HitsMax)
                            {
                                spell = new HealSpell(m_Guard, null);
                            }
                        }
                        else
                        {
                            spell = null;
                        }
                    }
                }
                else if (spell == null && m_Guard.Stam < (m_Guard.StamMax / 3) && IsAllowed(GuardAI.Melee))
                {
                    UseItemByType(typeof(BaseRefreshPotion));
                }

                if (spell == null || !spell.Cast())
                {
                    EquipWeapon();
                }
            }
            else if (m_Mobile.Spell is Spell && ((Spell)m_Mobile.Spell).State == SpellState.Sequencing)
            {
                EquipWeapon();
            }

            return(true);
        }
Exemple #12
0
        public virtual Spell ChooseSpell(Mobile c)
        {
            Spell spell = null;

            if (!SmartAI)
            {
                spell = CheckCastHealingSpell();

                if (spell != null)
                {
                    return(spell);
                }

                if (IsNecromancer)
                {
                    double psDamage = ((m_Mobile.Skills[SkillName.SpiritSpeak].Value - c.Skills[SkillName.MagicResist].Value) / 10) + (c.Player ? 18 : 30);

                    if (psDamage > c.Hits)
                    {
                        return(new PainSpikeSpell(m_Mobile, null));
                    }
                }

                switch (Utility.Random(16))
                {
                case 0:
                case 1:         // Poison them
                {
                    if (c.Poisoned)
                    {
                        goto default;
                    }

                    m_Mobile.DebugSay("Attempting to poison");

                    spell = new PoisonSpell(m_Mobile, null);
                    break;
                }

                case 2:         // Bless ourselves
                {
                    m_Mobile.DebugSay("Blessing myself");

                    spell = new BlessSpell(m_Mobile, null);
                    break;
                }

                case 3:
                case 4:     // Curse them
                {
                    m_Mobile.DebugSay("Attempting to curse");

                    spell = GetRandomCurseSpell();
                    break;
                }

                case 5:         // Paralyze them
                {
                    if (c.Paralyzed || m_Mobile.Skills[SkillName.Magery].Value <= 50.0)
                    {
                        goto default;
                    }

                    m_Mobile.DebugSay("Attempting to paralyze");

                    spell = new ParalyzeSpell(m_Mobile, null);
                    break;
                }

                case 6:     // Drain mana
                {
                    m_Mobile.DebugSay("Attempting to drain mana");

                    spell = GetRandomManaDrainSpell();
                    break;
                }

                case 7:     // Invis ourselves
                {
                    if (Utility.RandomBool())
                    {
                        goto default;
                    }

                    m_Mobile.DebugSay("Attempting to invis myself");

                    spell = new InvisibilitySpell(m_Mobile, null);
                    break;
                }

                default:     // Damage them
                {
                    m_Mobile.DebugSay("Just doing damage");

                    spell = GetRandomDamageSpell();
                    break;
                }
                }

                return(spell);
            }

            spell = CheckCastHealingSpell();

            if (spell != null)
            {
                return(spell);
            }

            switch (Utility.Random(3))
            {
            case 0:     // Poison them
            {
                if (c.Poisoned)
                {
                    goto case 1;
                }

                spell = new PoisonSpell(m_Mobile, null);
                break;
            }

            case 1:     // Deal some damage
            {
                spell = GetRandomDamageSpell();

                break;
            }

            default:     // Set up a combo
            {
                if (m_Mobile.Mana > 15 && m_Mobile.Mana < 40)
                {
                    if (c.Paralyzed && !c.Poisoned && !m_Mobile.Meditating)
                    {
                        m_Mobile.DebugSay("I am going to meditate");

                        m_Mobile.UseSkill(SkillName.Meditation);
                    }
                    else if (!c.Poisoned)
                    {
                        spell = new ParalyzeSpell(m_Mobile, null);
                    }
                }
                else if (m_Mobile.Mana > 60)
                {
                    if (Utility.RandomBool() && !c.Paralyzed && !c.Frozen && !c.Poisoned)
                    {
                        m_Combo = 0;
                        spell   = new ParalyzeSpell(m_Mobile, null);
                    }
                    else
                    {
                        m_Combo = 1;
                        spell   = new ExplosionSpell(m_Mobile, null);
                    }
                }

                break;
            }
            }

            return(spell);
        }
Exemple #13
0
        public override Spell DoCombo(Mobile c)
        {
            Spell spell = null;

            if (Combo == 0)
            {
                m_Mobile.DebugSay("I am doing combo part 1");
                Map     fromMap = m_Mobile.Map;
                Point3D from    = m_Mobile.Location;

                Map     toMap = c.Map;
                Point3D to    = c.Location;

                if (toMap != null)
                {
                    for (int i = 0; i < 5; ++i)
                    {
                        Point3D loc = new Point3D(to.X - 4 + Utility.Random(8), to.Y - 4 + Utility.Random(9), to.Z);

                        if (toMap.CanSpawnMobile(loc))
                        {
                            to = loc;
                            break;
                        }
                        else
                        {
                            loc.Z = toMap.GetAverageZ(loc.X, loc.Y);

                            if (toMap.CanSpawnMobile(loc))
                            {
                                to = loc;
                                break;
                            }
                        }
                    }

                    m_Mobile.Map      = toMap;
                    m_Mobile.Location = to;
                    //poof effect
                    DoParticleEffect(m_Mobile, from, to, fromMap, toMap);
                }

                spell = new LightningSpell(m_Mobile, null);
                ++Combo;                 // Move to next spell
            }
            else if (Combo == 1)
            {
                spell = new ParalyzeSpell(m_Mobile, null);
                ++Combo;                 // Move to next spell
            }
            else if (Combo == 2)
            {
                m_Mobile.Say("I bet your first wish would be that you had never rubbed the lamp!");
                if (!c.Paralyzed)
                {
                    spell = new ParalyzeSpell(m_Mobile, null);
                }
                else
                {
                    spell = new LightningSpell(m_Mobile, null);
                }
                ++Combo;                 // Move to next spell
            }

            else if (Combo == 3)
            {
                Map     fromMap = m_Mobile.Map;
                Point3D from    = m_Mobile.Location;

                Map     toMap = c.Map;
                Point3D to    = c.Location;

                if (toMap != null)
                {
                    for (int i = 0; i < 5; ++i)
                    {
                        Point3D loc = new Point3D(to.X - 4 + Utility.Random(8), to.Y - 4 + Utility.Random(9), to.Z);

                        if (toMap.CanSpawnMobile(loc))
                        {
                            to = loc;
                            break;
                        }
                        else
                        {
                            loc.Z = toMap.GetAverageZ(loc.X, loc.Y);

                            if (toMap.CanSpawnMobile(loc))
                            {
                                to = loc;
                                break;
                            }
                        }
                    }

                    m_Mobile.Map      = toMap;
                    m_Mobile.Location = to;

                    DoParticleEffect(m_Mobile, from, to, fromMap, toMap);
                }
                spell = new LightningSpell(m_Mobile, null);
                ++Combo;                 // Move to next spell
            }

            else if (Combo == 4 && spell == null)
            {
                if (!c.Paralyzed)
                {
                    spell = new ParalyzeSpell(m_Mobile, null);
                }
                else
                {
                    spell = new LightningSpell(m_Mobile, null);
                }
                Combo = -1;                 // Move to next spell
            }

            return(spell);
        }
Exemple #14
0
        public override Spell ChooseSpell(Mobile c)
        {
            if (c is PlayerMobile && SmartAI && (c.Spell is MagicTrapSpell || c.Spell is MagicArrowSpell))
            {
                EnemyCountersPara = true;
            }

            if (c.Int > 70 && m_Mobile.MagicDamageAbsorb <= 0 && m_Mobile.Mana > 20 && m_Mobile.Hits > 60 && m_Mobile.CanBeginAction(typeof(DefensiveSpell)))
            {
                Spell temp = c.Spell as Spell;

                if (temp == null || (temp != null && temp.IsCasting && (int)temp.Circle <= (int)SpellCircle.Fourth))
                {
                    return(new MagicReflectSpell(m_Mobile, null));
                }
            }

            if (c.Dex > 60 && m_Mobile.MeleeDamageAbsorb <= 0 && m_Mobile.Mana > 20 && m_Mobile.Hits > 30 && m_Mobile.CanBeginAction(typeof(DefensiveSpell)))
            {
                return(new ReactiveArmorSpell(m_Mobile, null));
            }

            Spell spell = null;

            int healChance = (m_Mobile.Hits == 0 ? m_Mobile.HitsMax : (m_Mobile.HitsMax / m_Mobile.Hits));

            switch (Utility.Random(1 + healChance))
            {
            default:
            case 0:                     // Heal ourself
            {
                if (UsesPotions && HealPotCount >= 1 && m_Mobile.Hits < (m_Mobile.HitsMax - 30))
                {
                    DrinkHeal(m_Mobile);
                }
                else if (m_Mobile.Hits < (m_Mobile.HitsMax - 35) && m_Mobile.Hits >= 45)
                {
                    spell = new GreaterHealSpell(m_Mobile, null);
                }
                else if (m_Mobile.Hits < (m_Mobile.HitsMax - 10))
                {
                    spell = new HealSpell(m_Mobile, null);
                }
                break;
            }

            case 1:                     // Set up a combo
            {
                //para them and med up until we have mana for a dump
                if (m_Mobile.Mana < 85 && m_Mobile.Mana > 2)
                {
                    RegainingMana = true;
                    //if there low on life and we have the mana try an finish them
                    if (m_Mobile.Mana > 20 && c.Hits < 28)
                    {
                        spell = new EnergyBoltSpell(m_Mobile, null);
                    }

                    if (m_Mobile.Mana > 12 && c.Hits < 15)
                    {
                        spell = new LightningSpell(m_Mobile, null);
                    }

                    if (c.Paralyzed && !c.Poisoned)
                    {
                        if (c.Hits < 45 && m_Mobile.Mana > 40)
                        {
                            spell = new ExplosionSpell(m_Mobile, null);
                        }

                        if (c.Hits < 30)
                        {
                            spell = new EnergyBoltSpell(m_Mobile, null);
                        }

                        m_Mobile.DebugSay("I am going to meditate");

                        m_Mobile.UseSkill(SkillName.Meditation);
                    }
                    else if (!c.Poisoned && EnemyCountersPara == false && m_Mobile.Mana > 40)
                    {
                        spell = new ParalyzeSpell(m_Mobile, null);
                    }
                }

                if (m_Mobile.Mana > 85)
                {
                    RegainingMana = false;
                    Combo         = 0;
                }

                break;
            }
            }

            return(spell);
        }
Exemple #15
0
        public virtual Spell ChooseSpell(Mobile c)
        {
            // tamable solution ---------------
            Mobile com   = m_Mobile.Combatant;
            Spell  spell = null;

            if (com != null && com is BaseCreature && DateTime.Now >= m_NextCouncilSpell)
            {
                if (CastRevelationWave())
                {
                    m_Mobile.DebugSay("I'm gunna cast Revelation Wave!");
                    m_NextCouncilSpell = DateTime.Now + TimeBetweenCouncilSpell;
                    return(new RevelationWaveSpell(m_Mobile, null));
                }

                if (CastPoisonWave())
                {
                    m_Mobile.DebugSay("I'm gunna cast Poison Wave!");
                    m_NextCouncilSpell = DateTime.Now + TimeBetweenCouncilSpell;
                    return(new PoisonWaveSpell(m_Mobile, null));
                }
            }
            // end tamable solution ---------------

            if (!SmartAI)
            {
                if (!m_Mobile.Summoned && ScaleByMagery(HealChance) > Utility.RandomDouble())
                {
                    if (m_Mobile.Hits < (m_Mobile.HitsMax - 50))
                    {
                        return(new GreaterHealSpell(m_Mobile, null));
                    }
                    else if (m_Mobile.Hits < (m_Mobile.HitsMax - 10))
                    {
                        return(new HealSpell(m_Mobile, null));
                    }
                }

                return(GetRandomDamageSpell());
            }

            int healChance = (m_Mobile.Hits == 0 ? m_Mobile.HitsMax : (m_Mobile.HitsMax / m_Mobile.Hits));

            if (m_Mobile.Summoned)
            {
                healChance = 0;
            }

            switch (Utility.Random(4 + healChance))
            {
            default:
            case 0:                     // Heal ourself
            {
                if (!m_Mobile.Summoned)
                {
                    if (m_Mobile.Hits < (m_Mobile.HitsMax - 50))
                    {
                        spell = new GreaterHealSpell(m_Mobile, null);
                    }
                    else if (m_Mobile.Hits < (m_Mobile.HitsMax - 10))
                    {
                        spell = new HealSpell(m_Mobile, null);
                    }
                }

                break;
            }

            case 1:                     // Poison them
            {
                if (!c.Poisoned)
                {
                    spell = new PoisonSpell(m_Mobile, null);
                }

                break;
            }

            case 2:                     // Deal some damage
            {
                spell = GetRandomDamageSpell();

                break;
            }

            case 3:                     // Set up a combo
            {
                if (m_Mobile.Mana < 40 && m_Mobile.Mana > 15)
                {
                    if (c.Paralyzed && !c.Poisoned)
                    {
                        m_Mobile.DebugSay("I am going to meditate");

                        m_Mobile.UseSkill(SkillName.Meditation);
                    }
                    else if (!c.Poisoned)
                    {
                        spell = new ParalyzeSpell(m_Mobile, null);
                    }
                }
                else if (m_Mobile.Mana > 60)
                {
                    if (Utility.Random(2) == 0 && !c.Paralyzed && !c.Frozen && !c.Poisoned)
                    {
                        m_Combo = 0;
                        spell   = new ParalyzeSpell(m_Mobile, null);
                    }
                    else
                    {
                        m_Combo = 1;
                        spell   = new ExplosionSpell(m_Mobile, null);
                    }
                }

                break;
            }
            }

            return(spell);
        }
Exemple #16
0
        public virtual Spell ChooseSpell(Mobile c)
        {
            Spell spell = null;

            spell = GetRandomBlessSpell();

            if (spell != null)
            {
                return(spell);
            }

            spell = CheckCastHealingSpell();

            if (spell != null)
            {
                return(spell);
            }

            switch (Utility.Random(10))
            {
            default:
            case 0:
            case 1:                     // Curse them.
            {
                spell = GetRandomCurseSpell(c);

                break;
            }

            case 2:                     // Poison them
            {
                if (!c.Poisoned)
                {
                    spell = new PoisonSpell(m_Mobile, null);
                }

                break;
            }

            case 3:                     // Drain some mana
            {
                spell = GetRandomManaDrainSpell(c);

                break;
            }

            case 4:
            case 5:
            case 6:                     // Deal some damage
            {
                spell = GetRandomDamageSpell(c);

                break;
            }

            case 7:
            case 8:
            case 9:                     // Set up a combo
            {
                if (m_Mobile.Mana < 40 && m_Mobile.Mana > 15)
                {
                    if (c.Paralyzed && !c.Poisoned)
                    {
                        m_Mobile.DebugSay("I am going to meditate");

                        m_Mobile.UseSkill(SkillName.Meditation);
                    }
                    else if (!c.Poisoned)
                    {
                        spell = new ParalyzeSpell(m_Mobile, null);
                    }
                }
                else if (m_Mobile.Mana > 60)
                {
                    if (Utility.Random(2) == 0 && !c.Paralyzed && !c.Frozen && !c.Poisoned)
                    {
                        m_Combo = 0;
                        spell   = new ParalyzeSpell(m_Mobile, null);
                    }
                    else
                    {
                        m_Combo = 1;
                        spell   = new ExplosionSpell(m_Mobile, null);
                    }
                }

                break;
            }
            }

            return(spell);
        }
Exemple #17
0
        public override Spell ChooseSpell(Mobile c)
        {
            Spell spell = CheckCastHealingSpell();

            if (spell != null)
            {
                return(spell);
            }

            switch (Utility.Random(16))
            {
            case 0:
            case 1:
            case 2:                     // Poison them
            {
                m_Mobile.DebugSay("Attempting to poison");

                if (!c.Poisoned)
                {
                    spell = new PoisonSpell(m_Mobile, null);
                }

                break;
            }

            case 3:                     // Bless ourselves.
            {
                m_Mobile.DebugSay("Blessing myself");

                if (Utility.RandomBool() && !ArcaneEmpowermentSpell.IsBuffed(m_Mobile))
                {
                    spell = new ArcaneEmpowermentSpell(m_Mobile, null);
                }
                else
                {
                    spell = new BlessSpell(m_Mobile, null);
                }

                break;
            }

            case 4:                     // Wildfire
            {
                m_Mobile.DebugSay("Incendio!");

                spell = new WildfireSpell(m_Mobile, null);

                break;
            }

            case 5:                     // Reduce their cast speed
            {
                if (c.InRange(m_Mobile.Location, 6))
                {
                    if (m_Mobile.Skills[SkillName.Spellweaving].Value >= 90.0)
                    {
                        spell = new EssenceOfWindSpell(m_Mobile, null);
                    }
                    else if (c.InRange(m_Mobile.Location, 2))
                    {
                        spell = new ThunderstormSpell(m_Mobile, null);
                    }
                }

                m_Mobile.DebugSay("Attempting to reduce their cast speed");

                break;
            }

            case 6:                     // Curse them.
            {
                m_Mobile.DebugSay("Attempting to curse");

                spell = GetRandomCurseSpell(c);
                break;
            }

            case 7:                     // Paralyze them.
            {
                m_Mobile.DebugSay("Attempting to paralyze");

                if (m_Mobile.Skills[SkillName.Magery].Value > 50.0)
                {
                    spell = new ParalyzeSpell(m_Mobile, null);
                }

                break;
            }

            case 8:                     // Drain mana
            {
                m_Mobile.DebugSay("Attempting to drain mana");

                spell = GetRandomManaDrainSpell(c);
                break;
            }

            default:                     // Damage them.
            {
                m_Mobile.DebugSay("Just doing damage");

                spell = GetRandomDamageSpell(c);
                break;
            }
            }

            return(spell);
        }
Exemple #18
0
        public virtual Spell ChooseSpell(Mobile c)
        {
            Spell spell = CheckCastHealingSpell();

            if (spell != null)
            {
                return(spell);
            }

            double damage = ((m_Mobile.Skills[SkillName.SpiritSpeak].Value - c.Skills[SkillName.MagicResist].Value) / 10) + (c.Player ? 18 : 30);

            if (damage > c.Hits)
            {
                return(new PainSpikeSpell(m_Mobile, null));
            }

            switch (Utility.Random(20))
            {
            case 0:
            case 1:
            case 2:                     // Poison them
            {
                m_Mobile.DebugSay("Attempting to poison");

                if (!c.Poisoned)
                {
                    spell = new PoisonSpell(m_Mobile, null);
                }

                break;
            }

            case 3:                     // Bless ourselves.
            {
                m_Mobile.DebugSay("Blessing myself");

                spell = new BlessSpell(m_Mobile, null);
                break;
            }

            case 4:
            case 5:
            case 6:                     // Curse them.
            {
                m_Mobile.DebugSay("Attempting to curse");

                spell = GetRandomCurseSpell();
                break;
            }

            case 7:                     // Paralyze them.
            {
                m_Mobile.DebugSay("Attempting to paralyze");

                if (m_Mobile.Skills[SkillName.Magery].Value > 50.0)
                {
                    spell = new ParalyzeSpell(m_Mobile, null);
                }

                break;
            }

            case 8:                     // Drain mana
            {
                m_Mobile.DebugSay("Attempting to drain mana");

                spell = GetRandomManaDrainSpell();
                break;
            }

            case 9:
            case 10:                     // Blood oath them
            {
                m_Mobile.DebugSay("Attempting to blood oath");

                if (m_Mobile.Skills[SkillName.Necromancy].Value > 30 && BloodOathSpell.GetBloodOath(c) != m_Mobile)
                {
                    spell = new BloodOathSpell(m_Mobile, null);
                }

                break;
            }

            case 11:
            case 12:                     // Animate dead
            {
                m_Mobile.DebugSay("Attempting to animate dead");

                if ((m_Animated == null || !m_Animated.Alive) && m_Mobile.Skills[SkillName.Necromancy].Value > 40)
                {
                    spell = new AnimateDeadSpell(m_Mobile, null);
                }

                break;
            }

            case 13:
            case 14:
            {
                m_Mobile.DebugSay("Attempting to cast vengeful spirit");

                if (m_Mobile.Skills[SkillName.Necromancy].Value > 80 && (m_Mobile.Followers + 3) < m_Mobile.FollowersMax)
                {
                    spell = new VengefulSpiritSpell(m_Mobile, null);
                }

                break;
            }

            default:                     // Damage them.
            {
                m_Mobile.DebugSay("Just doing damage");

                spell = GetRandomDamageSpell();
                break;
            }
            }

            return(spell);
        }
Exemple #19
0
        public virtual Spell ChooseSpell(Mobile c)
        {
            if (!SmartAI)
            {
                if (ScaleByMagery(HealChance) > Utility.RandomDouble())
                {
                    if (m_Mobile.Hits < (m_Mobile.HitsMax - 50))
                    {
                        return(new GreaterHealSpell(m_Mobile, null));
                    }
                    else if (m_Mobile.Hits < (m_Mobile.HitsMax - 10))
                    {
                        return(new HealSpell(m_Mobile, null));
                    }
                }

                return(GetRandomDamageSpell());
            }

            Spell spell = null;

            int healChance = (m_Mobile.Hits == 0 ? m_Mobile.HitsMax : (m_Mobile.HitsMax / m_Mobile.Hits));

            switch (Utility.Random(4 + healChance))
            {
            default:
            case 0:                     // Heal ourself
            {
                if (m_Mobile.Hits < (m_Mobile.HitsMax - 50))
                {
                    spell = new GreaterHealSpell(m_Mobile, null);
                }
                else if (m_Mobile.Hits < (m_Mobile.HitsMax - 10))
                {
                    spell = new HealSpell(m_Mobile, null);
                }
                break;
            }

            case 1:                     // Poison them
            {
                if (!c.Poisoned)
                {
                    spell = new PoisonSpell(m_Mobile, null);
                }

                break;
            }

            case 2:                     // Deal some damage
            {
                spell = GetRandomDamageSpell();

                break;
            }

            case 3:                     // Set up a combo
            {
                if (m_Mobile.Mana < 40 && m_Mobile.Mana > 15)
                {
                    if (c.Paralyzed && !c.Poisoned)
                    {
                        m_Mobile.DebugSay("I am going to meditate");

                        m_Mobile.UseSkill(SkillName.Meditation);
                    }
                    else if (!c.Poisoned)
                    {
                        spell = new ParalyzeSpell(m_Mobile, null);
                    }
                }
                else if (m_Mobile.Mana > 60)
                {
                    if (Utility.Random(2) == 0 && !c.Paralyzed && !c.Frozen && !c.Poisoned)
                    {
                        m_Combo = 0;
                        spell   = new ParalyzeSpell(m_Mobile, null);
                    }
                    else
                    {
                        m_Combo = 1;
                        spell   = new ExplosionSpell(m_Mobile, null);
                    }
                }

                break;
            }
            }

            return(spell);
        }
Exemple #20
0
        public virtual Spell ChooseSpell(IDamageable d)
        {
            if (!(d is Mobile))
            {
                m_Mobile.DebugSay("Just doing damage");
                return(GetRandomDamageSpell());
            }

            Mobile c     = d as Mobile;
            Spell  spell = null;

            if (!SmartAI)
            {
                spell = CheckCastHealingSpell();

                if (spell != null)
                {
                    return(spell);
                }

                if (spell == null && m_Mobile.RawInt >= 80)
                {
                    spell = CheckCastDispelField();
                }

                switch (Utility.Random(15))
                {
                case 0:
                case 1:         // Poison them
                {
                    if (c.Poisoned || !CheckCast(3))
                    {
                        goto default;
                    }

                    m_Mobile.DebugSay("Attempting to poison");

                    spell = new PoisonSpell(m_Mobile, null);
                    break;
                }

                case 2:         // Bless ourselves
                {
                    if (BlessSpell.IsBlessed(m_Mobile) || !CheckCast(3))
                    {
                        goto default;
                    }

                    m_Mobile.DebugSay("Blessing myself");

                    spell = GetRandomBuffSpell();        //new BlessSpell(m_Mobile, null);
                    break;
                }

                case 3:
                case 4:     // Curse them
                {
                    m_Mobile.DebugSay("Attempting to curse");

                    spell = GetRandomCurseSpell();

                    if (spell == null)
                    {
                        goto default;
                    }
                    break;
                }

                case 5:         // Paralyze them
                {
                    m_Mobile.DebugSay("Attempting to paralyze");

                    if (CheckCast(5))
                    {
                        spell = new ParalyzeSpell(m_Mobile, null);
                    }
                    else
                    {
                        spell = GetRandomCurseSpell();
                    }

                    if (spell == null)
                    {
                        goto default;
                    }
                    break;
                }

                case 6:     // Drain mana
                {
                    m_Mobile.DebugSay("Attempting to drain mana");

                    spell = GetRandomManaDrainSpell();

                    if (spell == null)
                    {
                        goto default;
                    }
                    break;
                }

                default:     // Damage them
                {
                    m_Mobile.DebugSay("Just doing damage");

                    spell = GetRandomDamageSpell();
                    break;
                }
                }

                return(spell);
            }

            if (m_Mobile.Hidden)
            {
                return(null);
            }

            spell = CheckCastDispelField();

            if (spell == null)
            {
                spell = CheckCastHealingSpell();
            }

            if (spell == null && 0.05 >= Utility.RandomDouble())
            {
                spell = GetRandomBuffSpell();
            }

            else if (spell == null && m_Mobile.Followers + 1 < m_Mobile.FollowersMax && 0.05 >= Utility.RandomDouble())
            {
                spell = GetRandomSummonSpell();
            }

            else if (spell == null && 0.05 >= Utility.RandomDouble())
            {
                spell = GetRandomFieldSpell();
            }

            else if (spell == null && 0.05 >= Utility.RandomDouble())
            {
                spell = GetRandomManaDrainSpell();
            }

            if (spell != null)
            {
                return(spell);
            }

            switch (Utility.Random(3))
            {
            case 0:     // Poison them
            {
                if (c.Poisoned)
                {
                    goto case 1;
                }

                spell = new PoisonSpell(m_Mobile, null);
                break;
            }

            case 1:     // Deal some damage
            {
                spell = GetRandomDamageSpell();

                break;
            }

            default:     // Set up a combo
            {
                if (m_Mobile.Mana > 15 && m_Mobile.Mana < 40)
                {
                    if (c.Paralyzed && !c.Poisoned && !m_Mobile.Meditating)
                    {
                        m_Mobile.DebugSay("I am going to meditate");

                        m_Mobile.UseSkill(SkillName.Meditation);
                    }
                    else if (!c.Poisoned)
                    {
                        spell = new ParalyzeSpell(m_Mobile, null);
                    }
                }
                else if (m_Mobile.Mana > 60)
                {
                    if (Utility.RandomBool() && !c.Paralyzed && !c.Frozen && !c.Poisoned)
                    {
                        m_Combo = 0;
                        spell   = new ParalyzeSpell(m_Mobile, null);
                    }
                    else
                    {
                        m_Combo = 1;
                        spell   = new ExplosionSpell(m_Mobile, null);
                    }
                }

                break;
            }
            }

            return(spell);
        }
Exemple #21
0
        public virtual Spell ChooseSpell(Mobile c)
        {
            Spell spell = this.CheckCastHealingSpell();

            if (spell != null)
            {
                return(spell);
            }

            double damage = ((this.m_Mobile.Skills[SkillName.SpiritSpeak].Value - c.Skills[SkillName.MagicResist].Value) / 10) + (c.Player ? 18 : 30);

            if (damage > c.Hits)
            {
                spell = new ManaDrainSpell(this.m_Mobile, null);
            }

            switch (Utility.Random(16))
            {
            case 0:
            case 1:
            case 2:     // Poison them
            {
                this.m_Mobile.DebugSay("Attempting to BloodOath");

                if (!c.Poisoned)
                {
                    spell = new BloodOathSpell(this.m_Mobile, null);
                }

                break;
            }

            case 3:     // Bless ourselves.
            {
                this.m_Mobile.DebugSay("Blessing myself");

                spell = new BlessSpell(this.m_Mobile, null);
                break;
            }

            case 4:
            case 5:
            case 6:     // Curse them.
            {
                this.m_Mobile.DebugSay("Attempting to curse");

                spell = this.GetRandomCurseSpell();
                break;
            }

            case 7:     // Paralyze them.
            {
                this.m_Mobile.DebugSay("Attempting to paralyze");

                if (this.m_Mobile.Skills[SkillName.Magery].Value > 50.0)
                {
                    spell = new ParalyzeSpell(this.m_Mobile, null);
                }

                break;
            }

            case 8:     // Drain mana
            {
                this.m_Mobile.DebugSay("Attempting to drain mana");

                spell = this.GetRandomManaDrainSpell();
                break;
            }

            case 9:     // Blood oath them
            {
                this.m_Mobile.DebugSay("Attempting to blood oath");

                if (this.m_Mobile.Skills[SkillName.Necromancy].Value > 30 && BloodOathSpell.GetBloodOath(c) != this.m_Mobile)
                {
                    spell = new BloodOathSpell(this.m_Mobile, null);
                }

                break;
            }
            }

            return(spell);
        }
Exemple #22
0
        public virtual Spell ChooseSpell(Mobile c)
        {
            Spell spell = null;

            if (!SmartAI)
            {
                spell = CheckCastHealingSpell();

                if (spell != null)
                {
                    return(spell);
                }

                switch (Utility.Random(14))
                {
                case 0:
                case 1:
                case 2:
                {
                    goto case 6;
                }

                case 3:
                case 4:
                case 5:
                case 6:                         // Paralyze them.
                {
                    m_Mobile.DebugSay("Attempting to paralyze");

                    if (m_Mobile.Skills[SkillName.Magery].Value > 50.0)
                    {
                        spell = new ParalyzeSpell(m_Mobile, null);
                    }
                    goto default;
                }

                case 7:                         // Drain mana
                {
                    m_Mobile.DebugSay("Attempting to drain mana");

                    spell = GetRandomManaDrainSpell();
                    break;
                }

                default:                         // Damage them.
                {
                    m_Mobile.DebugSay("Just doing damage");

                    spell = GetRandomDamageSpell();
                    break;
                }
                }

                return(spell);
            }

            spell = CheckCastHealingSpell();

            if (spell != null)
            {
                return(spell);
            }

            switch (Utility.Random(2))
            {
            default:
            case 0:                     // Deal some damage
            {
                spell = GetRandomDamageSpell();

                break;
            }

            case 1:                     // Set up a combo
            {
                if (m_Mobile.Mana < 40 && m_Mobile.Mana > 15)
                {
                    spell = new ParalyzeSpell(m_Mobile, null);
                }
                else if (m_Mobile.Mana > 60)
                {
                    if (Utility.Random(2) == 0 && !c.Paralyzed && !c.Frozen && !c.Poisoned)
                    {
                        m_Combo = 0;
                        spell   = new ParalyzeSpell(m_Mobile, null);
                    }
                    else
                    {
                        m_Combo = 3;
                        spell   = new ExplosionSpell(m_Mobile, null);
                    }
                }

                break;
            }
            }

            return(spell);
        }