using Server.Mobiles;
using System;
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 readonly 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 => 35;
public override int RequiredMana => 50;
public override int DamageThreshold => 0;
public override bool DamageCanDisrupt => true;
public override double TickTime => 3;
public override int UpkeepCancelMessage => 1155874; // You do not have enough mana to keep your death ray active.
public override int DisruptMessage => 1155793; // This action disturbs the focus necessary to keep your death ray active and it dissipates.
public override TimeSpan ExpirationPeriod => TimeSpan.FromMinutes(360);
public override SkillName CastSkill => SkillName.Magery;
public override SkillName DamageSkill => 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(this, 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) * (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) * (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;
}
}
}