134 lines
No EOL
3.4 KiB
C#
134 lines
No EOL
3.4 KiB
C#
using System;
|
|
using System.Collections;
|
|
using Server.Network;
|
|
using Server.Items;
|
|
using Server.Mobiles;
|
|
using Server.Targeting;
|
|
using Server.SkillHandlers;
|
|
|
|
namespace Server.Spells.Ninjitsu
|
|
{
|
|
public class SurpriseAttack : NinjaMove
|
|
{
|
|
public SurpriseAttack()
|
|
{
|
|
}
|
|
|
|
public override int BaseMana{ get{ return 20; } }
|
|
public override double RequiredSkill{ get{ return Core.ML ? 60.0 : 30.0; } }
|
|
|
|
public override TextDefinition AbilityMessage{ get{ return new TextDefinition( 1063128 ); } } // You prepare to surprise your prey.
|
|
|
|
public override bool Validate( Mobile from )
|
|
{
|
|
if( !from.Hidden || from.AllowedStealthSteps <= 0 )
|
|
{
|
|
from.SendLocalizedMessage( 1063087 ); // You must be in stealth mode to use this ability.
|
|
return false;
|
|
}
|
|
|
|
return base.Validate( from );
|
|
}
|
|
|
|
public override bool OnBeforeSwing( Mobile attacker, Mobile defender )
|
|
{
|
|
bool valid = Validate( attacker ) && CheckMana( attacker, true );
|
|
|
|
if( valid )
|
|
{
|
|
attacker.BeginAction( typeof( Stealth ) );
|
|
Timer.DelayCall( TimeSpan.FromSeconds( 5.0 ), delegate { attacker.EndAction( typeof( Stealth ) ); } );
|
|
}
|
|
|
|
return valid;
|
|
|
|
}
|
|
|
|
public override bool ValidatesDuringHit { get { return false; } }
|
|
|
|
public override void OnHit( Mobile attacker, Mobile defender, int damage )
|
|
{
|
|
//Validates before swing
|
|
|
|
ClearCurrentMove( attacker );
|
|
|
|
attacker.SendLocalizedMessage( 1063129 ); // You catch your opponent off guard with your Surprise Attack!
|
|
defender.SendLocalizedMessage( 1063130 ); // Your defenses are lowered as your opponent surprises you!
|
|
|
|
defender.FixedParticles( 0x37B9, 1, 5, 0x26DA, 0, 3, EffectLayer.Head );
|
|
|
|
attacker.RevealingAction();
|
|
|
|
SurpriseAttackInfo info;
|
|
|
|
if ( m_Table.Contains( defender ) )
|
|
{
|
|
info = (SurpriseAttackInfo)m_Table[defender];
|
|
|
|
if ( info.m_Timer != null )
|
|
info.m_Timer.Stop();
|
|
|
|
m_Table.Remove( defender );
|
|
}
|
|
|
|
int ninjitsu = attacker.Skills[SkillName.Ninjitsu].Fixed;
|
|
|
|
int malus = ninjitsu / 60 + (int)Tracking.GetStalkingBonus( attacker, defender );
|
|
|
|
info = new SurpriseAttackInfo( defender, malus );
|
|
info.m_Timer = Timer.DelayCall( TimeSpan.FromSeconds( 8.0 ), new TimerStateCallback( EndSurprise ), info );
|
|
|
|
m_Table[defender] = info;
|
|
|
|
CheckGain( attacker );
|
|
}
|
|
|
|
public override void OnMiss( Mobile attacker, Mobile defender )
|
|
{
|
|
ClearCurrentMove( attacker );
|
|
|
|
attacker.SendLocalizedMessage( 1063161 ); // You failed to properly use the element of surprise.
|
|
|
|
attacker.RevealingAction();
|
|
}
|
|
|
|
|
|
private static Hashtable m_Table = new Hashtable();
|
|
|
|
public static bool GetMalus( Mobile target, ref int malus )
|
|
{
|
|
SurpriseAttackInfo info = m_Table[target] as SurpriseAttackInfo;
|
|
|
|
if ( info == null )
|
|
return false;
|
|
|
|
malus = info.m_Malus;
|
|
return true;
|
|
}
|
|
|
|
private class SurpriseAttackInfo
|
|
{
|
|
public Mobile m_Target;
|
|
public int m_Malus;
|
|
public Timer m_Timer;
|
|
|
|
public SurpriseAttackInfo( Mobile target, int effect )
|
|
{
|
|
m_Target = target;
|
|
m_Malus = effect;
|
|
}
|
|
}
|
|
|
|
private static void EndSurprise( object state )
|
|
{
|
|
SurpriseAttackInfo info = (SurpriseAttackInfo)state;
|
|
|
|
if ( info.m_Timer != null )
|
|
info.m_Timer.Stop();
|
|
|
|
info.m_Target.SendLocalizedMessage( 1063131 ); // Your defenses have returned to normal.
|
|
|
|
m_Table.Remove( info.m_Target );
|
|
}
|
|
}
|
|
} |