using System; using System.Collections.Generic; using Server; using Server.Spells; using Server.Network; using Server.Mobiles; using Server.Spells.Ninjitsu; using Server.Spells.Seventh; using Server.Spells.Sixth; using Server.Spells.Fifth; using Server.Items; namespace Server.Spells.SkillMasteries { public class WhiteTigerFormSpell : SkillMasterySpell { private static SpellInfo m_Info = new SpellInfo( "White Tiger Form", "", -1, 9002 ); public override int RequiredMana { get { return 10; } } public override SkillName CastSkill { get { return SkillName.Ninjitsu; } } public override SkillName DamageSkill { get { return SkillName.Stealth; } } public override bool BlockedByAnimalForm { get { return false; } } public override bool BlocksMovement { get { return false; } } public override int CastRecoveryBase { get { return (Core.ML ? 10 : base.CastRecoveryBase); } } public WhiteTigerFormSpell(Mobile caster, Item scroll) : base(caster, scroll, m_Info) { } public override void SendCastEffect() { Caster.FixedEffect(0x37C4, 87, (int)(GetCastDelay().TotalSeconds * 28), 0x66C, 3); } public static void AutoCast(Mobile m) { var spell = new WhiteTigerFormSpell(m, null); spell.Cast(); } public override bool CheckCast() { if (!Caster.CanBeginAction(typeof(PolymorphSpell))) { Caster.SendLocalizedMessage(1061628); // You can't do that while polymorphed. return false; } else if (TransformationSpellHelper.UnderTransformation(Caster)) { Caster.SendLocalizedMessage(1063219); // You cannot mimic an animal while in that form. return false; } else if (DisguiseTimers.IsDisguised(Caster)) { Caster.SendLocalizedMessage(1061631); // You can't do that while disguised. return false; } return base.CheckCast(); } public override bool CheckFizzle() { // Spell is initially always successful, and with no skill gain. return true; } public override void OnCast() { if (!Caster.CanBeginAction(typeof(PolymorphSpell))) { Caster.SendLocalizedMessage(1061628); // You can't do that while polymorphed. } else if (TransformationSpellHelper.UnderTransformation(Caster)) { Caster.SendLocalizedMessage(1063219); // You cannot mimic an animal while in that form. } else if (!Caster.CanBeginAction(typeof(IncognitoSpell)) || (Caster.IsBodyMod && AnimalForm.GetContext(Caster) == null)) { DoFizzle(); } else if (CheckSequence()) { AnimalFormContext context = AnimalForm.GetContext(Caster); int mana = ScaleMana(RequiredMana); Ninjitsu.AnimalForm.AddLastAnimalForm(Caster, 16); if (mana > Caster.Mana) { Caster.SendLocalizedMessage(1060174, mana.ToString()); // You must have at least ~1_MANA_REQUIREMENT~ Mana to use this ability. } else if (context != null) { AnimalForm.RemoveContext(Caster, context, true); Caster.Mana -= mana; BuffInfo.RemoveBuff(Caster, BuffIcon.WhiteTigerForm); return; } else { double ninjitsu = Caster.Skills.Ninjitsu.Value; if (ninjitsu < RequiredSkill + 37.5) { double chance = (ninjitsu - RequiredSkill) / 37.5; if (chance < Utility.RandomDouble()) { DoFizzle(); return; } } } Caster.FixedParticles(0x3728, 10, 13, 2023, EffectLayer.Waist); Caster.Mana -= mana; Caster.CheckSkill(SkillName.Ninjitsu, 0.0, 90.0); BaseMount.Dismount(Caster); int bodyMod = Caster.Female ? 1255 : 1254; int hueMod = 2500; Caster.BodyMod = bodyMod; Caster.HueMod = hueMod; Caster.SendSpeedControl(SpeedControlType.MountSpeed); Timer timer = new AnimalFormTimer(Caster, bodyMod, hueMod); timer.Start(); int skills = (int)((Caster.Skills[CastSkill].Value + Caster.Skills[DamageSkill].Value + (GetMasteryLevel() * 40)) / 3); AnimalForm.AddContext(Caster, new AnimalFormContext(timer, null, true, typeof(WildWhiteTiger), null)); Caster.CheckStatTimers(); int bleedMod = (int)(((Caster.Skills[SkillName.Ninjitsu].Value + Caster.Skills[SkillName.Stealth].Value + (GetMasteryLevel() * 40)) / 3) / 10); BuffInfo.AddBuff(Caster, new BuffInfo(BuffIcon.WhiteTigerForm, 1155911, 1156060, String.Format("{0}\t{1}\t{2}\t{3}", "20", "5", "", bleedMod.ToString()))); // +~1_ARG~ Defense Chance Increase.
+~2_ARG~ Max Defense Chance Increase Cap.
Chance to evade attacks.
Applies bleed to victim with a max damage of ~4_ARG~. Caster.Delta(MobileDelta.WeaponDamage); } FinishSequence(); } public static bool CheckEvasion(Mobile m) { if (IsActive(m)) return MasteryInfo.GetMasteryLevel(m, SkillName.Ninjitsu) + 2 > Utility.Random(100); return false; } public static int GetDamageBonus(Mobile m) { AnimalFormContext context = AnimalForm.GetContext(m); if (context != null && context.Type == typeof(WildWhiteTiger)) return (int)(((m.Skills[SkillName.Ninjitsu].Value + m.Skills[SkillName.Stealth].Value + (MasteryInfo.GetMasteryLevel(m, SkillName.Ninjitsu) * 40)) / 3) / 10) / 2; return 0; } public static bool IsActive(Mobile m) { AnimalFormContext context = AnimalForm.GetContext(m); return context != null && context.Type == typeof(WildWhiteTiger); } public static int GetDefenseCap(Mobile m) { AnimalFormContext context = AnimalForm.GetContext(m); if (context != null && context.Type == typeof(WildWhiteTiger)) return 5; return 0; } public static void OnHit(Mobile attacker, Mobile defender) { CheckTable(); int damage; if (!HasBleedMod(attacker, out damage) || (_Table != null && _Table.ContainsKey(attacker))) return; double bleedchance = (double)((attacker.Skills.Ninjitsu.Value + attacker.Skills.Stealth.Value + (MasteryInfo.GetMasteryLevel(attacker, SkillName.Ninjitsu) * 40)) / 3.0) / 15.0; if (bleedchance > Utility.RandomDouble()) { BleedAttack.BeginBleed(defender, attacker, false); if (_Table == null) _Table = new Dictionary(); _Table[attacker] = DateTime.UtcNow + TimeSpan.FromMinutes(1); } } public static bool HasBleedMod(Mobile m, out int damage) { CheckTable(); damage = GetDamageBonus(m); return damage > 0; } private static Dictionary _Table; private static void CheckTable() { if (_Table == null) return; ColUtility.ForEach(_Table, (mob, expires) => { if (expires < DateTime.UtcNow) _Table.Remove(mob); }); } } }