210 lines
4.9 KiB
C#
210 lines
4.9 KiB
C#
using System;
|
|
using System.Collections;
|
|
using Server.Items;
|
|
using Server.Targeting;
|
|
using Server.Misc;
|
|
using Server.Spells;
|
|
|
|
namespace Server.Mobiles
|
|
{
|
|
public class JukaMage : BaseCreature
|
|
{
|
|
public override string CorpseName => "a jukan corpse";
|
|
public override string DefaultName => "a juka mage";
|
|
|
|
[Constructible]
|
|
public JukaMage() : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
|
|
{
|
|
Body = 765;
|
|
|
|
SetStr( 201, 300 );
|
|
SetDex( 71, 90 );
|
|
SetInt( 451, 500 );
|
|
|
|
SetHits( 121, 180 );
|
|
|
|
SetDamage( 4, 10 );
|
|
|
|
SetDamageType( ResistanceType.Physical, 100 );
|
|
|
|
SetResistance( ResistanceType.Physical, 20, 30 );
|
|
SetResistance( ResistanceType.Fire, 35, 45 );
|
|
SetResistance( ResistanceType.Cold, 30, 40 );
|
|
SetResistance( ResistanceType.Poison, 10, 20 );
|
|
SetResistance( ResistanceType.Energy, 35, 45 );
|
|
|
|
SetSkill( SkillName.Anatomy, 80.1, 90.0 );
|
|
SetSkill( SkillName.EvalInt, 80.2, 100.0 );
|
|
SetSkill( SkillName.Magery, 99.1, 100.0 );
|
|
SetSkill( SkillName.Meditation, 80.2, 100.0 );
|
|
SetSkill( SkillName.MagicResist, 140.1, 150.0 );
|
|
SetSkill( SkillName.Tactics, 80.1, 90.0 );
|
|
SetSkill( SkillName.Wrestling, 80.1, 90.0 );
|
|
|
|
Fame = 15000;
|
|
Karma = -15000;
|
|
|
|
VirtualArmor = 16;
|
|
|
|
Container bag = new Bag();
|
|
|
|
int count = Utility.RandomMinMax( 10, 20 );
|
|
|
|
for ( int i = 0; i < count; ++i )
|
|
{
|
|
Item item = Loot.RandomReagent();
|
|
|
|
if ( item == null )
|
|
continue;
|
|
|
|
if ( !bag.TryDropItem( this, item, false ) )
|
|
item.Delete();
|
|
}
|
|
|
|
PackItem( bag );
|
|
|
|
PackItem( new ArcaneGem() );
|
|
|
|
if ( Core.ML && Utility.RandomDouble() < .33 )
|
|
PackItem( Engines.Plants.Seed.RandomPeculiarSeed(4) );
|
|
|
|
m_NextAbilityTime = DateTime.UtcNow + TimeSpan.FromSeconds( Utility.RandomMinMax( 2, 5 ) );
|
|
}
|
|
|
|
public override void GenerateLoot()
|
|
{
|
|
AddLoot( LootPack.Average, 2 );
|
|
AddLoot( LootPack.MedScrolls, 2 );
|
|
}
|
|
|
|
public override int GetIdleSound()
|
|
{
|
|
return 0x1AC;
|
|
}
|
|
|
|
public override int GetAngerSound()
|
|
{
|
|
return 0x1CD;
|
|
}
|
|
|
|
public override int GetHurtSound()
|
|
{
|
|
return 0x1D0;
|
|
}
|
|
|
|
public override int GetDeathSound()
|
|
{
|
|
return 0x28D;
|
|
}
|
|
|
|
public override bool AlwaysMurderer => true;
|
|
public override bool CanRummageCorpses => true;
|
|
public override int Meat => 1;
|
|
|
|
private DateTime m_NextAbilityTime;
|
|
|
|
public override void OnThink()
|
|
{
|
|
if ( DateTime.UtcNow >= m_NextAbilityTime )
|
|
{
|
|
JukaLord toBuff = null;
|
|
|
|
foreach ( Mobile m in this.GetMobilesInRange( 8 ) )
|
|
{
|
|
if ( m is JukaLord lord && IsFriend( lord ) && lord.Combatant != null && CanBeBeneficial( lord ) && lord.CanBeginAction( typeof( JukaMage ) ) && InLOS( lord ) )
|
|
{
|
|
toBuff = lord;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if ( toBuff != null )
|
|
{
|
|
if ( CanBeBeneficial( toBuff ) && toBuff.BeginAction( typeof( JukaMage ) ) )
|
|
{
|
|
m_NextAbilityTime = DateTime.UtcNow + TimeSpan.FromSeconds( Utility.RandomMinMax( 30, 60 ) );
|
|
|
|
toBuff.Say( true, "Give me the power to destroy my enemies!" );
|
|
this.Say( true, "Fight well my lord!" );
|
|
|
|
DoBeneficial( toBuff );
|
|
|
|
object[] state = new object[]{ toBuff, toBuff.HitsMaxSeed, toBuff.RawStr, toBuff.RawDex };
|
|
|
|
SpellHelper.Turn( this, toBuff );
|
|
|
|
int toScale = toBuff.HitsMaxSeed;
|
|
|
|
if ( toScale > 0 )
|
|
{
|
|
toBuff.HitsMaxSeed += AOS.Scale( toScale, 75 );
|
|
toBuff.Hits += AOS.Scale( toScale, 75 );
|
|
}
|
|
|
|
toScale = toBuff.RawStr;
|
|
|
|
if ( toScale > 0 )
|
|
toBuff.RawStr += AOS.Scale( toScale, 50 );
|
|
|
|
toScale = toBuff.RawDex;
|
|
|
|
if ( toScale > 0 )
|
|
{
|
|
toBuff.RawDex += AOS.Scale( toScale, 50 );
|
|
toBuff.Stam += AOS.Scale( toScale, 50 );
|
|
}
|
|
|
|
toBuff.Hits = toBuff.Hits;
|
|
toBuff.Stam = toBuff.Stam;
|
|
|
|
toBuff.FixedParticles( 0x375A, 10, 15, 5017, EffectLayer.Waist );
|
|
toBuff.PlaySound( 0x1EE );
|
|
|
|
Timer.DelayCall( TimeSpan.FromSeconds( 20.0 ), new TimerStateCallback( Unbuff ), state );
|
|
}
|
|
}
|
|
else
|
|
{
|
|
m_NextAbilityTime = DateTime.UtcNow + TimeSpan.FromSeconds( Utility.RandomMinMax( 2, 5 ) );
|
|
}
|
|
}
|
|
|
|
base.OnThink();
|
|
}
|
|
|
|
private void Unbuff( object state )
|
|
{
|
|
object[] states = (object[])state;
|
|
|
|
JukaLord toDebuff = (JukaLord)states[0];
|
|
|
|
toDebuff.EndAction( typeof( JukaMage ) );
|
|
|
|
if ( toDebuff.Deleted )
|
|
return;
|
|
|
|
toDebuff.HitsMaxSeed = (int)states[1];
|
|
toDebuff.RawStr = (int)states[2];
|
|
toDebuff.RawDex = (int)states[3];
|
|
|
|
toDebuff.Hits = toDebuff.Hits;
|
|
toDebuff.Stam = toDebuff.Stam;
|
|
}
|
|
|
|
public JukaMage( Serial serial ) : base( serial )
|
|
{
|
|
}
|
|
|
|
public override void Serialize( GenericWriter writer )
|
|
{
|
|
base.Serialize( writer );
|
|
writer.Write( (int) 0 );
|
|
}
|
|
|
|
public override void Deserialize( GenericReader reader )
|
|
{
|
|
base.Deserialize( reader );
|
|
int version = reader.ReadInt();
|
|
}
|
|
}
|
|
}
|