using System;
using Server;
using Server.Spells;
using Server.Network;
using Server.Mobiles;
using Server.Items;
namespace Server.Spells.SkillMasteries
{
public class DeathRaySpell : SkillMasterySpell
{
/*The mage focuses a death ray on their opponent which snares the mage to their
* location and does damage based on magery skill, evaluating intelligence skill,
* and mastery level as long as the mage has mana and the target is in range.*/
// BuffIcon: 1155798 ~1_STR~ Energy Resist.
~2_DAM~ energy damage every 3 seconds while death ray remains in effect.
private static SpellInfo m_Info = new SpellInfo(
"Death Ray", "In Grav Corp",
204,
9061,
Reagent.BlackPearl,
Reagent.Bloodmoss,
Reagent.SpidersSilk
);
private Point3D _Location;
private ResistanceMod _Mod;
public override double UpKeep { get { return 35; } }
public override int RequiredMana{ get { return 50; } }
public override int DamageThreshold { get { return 1; } }
public override bool DamageCanDisrupt { get { return true; } }
public override double TickTime { get { return 3; } }
public override int UpkeepCancelMessage { get { return 1155874; } } // You do not have enough mana to keep your death ray active.
public override int DisruptMessage { get { return 1155793; } } // This action disturbs the focus necessary to keep your death ray active and it dissipates.
public override TimeSpan ExpirationPeriod { get { return TimeSpan.FromMinutes(360); } }
public override SkillName CastSkill { get { return SkillName.Magery; } }
public override SkillName DamageSkill { get { return SkillName.EvalInt; } }
public DeathRaySpell(Mobile caster, Item scroll)
: base(caster, scroll, m_Info)
{
}
public override void OnCast()
{
Caster.Target = new MasteryTarget(this);
}
protected override void OnTarget(object o)
{
Mobile m = o as Mobile;
if (m != null)
{
if (GetSpell(Caster, m) != null)
{
Caster.SendLocalizedMessage(1156094); // Your target is already under the effect of this ability.
}
else if (CheckHSequence(m))
{
if (CheckResisted(m))
{
m.SendLocalizedMessage(1156101); // You resist the effects of death ray.
Caster.SendLocalizedMessage(1156102); // Your target resists the effects of death ray.
}
else
{
SpellHelper.CheckReflect(0, Caster, ref m);
_Location = Caster.Location;
m.FixedParticles(0x374A, 1, 15, 5054, 0x7A2, 7, EffectLayer.Head);
Caster.FixedParticles(0x0000, 10, 5, 2054, EffectLayer.Head);
double damage = (Caster.Skills[CastSkill].Base + Caster.Skills[DamageSkill].Base) * ((double)GetMasteryLevel() * .8);
damage /= Target is PlayerMobile ? 5.15 : 2.5;
int mod = (int)Caster.Skills[DamageSkill].Value / 12;
_Mod = new ResistanceMod(ResistanceType.Energy, -mod);
m.AddResistanceMod(_Mod);
BuffInfo.AddBuff(Caster, new BuffInfo(BuffIcon.DeathRay, 1155896, 1156085, String.Format("{0}\t{1}", ((int)damage).ToString(), m.Name))); // Deals ~2_DAMAGE~ to ~1_NAME~ every 3 seconds while in range. Preforming any action will end spell.
BuffInfo.AddBuff(m, new BuffInfo(BuffIcon.DeathRayDebuff, 1155896, 1156086, mod.ToString())); // Energy Resist Debuff: ~1_VAL~%
Target = m;
BeginTimer();
}
}
}
}
public override void EndEffects()
{
if (Target != null && _Mod != null)
Target.RemoveResistanceMod(_Mod);
BuffInfo.RemoveBuff(Caster, BuffIcon.DeathRay);
if(Target != null)
BuffInfo.RemoveBuff(Target, BuffIcon.DeathRayDebuff);
}
public override bool OnTick()
{
if (!base.OnTick())
return false;
if (Target == Caster || !Target.Alive)
{
Expire();
Caster.SendLocalizedMessage(1156097); // Your ability was interrupted.
}
else if (Caster.Location != _Location)
{
Expire(true);
return false;
}
else
{
double damage = (Caster.Skills[CastSkill].Base + Caster.Skills[DamageSkill].Base) * ((double)GetMasteryLevel() * .8);
damage /= Target is PlayerMobile ? 5.15 : 2.5;
damage *= GetDamageScalar(Target);
int sdiBonus = SpellHelper.GetSpellDamageBonus(Caster, Target, CastSkill, Caster.Player && Target.Player);
damage *= (100 + sdiBonus);
damage /= 100;
SpellHelper.Damage(this, Target, (int)damage, 0, 0, 0, 0, 100);
}
return true;
}
}
}