public override bool DoActionCombat() { Mobile c = m_Mobile.Combatant; m_Mobile.Warmode = true; if (c == null || c.Deleted || !c.Alive || c.IsDeadBondedPet || !m_Mobile.CanSee(c) || !m_Mobile.CanBeHarmful(c, false) || c.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)) { if (m_Mobile.Debug) { m_Mobile.DebugSay("Something happened to my combatant, so I am going to fight {0}", m_Mobile.FocusMob.Name); } m_Mobile.Combatant = c = m_Mobile.FocusMob; m_Mobile.FocusMob = null; } else { m_Mobile.DebugSay("Something happened to my combatant, and nothing is around. I am on guard."); Action = ActionType.Guard; return(true); } } if (!m_Mobile.InLOS(c)) { if (AcquireFocusMob(m_Mobile.RangePerception, m_Mobile.FightMode, false, false, true)) { m_Mobile.Combatant = c = m_Mobile.FocusMob; m_Mobile.FocusMob = null; } } if (SmartAI && !m_Mobile.StunReady && m_Mobile.Skills[SkillName.Wrestling].Value >= 80.0 && m_Mobile.Skills[SkillName.Anatomy].Value >= 80.0) { EventSink.InvokeStunRequest(new StunRequestEventArgs(m_Mobile)); } if (!m_Mobile.InRange(c, m_Mobile.RangePerception)) { // They are somewhat far away, can we find something else? if (AcquireFocusMob(m_Mobile.RangePerception, m_Mobile.FightMode, false, false, true)) { m_Mobile.Combatant = m_Mobile.FocusMob; m_Mobile.FocusMob = null; } else if (!m_Mobile.InRange(c, m_Mobile.RangePerception * 3)) { m_Mobile.Combatant = null; } c = m_Mobile.Combatant; if (c == null) { m_Mobile.DebugSay("My combatant has fled, so I am on guard"); Action = ActionType.Guard; return(true); } } if (!m_Mobile.Controlled && !m_Mobile.Summoned) { if (m_Mobile.Hits < m_Mobile.HitsMax * 20 / 100) { // We are low on health, should we flee? bool flee = false; if (m_Mobile.Hits < c.Hits) { // We are more hurt than them int diff = c.Hits - m_Mobile.Hits; flee = (Utility.Random(0, 100) > (10 + diff)); // (10 + diff)% chance to flee } else { flee = Utility.Random(0, 100) > 10; // 10% chance to flee } if (flee) { if (m_Mobile.Debug) { m_Mobile.DebugSay("I am going to flee from {0}", c.Name); } Action = ActionType.Flee; return(true); } } } if (m_Mobile.Spell == null && DateTime.Now > m_NextCastTime && m_Mobile.InRange(c, 12)) { // We are ready to cast a spell Spell spell = null; Mobile toDispel = FindDispelTarget(true); if (m_Mobile.Poisoned) // Top cast priority is cure { spell = new CureSpell(m_Mobile, null); } else if (toDispel != null) // Something dispellable is attacking us { spell = DoDispel(toDispel); } else if (SmartAI && m_Combo != -1) // We are doing a spell combo { spell = DoCombo(c); } else if (SmartAI && (c.Spell is HealSpell || c.Spell is GreaterHealSpell) && !c.Poisoned) // They have a heal spell out { spell = new PoisonStrikeSpell(m_Mobile, null); } else { spell = ChooseSpell(c); } // Now we have a spell picked // Move first before casting if (SmartAI && toDispel != null) { if (m_Mobile.InRange(toDispel, 10)) { RunFrom(toDispel); } else if (!m_Mobile.InRange(toDispel, 12)) { RunTo(toDispel); } } else { RunTo(c); } if (spell != null && spell.Cast()) { TimeSpan delay; if (SmartAI || (spell is DispelSpell)) { delay = TimeSpan.FromSeconds(m_Mobile.ActiveSpeed); } else { double del = ScaleByNecromancy(3.0); double min = 6.0 - (del * 0.75); double max = 6.0 - (del * 1.25); delay = TimeSpan.FromSeconds(min + ((max - min) * Utility.RandomDouble())); } m_NextCastTime = DateTime.Now + delay; } } else if (m_Mobile.Spell == null || !m_Mobile.Spell.IsCasting) { RunTo(c); } return(true); }
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()); } 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(5 + healChance)) { case 0: // Heal myself { if (!m_Mobile.Summoned) { if (m_Mobile.Hits < (m_Mobile.HitsMax - 50)) { m_Mobile.UseSkill(SkillName.SpiritSpeak); } else if (m_Mobile.Hits < (m_Mobile.HitsMax - 10)) { m_Mobile.UseSkill(SkillName.SpiritSpeak); } } break; } case 1: // PoisonStrike them { if (!c.Poisoned) { spell = new PoisonStrikeSpell(m_Mobile, null); } break; } case 2: // Deal some damage { spell = GetRandomDamageSpell(); break; } case 3: // Set up a combo of attacks { if (m_Mobile.Mana < 30 && 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 PoisonSpell(m_Mobile, null); } } else if (m_Mobile.Mana > 30 && m_Mobile.Mana < 80) { if (Utility.Random(2) == 0 && !c.Paralyzed && !c.Frozen && !c.Poisoned) { m_Combo = 0; spell = new PainSpikeSpell(m_Mobile, null); } else { m_Combo = 1; spell = new MindRotSpell(m_Mobile, null); } } break; } case 4: //Combo to soften our enemies with a powerful attack while we have max mana amounts { if (m_Mobile.Mana > 80) { if (Utility.Random(2) == 0 && !c.Paralyzed && !c.Frozen && !c.Poisoned) { m_Combo = 0; spell = new VengefulSpiritSpell(m_Mobile, null); } else { m_Combo = 1; spell = new PoisonStrikeSpell(m_Mobile, null); } } break; } } return(spell); }
public virtual Spell DoCombo(Mobile c) { Spell spell = null; m_Mobile.DebugSay("Doing Combo"); if (m_Combo == 0) { m_Mobile.DebugSay(" Casting Explosion and moving to the next spell "); spell = new ExplosionSpell(m_Mobile, null); ++m_Combo; // Move to next spell } else if (m_Combo == 1) { if (m_Mobile.Skills[SkillName.Magery].Value * Utility.RandomDouble() > m_Mobile.Skills[SkillName.Necromancy].Value * Utility.RandomDouble()) { spell = new FlameStrikeSpell(m_Mobile, null); m_Mobile.DebugSay("Casting Flamestrike and moving to the next spell "); } else { spell = new PoisonStrikeSpell(m_Mobile, null); m_Mobile.DebugSay("Casting Poison Strike and moving to the next spell "); } ++m_Combo; // Move to next spell } else if (m_Combo == 2) { m_Mobile.DebugSay("Casting maybe poison and moving to next spell"); if (!c.Poisoned && (!(c is BaseCreature) || (((BaseCreature)c).PoisonImmune != null && ((BaseCreature)m_Mobile).HitPoison != null && ((BaseCreature)c).PoisonImmune.Level < ((BaseCreature)m_Mobile).HitPoison.Level) || ((BaseCreature)c).PoisonImmune == null)) { spell = new PoisonSpell(m_Mobile, null); } else { spell = new PainSpikeSpell(m_Mobile, null); } ++m_Combo; // Move to next spell } else if (m_Combo == 3 && spell == null) { switch (Utility.Random(3)) { default: case 0: { m_Mobile.DebugSay("Casting small spell"); spell = GetSmallDamageSpell(); m_Mobile.DebugSay("Moving to next spell"); ++m_Combo; // Move to next spell break; } case 1: { m_Mobile.DebugSay("Casting Strangle and resetting combo"); spell = new StrangleSpell(m_Mobile, null); m_Combo = -1; // Reset combo state break; } case 2: { m_Mobile.DebugSay("Casting small spell"); spell = GetSmallDamageSpell(); break; } } } else if (m_Combo == 4 && spell == null) { m_Mobile.DebugSay("Casting Vengeful Spirit and resetting combo"); spell = new VengefulSpiritSpell(m_Mobile, null); m_Combo = -1; } return(spell); }
public virtual Spell ChooseSpell(Mobile c) { Spell spell = null; int healChance = (m_Mobile.Hits == 0 ? m_Mobile.HitsMax : (m_Mobile.HitsMax / m_Mobile.Hits)); int spellResult; double witherChance = .10; //05% chance to wither per enemy in range m_Mobile.DebugSay("Choosing a Spell"); spellResult = Utility.Random(4 + healChance); m_Mobile.DebugSay("Chose " + spellResult); switch (spellResult) { case 0: // Heal myself { m_Mobile.DebugSay("0. Heal"); 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); } break; } case 1: // PoisonStrike them { m_Mobile.DebugSay("1. Poison Strike or Pfield or Ffield"); if (!c.Poisoned && (!(c is BaseCreature) || (((BaseCreature)c).PoisonImmune != null && ((BaseCreature)m_Mobile).HitPoison != null && ((BaseCreature)c).PoisonImmune.Level < ((BaseCreature)m_Mobile).HitPoison.Level) || ((BaseCreature)c).PoisonImmune == null)) { if (Utility.RandomDouble() > .5) { spell = new PoisonStrikeSpell(m_Mobile, null); } else { spell = new PoisonFieldSpell(m_Mobile, null); //need to do targeting on fields } } else if (Utility.RandomDouble() > .5) { spell = new FireFieldSpell(m_Mobile, null); } else { spell = new FlameStrikeSpell(m_Mobile, null); } break; } case 2: // Deal some damage { List <Mobile> targets = new List <Mobile>(); BaseCreature cbc = m_Mobile as BaseCreature; bool isMonster = (cbc != null && !cbc.Controlled && !cbc.Summoned); //check if enough wither targets. foreach (Mobile m in m_Mobile.GetMobilesInRange(Core.ML ? 4 : 5)) { if (m_Mobile != m && m_Mobile.InLOS(m) && (isMonster || SpellHelper.ValidIndirectTarget(m_Mobile, m)) && m_Mobile.CanBeHarmful(m, false)) { /* * if (isMonster) * { * if (m is BaseCreature) * { * BaseCreature bc = (BaseCreature)m; * * if (!bc.Controlled && !bc.Summoned && bc.Team == cbc.Team) * continue; * } * else if (!m.Player) * { * continue; * } * } */ targets.Add(m); } } if (targets.Count * witherChance > Utility.RandomDouble()) { m_Mobile.DebugSay("2. Wither"); spell = new WitherSpell(m_Mobile, null); } else { spell = GetRandomDamageSpell(); m_Mobile.DebugSay("2. Random Spell"); } break; } case 3: // Set up a combo of attacks { if (m_Mobile.Mana < 30 && 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 && (!(c is BaseCreature) || (((BaseCreature)c).PoisonImmune != null && ((BaseCreature)m_Mobile).HitPoison != null && ((BaseCreature)c).PoisonImmune.Level < ((BaseCreature)m_Mobile).HitPoison.Level) || ((BaseCreature)c).PoisonImmune == null)) { m_Mobile.DebugSay("3. Casting Poison"); spell = new PoisonSpell(m_Mobile, null); } } else if (m_Mobile.Mana > 30 && m_Mobile.Mana < 80) { if (Utility.Random(2) == 0 && !c.Paralyzed && !c.Frozen && !c.Poisoned) { m_Mobile.DebugSay("3. Pain Spike (Explo)"); m_Combo = 0; spell = new PainSpikeSpell(m_Mobile, null); } else { m_Mobile.DebugSay("3. Mind Rot or Curse (FS)"); m_Combo = 1; if (Utility.RandomBool()) { spell = new CurseSpell(m_Mobile, null); } else { spell = new MindRotSpell(m_Mobile, null); } } } else { if (Utility.Random(2) == 0 && !c.Paralyzed && !c.Frozen && !c.Poisoned) { m_Mobile.DebugSay("4. Vengeful Spirit (Explo)"); m_Combo = 0; spell = new VengefulSpiritSpell(m_Mobile, null); } else { m_Mobile.DebugSay("4. Poison Strike (FS)"); m_Combo = 1; spell = new PoisonStrikeSpell(m_Mobile, null); } } break; } } return(spell); }
public override Spell DoCombo(Mobile c) { Spell spell = null; if (m_NecroComboType == NecroComboType.None) { m_NecroComboType = (NecroComboType)Utility.RandomMinMax(1, 7); m_Combo = 0; m_Mobile.DebugSay("Doing {0} Combo", m_NecroComboType); } if (m_Combo == 0) { switch (m_NecroComboType) { case NecroComboType.Exp_FS_Omen_Poison_PS: case NecroComboType.Exp_MB_Omen_Poison_PS: case NecroComboType.Exp_EB_Omen_Poison_PS: case NecroComboType.Exp_FB_MA_Poison_PS: case NecroComboType.Exp_FB_Poison_PS: case NecroComboType.Exp_FB_MA_PS: case NecroComboType.Exp_Poison_FB_PS: spell = new ExplosionSpell(m_Mobile, null); break; } ++m_Combo; } else if (m_Combo == 1) { switch (m_NecroComboType) { case NecroComboType.Exp_FS_Omen_Poison_PS: spell = new FlameStrikeSpell(m_Mobile, null); break; case NecroComboType.Exp_MB_Omen_Poison_PS: spell = new MindBlastSpell(m_Mobile, null); break; case NecroComboType.Exp_EB_Omen_Poison_PS: spell = new EnergyBoltSpell(m_Mobile, null); break; case NecroComboType.Exp_FB_MA_Poison_PS: case NecroComboType.Exp_FB_Poison_PS: case NecroComboType.Exp_FB_MA_PS: spell = new FireballSpell(m_Mobile, null); break; case NecroComboType.Exp_Poison_FB_PS: spell = new PoisonSpell(m_Mobile, null); break; } ++m_Combo; } else if (m_Combo == 2) { switch (m_NecroComboType) { case NecroComboType.Exp_FS_Omen_Poison_PS: case NecroComboType.Exp_MB_Omen_Poison_PS: case NecroComboType.Exp_EB_Omen_Poison_PS: spell = new EvilOmenSpell(m_Mobile, null); break; case NecroComboType.Exp_FB_MA_Poison_PS: spell = new MagicArrowSpell(m_Mobile, null); break; case NecroComboType.Exp_FB_Poison_PS: spell = new PoisonSpell(m_Mobile, null); break; case NecroComboType.Exp_FB_MA_PS: spell = new MagicArrowSpell(m_Mobile, null); break; case NecroComboType.Exp_Poison_FB_PS: spell = new FireballSpell(m_Mobile, null); break; } ++m_Combo; } else if (m_Combo == 3) { switch (m_NecroComboType) { case NecroComboType.Exp_FS_Omen_Poison_PS: case NecroComboType.Exp_MB_Omen_Poison_PS: case NecroComboType.Exp_EB_Omen_Poison_PS: case NecroComboType.Exp_FB_MA_Poison_PS: case NecroComboType.Exp_FB_Poison_PS: spell = new PoisonSpell(m_Mobile, null); break; case NecroComboType.Exp_FB_MA_PS: case NecroComboType.Exp_Poison_FB_PS: if (Utility.RandomBool()) { spell = new PoisonStrikeSpell(m_Mobile, null); } else { spell = new PainSpikeSpell(m_Mobile, null); } EndCombo(); return(spell); } ++m_Combo; } else if (m_Combo == 4) { switch (m_NecroComboType) { case NecroComboType.Exp_FS_Omen_Poison_PS: case NecroComboType.Exp_MB_Omen_Poison_PS: case NecroComboType.Exp_EB_Omen_Poison_PS: case NecroComboType.Exp_FB_MA_Poison_PS: case NecroComboType.Exp_FB_Poison_PS: case NecroComboType.Exp_FB_MA_PS: case NecroComboType.Exp_Poison_FB_PS: if (Utility.RandomBool()) { spell = new PoisonStrikeSpell(m_Mobile, null); } else { spell = new PainSpikeSpell(m_Mobile, null); } EndCombo(); return(spell); } } return(spell); }
public virtual Spell DoCombo(Mobile c) { Spell spell = null; if (m_Combo == 0) { spell = new PoisonStrikeSpell(m_Mobile, null); ++m_Combo; // Move to next spell } else if (m_Combo == 1) { spell = new WitherSpell(m_Mobile, null); ++m_Combo; // Move to next spell } else if (m_Combo == 2) { if (!c.Poisoned) { spell = new MindRotSpell(m_Mobile, null); } ++m_Combo; // Move to next spell } if (m_Combo == 3 && spell == null) { switch (Utility.Random(3)) { default: case 0: { if (c.Int < c.Dex) { spell = new StrangleSpell(m_Mobile, null); } else { spell = new EvilOmenSpell(m_Mobile, null); } ++m_Combo; // Move to next spell break; } case 1: { spell = new PoisonStrikeSpell(m_Mobile, null); m_Combo = -1; // Reset combo state break; } case 2: { spell = new WitherSpell(m_Mobile, null); m_Combo = -1; // Reset combo state break; } } } else if (m_Combo == 4 && spell == null) { spell = new VengefulSpiritSpell(m_Mobile, null); m_Combo = -1; } return(spell); }