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);
});
}
}
}