Files
Unstable Kitsune b918192e4e Overwrite
Complete Overwrite of the Folder with the free shard. ServUO 57.3 has been added.
2023-11-28 23:20:26 -05:00

167 lines
4.7 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using Server;
using Server.Spells;
using Server.Network;
using Server.Mobiles;
using Server.Targeting;
/*Target Strength Reduced by up to 32, 20 60 Damage (Physical), every 2 seconds,
affected by the target's magic resistance. (PvP and specific Mobs only).*/
namespace Server.Spells.SkillMasteries
{
public class DespairSpell : BardSpell
{
public static readonly string ModName = "Despair";
private static SpellInfo m_Info = new SpellInfo(
"Despair", "Kal Des Mani Tym",
-1,
9002
);
public override double RequiredSkill{ get { return 90; } }
public override double UpKeep { get { return 12; } }
public override int RequiredMana{ get { return 26; } }
public override bool PartyEffects { get { return false; } }
public override SkillName CastSkill { get { return SkillName.Discordance; } }
public override double SlayerBonus { get { return 3.0; } }
private int m_StatMod;
private int m_Damage;
private int m_Rounds;
public DespairSpell( Mobile caster, Item scroll ) : base(caster, scroll, m_Info)
{
}
public override void OnCast()
{
BardSpell spell = SkillMasterySpell.GetSpell(Caster, this.GetType()) as BardSpell;
if(spell != null)
{
spell.Expire();
Caster.SendLocalizedMessage(1115774); //You halt your spellsong.
}
else
{
Caster.Target = new InternalTarget(this);
}
}
public void OnTarget( Mobile m )
{
if ( !Caster.CanSee( m ) )
{
Caster.SendLocalizedMessage( 500237 ); // Target can not be seen.
}
else if (!m.Alive)
{
Caster.SendLocalizedMessage(1115773); // Your target is dead.
}
else if (Caster == m)
{
// TODO: Message?
}
else if (BardSpell.HasHarmfulEffects(m, this.GetType()))
{
Caster.SendLocalizedMessage(1115772); //Your target is already under the effect of this spellsong.
}
else if (CheckHSequence(m))
{
SpellHelper.Turn(Caster, m);
Target = m;
//Caster.SendLocalizedMessage(1234567); //TODO: Message?
HarmfulSpell(m);
m.FixedParticles(0x374A, 10, 15, 5028, EffectLayer.Waist);
int rounds = 5 + (int)((double)BaseSkillBonus * .75);
m_StatMod = (int)((BaseSkillBonus * 2) + CollectiveBonus);
m_Damage = (int)((BaseSkillBonus * 4.5) + (CollectiveBonus * 2));
m_Rounds = 5 + (int)((BaseSkillBonus * .75) + (CollectiveBonus / 2));
string args = String.Format("{0}\t{1}", m_StatMod, m_Damage);
BuffInfo.AddBuff(m, new BuffInfo(BuffIcon.DespairTarget, 1115741, 1115743, args.ToString()));
BuffInfo.AddBuff(Caster, new BuffInfo(BuffIcon.DespairCaster, 1115741, 1115743, args.ToString()));
BeginTimer();
}
FinishSequence();
}
public override void EndEffects()
{
BuffInfo.RemoveBuff(Target, BuffIcon.DespairTarget);
BuffInfo.RemoveBuff(Caster, BuffIcon.DespairCaster);
}
public override void AddStatMods()
{
int offset = m_StatMod;
if(Target != null)
Target.AddStatMod(new StatMod(StatType.Str, ModName, offset, TimeSpan.Zero));
}
public override void RemoveStatMods()
{
if(Target != null)
Target.RemoveStatMod(ModName);
}
public override bool OnTick()
{
bool tick = base.OnTick();
if (Target == null || !Caster.InRange(Target.Location, PartyRange))
return false;
int damage = m_Damage;
if (!Target.Player)
damage += AOS.Scale(damage, 50); // pvm = 1.5x
damage = (int)((double)damage * GetSlayerBonus()); // 3.0x slayer bonus
damage -= (int)((double)damage * DamageModifier(Target)); // resist modifier
AOS.Damage(Target, Caster, damage, 100, 0, 0, 0, 0); // Now only does physical
if (Target != null && Target.Alive && Target.Map != null)
Target.FixedEffect(0x376A, 1, 32);
if (m_Rounds-- == 0)
{
Expire();
}
return tick;
}
private class InternalTarget : Target
{
private DespairSpell m_Owner;
public InternalTarget(DespairSpell spell) : base(10, false, TargetFlags.Harmful)
{
m_Owner = spell;
}
protected override void OnTarget( Mobile from, object o )
{
if ( o is Mobile )
m_Owner.OnTarget( (Mobile)o );
}
protected override void OnTargetFinish( Mobile from )
{
m_Owner.FinishSequence();
}
}
}
}