ModernUO/Projects/UOContent/Skills/Provocation.cs
2023-02-07 23:33:45 -08:00

175 lines
7.3 KiB
C#

using System;
using Server.Items;
using Server.Mobiles;
using Server.Targeting;
namespace Server.SkillHandlers
{
public static class Provocation
{
public static void Initialize()
{
SkillInfo.Table[(int)SkillName.Provocation].Callback = OnUse;
}
public static TimeSpan OnUse(Mobile m)
{
m.RevealingAction();
BaseInstrument.PickInstrument(m, OnPickedInstrument);
return TimeSpan.FromSeconds(1.0); // Cannot use another skill for 1 second
}
public static void OnPickedInstrument(Mobile from, BaseInstrument instrument)
{
from.RevealingAction();
from.SendLocalizedMessage(501587); // Whom do you wish to incite?
from.Target = new InternalFirstTarget(from, instrument);
}
private class InternalFirstTarget : Target
{
private readonly BaseInstrument m_Instrument;
public InternalFirstTarget(Mobile from, BaseInstrument instrument) : base(
BaseInstrument.GetBardRange(from, SkillName.Provocation),
false,
TargetFlags.None
) =>
m_Instrument = instrument;
protected override void OnTarget(Mobile from, object targeted)
{
from.RevealingAction();
if (targeted is BaseCreature creature && from.CanBeHarmful(creature, true))
{
if (!m_Instrument.IsChildOf(from.Backpack))
{
from.SendLocalizedMessage(
1062488
); // The instrument you are trying to play is no longer in your backpack!
}
else if (creature.Controlled)
{
from.SendLocalizedMessage(501590); // They are too loyal to their master to be provoked.
}
else if (creature.IsParagon && BaseInstrument.GetBaseDifficulty(creature) >= 160.0)
{
from.SendLocalizedMessage(1049446); // You have no chance of provoking those creatures.
}
else
{
from.RevealingAction();
m_Instrument.PlayInstrumentWell(from);
// You play your music and your target becomes angered. Whom do you wish them to attack?
from.SendLocalizedMessage(1008085);
from.Target = new InternalSecondTarget(from, m_Instrument, creature);
}
}
else
{
from.SendLocalizedMessage(501589); // You can't incite that!
}
}
}
private class InternalSecondTarget : Target
{
private readonly BaseCreature m_Creature;
private readonly BaseInstrument m_Instrument;
public InternalSecondTarget(Mobile from, BaseInstrument instrument, BaseCreature creature) : base(
BaseInstrument.GetBardRange(from, SkillName.Provocation),
false,
TargetFlags.None
)
{
m_Instrument = instrument;
m_Creature = creature;
}
protected override void OnTarget(Mobile from, object targeted)
{
from.RevealingAction();
if (targeted is BaseCreature creature)
{
if (!m_Instrument.IsChildOf(from.Backpack))
{
// The instrument you are trying to play is no longer in your backpack!
from.SendLocalizedMessage(1062488);
}
else if (m_Creature.Unprovokable)
{
from.SendLocalizedMessage(1049446); // You have no chance of provoking those creatures.
}
else if (creature.Unprovokable && creature is not DemonKnight)
{
from.SendLocalizedMessage(1049446); // You have no chance of provoking those creatures.
}
else if (m_Creature.Map != creature.Map ||
!m_Creature.InRange(creature, BaseInstrument.GetBardRange(from, SkillName.Provocation)))
{
// The creatures you are trying to provoke are too far away from each other for your music to have an effect.
from.SendLocalizedMessage(1049450);
}
else if (m_Creature != creature)
{
from.NextSkillTime = Core.TickCount + 10000;
var diff =
(m_Instrument.GetDifficultyFor(m_Creature) + m_Instrument.GetDifficultyFor(creature)) * 0.5 - 5.0;
var music = from.Skills.Musicianship.Value;
if (music > 100.0)
{
diff -= (music - 100.0) * 0.5;
}
if (from.CanBeHarmful(m_Creature, true) && from.CanBeHarmful(creature, true))
{
if (!BaseInstrument.CheckMusicianship(from))
{
from.NextSkillTime = Core.TickCount + 5000;
from.SendLocalizedMessage(500612); // You play poorly, and there is no effect.
m_Instrument.PlayInstrumentBadly(from);
m_Instrument.ConsumeUse(from);
}
else
{
// from.DoHarmful( m_Creature );
// from.DoHarmful( creature );
if (!from.CheckTargetSkill(SkillName.Provocation, creature, diff - 25.0, diff + 25.0))
{
from.NextSkillTime = Core.TickCount + 5000;
from.SendLocalizedMessage(501599); // Your music fails to incite enough anger.
m_Instrument.PlayInstrumentBadly(from);
m_Instrument.ConsumeUse(from);
}
else
{
from.SendLocalizedMessage(501602); // Your music succeeds, as you start a fight.
m_Instrument.PlayInstrumentWell(from);
m_Instrument.ConsumeUse(from);
m_Creature.Provoke(from, creature, true);
}
}
}
}
else
{
from.SendLocalizedMessage(501593); // You can't tell someone to attack themselves!
}
}
else
{
from.SendLocalizedMessage(501589); // You can't incite that!
}
}
}
}
}