#W# Source and Scripts added. Added Scripts/Settings.cs to expose some basic tweak able settings.
This commit is contained in:
parent
b51c58f514
commit
3045c83799
3512 changed files with 627673 additions and 0 deletions
133
Scripts/Mobiles/Monsters/ML/Animal/CuSidhe.cs
Normal file
133
Scripts/Mobiles/Monsters/ML/Animal/CuSidhe.cs
Normal file
|
|
@ -0,0 +1,133 @@
|
|||
using Server;
|
||||
using System;
|
||||
using Server.Items;
|
||||
using Server.Gumps;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a cu sidhe corpse" )]
|
||||
public class CuSidhe : BaseMount
|
||||
{
|
||||
[Constructable]
|
||||
public CuSidhe() : this( "a cu sidhe" )
|
||||
{
|
||||
}
|
||||
|
||||
[Constructable]
|
||||
public CuSidhe( string name ) : base( name, 277, 0x3E91, AIType.AI_Animal, FightMode.Aggressor, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
double chance = Utility.RandomDouble() * 23301;
|
||||
|
||||
if ( chance <= 1 )
|
||||
Hue = 0x489;
|
||||
else if ( chance < 50 )
|
||||
Hue = Utility.RandomList( 0x657, 0x515, 0x4B1, 0x481, 0x482, 0x455 );
|
||||
else if ( chance < 500 )
|
||||
Hue = Utility.RandomList( 0x97A, 0x978, 0x901, 0x8AC, 0x5A7, 0x527 );
|
||||
|
||||
SetStr( 1200, 1225 );
|
||||
SetDex( 150, 170 );
|
||||
SetInt( 250, 285 );
|
||||
|
||||
SetHits( 1010, 1275 );
|
||||
|
||||
SetDamage( 21, 28 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 0 );
|
||||
SetDamageType( ResistanceType.Cold, 50 );
|
||||
SetDamageType( ResistanceType.Energy, 50 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 50, 65 );
|
||||
SetResistance( ResistanceType.Fire, 25, 45 );
|
||||
SetResistance( ResistanceType.Cold, 70, 85 );
|
||||
SetResistance( ResistanceType.Poison, 30, 50 );
|
||||
SetResistance( ResistanceType.Energy, 70, 85 );
|
||||
|
||||
SetSkill( SkillName.Wrestling, 90.1, 96.8 );
|
||||
SetSkill( SkillName.Tactics, 90.3, 99.3 );
|
||||
SetSkill( SkillName.MagicResist, 75.3, 90.0 );
|
||||
SetSkill( SkillName.Anatomy, 65.5, 69.4 );
|
||||
SetSkill( SkillName.Healing, 72.2, 98.9 );
|
||||
|
||||
Fame = 5000; //Guessing here
|
||||
Karma = 5000; //Guessing here
|
||||
|
||||
Tamable = true;
|
||||
ControlSlots = 4;
|
||||
MinTameSkill = 101.1;
|
||||
|
||||
if ( Utility.RandomDouble() < 0.2 )
|
||||
PackItem( new TreasureMap( 5, Map.Trammel ) );
|
||||
|
||||
//if ( Utility.RandomDouble() < 0.1 )
|
||||
//PackItem( new ParrotItem() );
|
||||
|
||||
PackGold( 500, 800 );
|
||||
|
||||
// TODO 0-2 spellweaving scroll
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.AosFilthyRich, 5 );
|
||||
}
|
||||
|
||||
public override void OnDoubleClick( Mobile from )
|
||||
{
|
||||
if ( from.Race != Race.Elf && from == ControlMaster && from.AccessLevel == AccessLevel.Player )
|
||||
{
|
||||
Item pads = from.FindItemOnLayer( Layer.Shoes );
|
||||
|
||||
if ( pads is PadsOfTheCuSidhe )
|
||||
from.SendLocalizedMessage( 1071981 ); // Your boots allow you to mount the Cu Sidhe.
|
||||
else
|
||||
{
|
||||
from.SendLocalizedMessage( 1072203 ); // Only Elves may use this.
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
base.OnDoubleClick( from );
|
||||
}
|
||||
|
||||
public override bool CanHeal{ get{ return true; } }
|
||||
public override bool CanHealOwner{ get{ return true; } }
|
||||
public override FoodType FavoriteFood{ get{ return FoodType.FruitsAndVegies; } }
|
||||
public override bool CanAngerOnTame{ get { return true; } }
|
||||
public override bool StatLossAfterTame{ get{ return true; } }
|
||||
public override int Hides{ get{ return 10; } }
|
||||
public override int Meat{ get{ return 3; } }
|
||||
|
||||
public override WeaponAbility GetWeaponAbility()
|
||||
{
|
||||
return WeaponAbility.BleedAttack;
|
||||
}
|
||||
|
||||
public CuSidhe( Serial serial ) : base( serial )
|
||||
{
|
||||
}
|
||||
|
||||
public override int GetIdleSound() { return 0x577; }
|
||||
public override int GetAttackSound() { return 0x576; }
|
||||
public override int GetAngerSound() { return 0x578; }
|
||||
public override int GetHurtSound() { return 0x576; }
|
||||
public override int GetDeathSound() { return 0x579; }
|
||||
|
||||
public override void Serialize( GenericWriter writer )
|
||||
{
|
||||
base.Serialize( writer );
|
||||
|
||||
writer.Write( (int) 1 ); // version
|
||||
}
|
||||
|
||||
public override void Deserialize( GenericReader reader )
|
||||
{
|
||||
base.Deserialize( reader );
|
||||
|
||||
int version = reader.ReadInt();
|
||||
|
||||
if ( version < 1 && Name == "a Cu Sidhe" )
|
||||
Name = "a cu sidhe";
|
||||
}
|
||||
}
|
||||
}
|
||||
104
Scripts/Mobiles/Monsters/ML/Animal/Ferret.cs
Normal file
104
Scripts/Mobiles/Monsters/ML/Animal/Ferret.cs
Normal file
|
|
@ -0,0 +1,104 @@
|
|||
using System;
|
||||
using Server;
|
||||
using Server.Engines.Quests;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a ferret corpse" )]
|
||||
public class Ferret : BaseCreature
|
||||
{
|
||||
[Constructable]
|
||||
public Ferret() : base( AIType.AI_Animal, FightMode.Aggressor, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
Name = "a ferret";
|
||||
Body = 0x117;
|
||||
|
||||
SetStr( 41, 48 );
|
||||
SetDex( 55 );
|
||||
SetInt( 75 );
|
||||
|
||||
SetHits( 45, 50 );
|
||||
|
||||
SetDamage( 7, 9 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 100 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 45, 50 );
|
||||
SetResistance( ResistanceType.Fire, 10, 14 );
|
||||
SetResistance( ResistanceType.Cold, 30, 40 );
|
||||
SetResistance( ResistanceType.Poison, 21, 25 );
|
||||
SetResistance( ResistanceType.Energy, 20, 25 );
|
||||
|
||||
SetSkill( SkillName.MagicResist, 4.0 );
|
||||
SetSkill( SkillName.Tactics, 4.0 );
|
||||
SetSkill( SkillName.Wrestling, 4.0 );
|
||||
|
||||
Tamable = true;
|
||||
ControlSlots = 1;
|
||||
MinTameSkill = -21.3;
|
||||
|
||||
m_CanTalk = true;
|
||||
}
|
||||
|
||||
public override int Meat{ get{ return 1; } }
|
||||
public override FoodType FavoriteFood{ get{ return FoodType.Fish; } }
|
||||
|
||||
public Ferret( Serial serial ) : base( serial )
|
||||
{
|
||||
}
|
||||
|
||||
public override void OnMovement( Mobile m, Point3D oldLocation )
|
||||
{
|
||||
if ( m is Ferret && m.InRange( this, 3 ) && m.Alive )
|
||||
Talk( (Ferret) m );
|
||||
}
|
||||
|
||||
private static string[] m_Vocabulary = new string[]
|
||||
{
|
||||
"dook",
|
||||
"dook dook",
|
||||
"dook dook dook!"
|
||||
};
|
||||
|
||||
private bool m_CanTalk;
|
||||
|
||||
public void Talk()
|
||||
{
|
||||
Talk( null );
|
||||
}
|
||||
|
||||
public void Talk( Ferret to )
|
||||
{
|
||||
if ( m_CanTalk )
|
||||
{
|
||||
if ( to != null )
|
||||
QuestSystem.FocusTo( this, to );
|
||||
|
||||
Say( m_Vocabulary[ Utility.Random( m_Vocabulary.Length ) ] );
|
||||
|
||||
if ( to != null && Utility.RandomBool() )
|
||||
Timer.DelayCall( TimeSpan.FromSeconds( Utility.RandomMinMax( 5, 8 ) ), new TimerCallback( delegate() { to.Talk(); } ) );
|
||||
|
||||
m_CanTalk = false;
|
||||
|
||||
Timer.DelayCall( TimeSpan.FromSeconds( Utility.RandomMinMax( 20, 30 ) ), new TimerCallback( delegate() { m_CanTalk = true; } ) );
|
||||
}
|
||||
}
|
||||
|
||||
public override void Serialize( GenericWriter writer )
|
||||
{
|
||||
base.Serialize( writer );
|
||||
|
||||
writer.Write( (int) 0 ); // version
|
||||
}
|
||||
|
||||
public override void Deserialize( GenericReader reader )
|
||||
{
|
||||
base.Deserialize( reader );
|
||||
|
||||
int version = reader.ReadInt();
|
||||
|
||||
m_CanTalk = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
69
Scripts/Mobiles/Monsters/ML/Animal/RagingGrizzlyBear.cs
Normal file
69
Scripts/Mobiles/Monsters/ML/Animal/RagingGrizzlyBear.cs
Normal file
|
|
@ -0,0 +1,69 @@
|
|||
using System;
|
||||
using Server.Mobiles;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a grizzly bear corpse" )]
|
||||
[TypeAlias( "Server.Mobiles.Grizzlybear" )]
|
||||
public class RagingGrizzlyBear : BaseCreature
|
||||
{
|
||||
[Constructable]
|
||||
public RagingGrizzlyBear() : base( AIType.AI_Animal, FightMode.Aggressor, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
Name = "a raging grizzly bear";
|
||||
Body = 212;
|
||||
BaseSoundID = 0xA3;
|
||||
|
||||
SetStr( 1251, 1550 );
|
||||
SetDex( 801, 1050 );
|
||||
SetInt( 151, 400 );
|
||||
|
||||
SetHits( 751, 930 );
|
||||
SetMana( 0 );
|
||||
|
||||
SetDamage( 18, 23 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 100 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 50, 70 );
|
||||
SetResistance( ResistanceType.Cold, 30, 50 );
|
||||
SetResistance( ResistanceType.Poison, 10, 20 );
|
||||
SetResistance( ResistanceType.Energy, 10, 20 );
|
||||
|
||||
SetSkill( SkillName.Wrestling, 73.4, 88.1 );
|
||||
SetSkill( SkillName.Tactics, 73.6, 110.5 );
|
||||
SetSkill( SkillName.MagicResist, 32.8, 54.6 );
|
||||
SetSkill( SkillName.Anatomy, 0, 0 );
|
||||
|
||||
Fame = 10000; //Guessing here
|
||||
Karma = 10000; //Guessing here
|
||||
|
||||
VirtualArmor = 24;
|
||||
|
||||
Tamable = false;
|
||||
|
||||
}
|
||||
|
||||
public override int Meat{ get{ return 4; } }
|
||||
public override int Hides{ get{ return 32; } }
|
||||
public override PackInstinct PackInstinct{ get{ return PackInstinct.Bear; } }
|
||||
|
||||
public RagingGrizzlyBear( 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
62
Scripts/Mobiles/Monsters/ML/Animal/Squirrel.cs
Normal file
62
Scripts/Mobiles/Monsters/ML/Animal/Squirrel.cs
Normal file
|
|
@ -0,0 +1,62 @@
|
|||
using System;
|
||||
using Server;
|
||||
using Server.Mobiles;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a squirrel corpse" )]
|
||||
public class Squirrel : BaseCreature
|
||||
{
|
||||
[Constructable]
|
||||
public Squirrel() : base( AIType.AI_Animal, FightMode.Aggressor, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
Name = "a squirrel";
|
||||
Body = 0x116;
|
||||
|
||||
SetStr( 44, 50 );
|
||||
SetDex( 35 );
|
||||
SetInt( 5 );
|
||||
|
||||
SetHits( 42, 50 );
|
||||
|
||||
SetDamage( 1, 2 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 100 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 30, 34 );
|
||||
SetResistance( ResistanceType.Fire, 10, 14 );
|
||||
SetResistance( ResistanceType.Cold, 30, 35 );
|
||||
SetResistance( ResistanceType.Poison, 20, 25 );
|
||||
SetResistance( ResistanceType.Energy, 20, 25 );
|
||||
|
||||
SetSkill( SkillName.MagicResist, 4.0 );
|
||||
SetSkill( SkillName.Tactics, 4.0 );
|
||||
SetSkill( SkillName.Wrestling, 4.0 );
|
||||
|
||||
Tamable = true;
|
||||
ControlSlots = 1;
|
||||
MinTameSkill = -21.3;
|
||||
}
|
||||
|
||||
public override int Meat{ get{ return 1; } }
|
||||
public override FoodType FavoriteFood{ get{ return FoodType.FruitsAndVegies; } }
|
||||
|
||||
public Squirrel( Serial serial ) : base( serial )
|
||||
{
|
||||
}
|
||||
|
||||
public override void Serialize( GenericWriter writer )
|
||||
{
|
||||
base.Serialize( writer );
|
||||
|
||||
writer.Write( (int) 0 ); // version
|
||||
}
|
||||
|
||||
public override void Deserialize( GenericReader reader )
|
||||
{
|
||||
base.Deserialize( reader );
|
||||
|
||||
int version = reader.ReadInt();
|
||||
}
|
||||
}
|
||||
}
|
||||
138
Scripts/Mobiles/Monsters/ML/Bedlam/LadyJennifyr.cs
Normal file
138
Scripts/Mobiles/Monsters/ML/Bedlam/LadyJennifyr.cs
Normal file
|
|
@ -0,0 +1,138 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a Lady Jennifyr corpse" )]
|
||||
public class LadyJennifyr : SkeletalKnight
|
||||
{
|
||||
[Constructable]
|
||||
public LadyJennifyr()
|
||||
{
|
||||
IsParagon = true;
|
||||
|
||||
Name = "Lady Jennifyr";
|
||||
Hue = 0x76D;
|
||||
|
||||
SetStr( 208, 309 );
|
||||
SetDex( 91, 118 );
|
||||
SetInt( 44, 101 );
|
||||
|
||||
SetHits( 1113, 1285 );
|
||||
|
||||
SetDamage( 15, 25 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 40 );
|
||||
SetDamageType( ResistanceType.Cold, 60 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 56, 65 );
|
||||
SetResistance( ResistanceType.Fire, 41, 49 );
|
||||
SetResistance( ResistanceType.Cold, 71, 80 );
|
||||
SetResistance( ResistanceType.Poison, 41, 50 );
|
||||
SetResistance( ResistanceType.Energy, 50, 58 );
|
||||
|
||||
SetSkill( SkillName.Wrestling, 127.9, 137.1 );
|
||||
SetSkill( SkillName.Tactics, 128.4, 141.9 );
|
||||
SetSkill( SkillName.MagicResist, 102.1, 119.5 );
|
||||
SetSkill( SkillName.Anatomy, 129.0, 137.5 );
|
||||
|
||||
Fame = 18000;
|
||||
Karma = -18000;
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.UltraRich, 3 );
|
||||
}
|
||||
|
||||
public override void OnGaveMeleeAttack( Mobile defender )
|
||||
{
|
||||
base.OnGaveMeleeAttack( defender );
|
||||
|
||||
if ( Utility.RandomDouble() < 0.1 )
|
||||
{
|
||||
ExpireTimer timer;
|
||||
|
||||
if ( m_Table.TryGetValue( defender, out timer ) )
|
||||
timer.DoExpire();
|
||||
|
||||
defender.FixedParticles( 0x3709, 10, 30, 5052, EffectLayer.LeftFoot );
|
||||
defender.PlaySound( 0x208 );
|
||||
defender.SendLocalizedMessage( 1070833 ); // The creature fans you with fire, reducing your resistance to fire attacks.
|
||||
|
||||
ResistanceMod mod = new ResistanceMod( ResistanceType.Fire, -10 );
|
||||
defender.AddResistanceMod( mod );
|
||||
|
||||
m_Table[defender] = timer = new ExpireTimer( defender, mod );
|
||||
timer.Start();
|
||||
}
|
||||
}
|
||||
|
||||
private static Dictionary<Mobile, ExpireTimer> m_Table = new Dictionary<Mobile, ExpireTimer>();
|
||||
|
||||
private class ExpireTimer : Timer
|
||||
{
|
||||
private Mobile m_Mobile;
|
||||
private ResistanceMod m_Mod;
|
||||
|
||||
public ExpireTimer( Mobile m, ResistanceMod mod )
|
||||
: base( TimeSpan.FromSeconds( 10 ) )
|
||||
{
|
||||
m_Mobile = m;
|
||||
m_Mod = mod;
|
||||
Priority = TimerPriority.TwoFiftyMS;
|
||||
}
|
||||
|
||||
public void DoExpire()
|
||||
{
|
||||
m_Mobile.RemoveResistanceMod( m_Mod );
|
||||
|
||||
Stop();
|
||||
m_Table.Remove( m_Mobile );
|
||||
}
|
||||
|
||||
protected override void OnTick()
|
||||
{
|
||||
m_Mobile.SendLocalizedMessage( 1070834 ); // Your resistance to fire attacks has returned.
|
||||
DoExpire();
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
// TODO: Uncomment once added
|
||||
public override void OnDeath( Container c )
|
||||
{
|
||||
base.OnDeath( c );
|
||||
|
||||
if ( Utility.RandomDouble() < 0.15 )
|
||||
c.DropItem( new DisintegratingThesisNotes() );
|
||||
|
||||
if ( Utility.RandomDouble() < 0.1 )
|
||||
c.DropItem( new ParrotItem() );
|
||||
}
|
||||
*/
|
||||
|
||||
public override bool GivesMLMinorArtifact{ get{ return true; } }
|
||||
|
||||
public LadyJennifyr( Serial serial )
|
||||
: base( serial )
|
||||
{
|
||||
}
|
||||
|
||||
public override void Serialize( GenericWriter writer )
|
||||
{
|
||||
base.Serialize( writer );
|
||||
|
||||
writer.Write( (int) 0 ); // version
|
||||
}
|
||||
|
||||
public override void Deserialize( GenericReader reader )
|
||||
{
|
||||
base.Deserialize( reader );
|
||||
|
||||
int version = reader.ReadInt();
|
||||
}
|
||||
}
|
||||
}
|
||||
90
Scripts/Mobiles/Monsters/ML/Bedlam/LadyMarai.cs
Normal file
90
Scripts/Mobiles/Monsters/ML/Bedlam/LadyMarai.cs
Normal file
|
|
@ -0,0 +1,90 @@
|
|||
using System;
|
||||
using System.Collections;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a Lady Marai corpse" )]
|
||||
public class LadyMarai : SkeletalKnight
|
||||
{
|
||||
[Constructable]
|
||||
public LadyMarai()
|
||||
{
|
||||
IsParagon = true;
|
||||
|
||||
Name = "Lady Marai";
|
||||
Hue = 0x21;
|
||||
|
||||
SetStr( 221, 304 );
|
||||
SetDex( 98, 138 );
|
||||
SetInt( 54, 99 );
|
||||
|
||||
SetHits( 694, 846 );
|
||||
|
||||
SetDamage( 15, 25 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 40 );
|
||||
SetDamageType( ResistanceType.Cold, 60 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 55, 65 );
|
||||
SetResistance( ResistanceType.Fire, 40, 50 );
|
||||
SetResistance( ResistanceType.Cold, 70, 80 );
|
||||
SetResistance( ResistanceType.Poison, 40, 50 );
|
||||
SetResistance( ResistanceType.Energy, 50, 60 );
|
||||
|
||||
SetSkill( SkillName.Wrestling, 126.6, 137.2 );
|
||||
SetSkill( SkillName.Tactics, 128.7, 134.5 );
|
||||
SetSkill( SkillName.MagicResist, 102.1, 119.1 );
|
||||
SetSkill( SkillName.Anatomy, 126.2, 136.5 );
|
||||
|
||||
Fame = 18000;
|
||||
Karma = -18000;
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.UltraRich, 3 );
|
||||
}
|
||||
|
||||
public override WeaponAbility GetWeaponAbility()
|
||||
{
|
||||
return WeaponAbility.CrushingBlow;
|
||||
}
|
||||
|
||||
/*
|
||||
// TODO: Uncomment once added
|
||||
public override void OnDeath( Container c )
|
||||
{
|
||||
base.OnDeath( c );
|
||||
|
||||
if ( Utility.RandomDouble() < 0.15 )
|
||||
c.DropItem( new DisintegratingThesisNotes() );
|
||||
|
||||
if ( Utility.RandomDouble() < 0.1 )
|
||||
c.DropItem( new ParrotItem() );
|
||||
}
|
||||
*/
|
||||
|
||||
public override bool GivesMLMinorArtifact{ get{ return true; } }
|
||||
|
||||
public LadyMarai( Serial serial )
|
||||
: base( serial )
|
||||
{
|
||||
}
|
||||
|
||||
public override void Serialize( GenericWriter writer )
|
||||
{
|
||||
base.Serialize( writer );
|
||||
|
||||
writer.Write( (int) 0 ); // version
|
||||
}
|
||||
|
||||
public override void Deserialize( GenericReader reader )
|
||||
{
|
||||
base.Deserialize( reader );
|
||||
|
||||
int version = reader.ReadInt();
|
||||
}
|
||||
}
|
||||
}
|
||||
98
Scripts/Mobiles/Monsters/ML/Bedlam/MasterJonath.cs
Normal file
98
Scripts/Mobiles/Monsters/ML/Bedlam/MasterJonath.cs
Normal file
|
|
@ -0,0 +1,98 @@
|
|||
using System;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a Master Jonath corpse" )]
|
||||
public class MasterJonath : BoneMagi
|
||||
{
|
||||
[Constructable]
|
||||
public MasterJonath()
|
||||
{
|
||||
IsParagon = true;
|
||||
|
||||
Name = "Master Jonath";
|
||||
Hue = 0x455;
|
||||
|
||||
SetStr( 109, 131 );
|
||||
SetDex( 98, 110 );
|
||||
SetInt( 232, 259 );
|
||||
|
||||
SetHits( 766, 920 );
|
||||
|
||||
SetDamage( 10, 15 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 100 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 55, 60 );
|
||||
SetResistance( ResistanceType.Fire, 43, 49 );
|
||||
SetResistance( ResistanceType.Cold, 45, 80 );
|
||||
SetResistance( ResistanceType.Poison, 41, 45 );
|
||||
SetResistance( ResistanceType.Energy, 54, 55 );
|
||||
|
||||
SetSkill( SkillName.Wrestling, 80.5, 88.6 );
|
||||
SetSkill( SkillName.Tactics, 88.5, 95.1 );
|
||||
SetSkill( SkillName.MagicResist, 102.7, 102.9 );
|
||||
SetSkill( SkillName.Magery, 100.0, 106.6 );
|
||||
SetSkill( SkillName.EvalInt, 99.6, 106.9 );
|
||||
SetSkill( SkillName.Necromancy, 100.0, 106.6 );
|
||||
SetSkill( SkillName.SpiritSpeak, 99.6, 106.9 );
|
||||
|
||||
Fame = 18000;
|
||||
Karma = -18000;
|
||||
|
||||
if ( Utility.RandomBool() )
|
||||
PackNecroScroll( Utility.RandomMinMax( 5, 9 ) );
|
||||
else
|
||||
PackScroll( 4, 7 );
|
||||
|
||||
PackReg( 7 );
|
||||
PackReg( 7 );
|
||||
PackReg( 8 );
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.UltraRich, 3 );
|
||||
}
|
||||
|
||||
// TODO: Special move?
|
||||
|
||||
/*
|
||||
// TODO: uncomment once added
|
||||
public override void OnDeath( Container c )
|
||||
{
|
||||
base.OnDeath( c );
|
||||
|
||||
if ( Utility.RandomDouble() < 0.05 )
|
||||
c.DropItem( new ParrotItem() );
|
||||
|
||||
if ( Utility.RandomDouble() < 0.15 )
|
||||
c.DropItem( new DisintegratingThesisNotes() );
|
||||
}
|
||||
*/
|
||||
|
||||
public override bool GivesMLMinorArtifact{ get{ return true; } }
|
||||
public override int TreasureMapLevel{ get{ return 5; } }
|
||||
|
||||
public MasterJonath( Serial serial )
|
||||
: base( serial )
|
||||
{
|
||||
}
|
||||
|
||||
public override void Serialize( GenericWriter writer )
|
||||
{
|
||||
base.Serialize( writer );
|
||||
|
||||
writer.Write( (int) 0 ); // version
|
||||
}
|
||||
|
||||
public override void Deserialize( GenericReader reader )
|
||||
{
|
||||
base.Deserialize( reader );
|
||||
|
||||
int version = reader.ReadInt();
|
||||
}
|
||||
}
|
||||
}
|
||||
96
Scripts/Mobiles/Monsters/ML/Bedlam/MasterMikael.cs
Normal file
96
Scripts/Mobiles/Monsters/ML/Bedlam/MasterMikael.cs
Normal file
|
|
@ -0,0 +1,96 @@
|
|||
using System;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a Master Mikael corpse" )]
|
||||
public class MasterMikael : BoneMagi
|
||||
{
|
||||
[Constructable]
|
||||
public MasterMikael()
|
||||
{
|
||||
IsParagon = true;
|
||||
|
||||
Name = "Master Mikael";
|
||||
Hue = 0x8FD;
|
||||
|
||||
SetStr( 93, 122 );
|
||||
SetDex( 91, 100 );
|
||||
SetInt( 252, 271 );
|
||||
|
||||
SetHits( 789, 1014 );
|
||||
|
||||
SetDamage( 11, 19 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 100 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 55, 59 );
|
||||
SetResistance( ResistanceType.Fire, 40, 46 );
|
||||
SetResistance( ResistanceType.Cold, 72, 80 );
|
||||
SetResistance( ResistanceType.Poison, 44, 49 );
|
||||
SetResistance( ResistanceType.Energy, 50, 57 );
|
||||
|
||||
SetSkill( SkillName.Wrestling, 80.1, 87.2 );
|
||||
SetSkill( SkillName.Tactics, 79.0, 90.9 );
|
||||
SetSkill( SkillName.MagicResist, 90.3, 106.9 );
|
||||
SetSkill( SkillName.Magery, 103.8, 108.0 );
|
||||
SetSkill( SkillName.EvalInt, 96.1, 105.3 );
|
||||
SetSkill( SkillName.Necromancy, 103.8, 108.0 );
|
||||
SetSkill( SkillName.SpiritSpeak, 96.1, 105.3 );
|
||||
|
||||
Fame = 18000;
|
||||
Karma = -18000;
|
||||
|
||||
if ( Utility.RandomBool() )
|
||||
PackNecroScroll( Utility.RandomMinMax( 5, 9 ) );
|
||||
else
|
||||
PackScroll( 4, 7 );
|
||||
|
||||
PackReg( 3 );
|
||||
PackNecroReg( 1, 10 );
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.UltraRich, 2 );
|
||||
}
|
||||
|
||||
// TODO: Special move?
|
||||
|
||||
/*
|
||||
// TODO: uncomment once added
|
||||
public override void OnDeath( Container c )
|
||||
{
|
||||
base.OnDeath( c );
|
||||
|
||||
if ( Utility.RandomDouble() < 0.15 )
|
||||
c.DropItem( new DisintegratingThesisNotes() );
|
||||
|
||||
if ( Utility.RandomDouble() < 0.1 )
|
||||
c.DropItem( new ParrotItem() );
|
||||
}
|
||||
*/
|
||||
|
||||
public override bool GivesMLMinorArtifact{ get{ return true; } }
|
||||
|
||||
public MasterMikael( Serial serial )
|
||||
: base( serial )
|
||||
{
|
||||
}
|
||||
|
||||
public override void Serialize( GenericWriter writer )
|
||||
{
|
||||
base.Serialize( writer );
|
||||
|
||||
writer.Write( (int) 0 ); // version
|
||||
}
|
||||
|
||||
public override void Deserialize( GenericReader reader )
|
||||
{
|
||||
base.Deserialize( reader );
|
||||
|
||||
int version = reader.ReadInt();
|
||||
}
|
||||
}
|
||||
}
|
||||
95
Scripts/Mobiles/Monsters/ML/Bedlam/MasterTheophilus.cs
Normal file
95
Scripts/Mobiles/Monsters/ML/Bedlam/MasterTheophilus.cs
Normal file
|
|
@ -0,0 +1,95 @@
|
|||
using System;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a Master Theophilus corpse" )]
|
||||
public class MasterTheophilus : EvilMageLord
|
||||
{
|
||||
[Constructable]
|
||||
public MasterTheophilus()
|
||||
{
|
||||
IsParagon = true;
|
||||
|
||||
Name = "Master Theophilus";
|
||||
Title = "the necromancer";
|
||||
Hue = 0;
|
||||
|
||||
SetStr( 137, 187 );
|
||||
SetDex( 253, 301 );
|
||||
SetInt( 393, 444 );
|
||||
|
||||
SetHits( 663, 876 );
|
||||
|
||||
SetDamage( 15, 20 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 100 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 55, 60 );
|
||||
SetResistance( ResistanceType.Fire, 50, 58 );
|
||||
SetResistance( ResistanceType.Cold, 50, 60 );
|
||||
SetResistance( ResistanceType.Poison, 50, 60 );
|
||||
SetResistance( ResistanceType.Energy, 50, 60 );
|
||||
|
||||
SetSkill( SkillName.Wrestling, 69.9, 105.3 );
|
||||
SetSkill( SkillName.Tactics, 113.0, 117.9 );
|
||||
SetSkill( SkillName.MagicResist, 127.0, 132.8 );
|
||||
SetSkill( SkillName.Magery, 138.1, 143.7 );
|
||||
SetSkill( SkillName.EvalInt, 125.6, 133.8 );
|
||||
SetSkill( SkillName.Necromancy, 125.6, 133.8 );
|
||||
SetSkill( SkillName.SpiritSpeak, 125.6, 133.8 );
|
||||
SetSkill( SkillName.Meditation, 128.8, 132.9 );
|
||||
|
||||
Fame = 18000;
|
||||
Karma = -18000;
|
||||
|
||||
AddItem( new Shoes( 0x537 ) );
|
||||
AddItem( new Robe( 0x452 ) );
|
||||
|
||||
for ( int i = 0; i < 2; ++i )
|
||||
{
|
||||
if ( Utility.RandomBool() )
|
||||
PackNecroScroll( Utility.RandomMinMax( 5, 9 ) );
|
||||
else
|
||||
PackScroll( 4, 7 );
|
||||
}
|
||||
|
||||
PackReg( 7 );
|
||||
PackReg( 7 );
|
||||
PackReg( 8 );
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.UltraRich, 3 );
|
||||
}
|
||||
|
||||
public override WeaponAbility GetWeaponAbility()
|
||||
{
|
||||
return WeaponAbility.ParalyzingBlow;
|
||||
}
|
||||
|
||||
public override bool GivesMLMinorArtifact{ get{ return true; } }
|
||||
public override int TreasureMapLevel{ get{ return 5; } }
|
||||
|
||||
public MasterTheophilus( Serial serial )
|
||||
: base( serial )
|
||||
{
|
||||
}
|
||||
|
||||
public override void Serialize( GenericWriter writer )
|
||||
{
|
||||
base.Serialize( writer );
|
||||
|
||||
writer.Write( (int) 0 ); // version
|
||||
}
|
||||
|
||||
public override void Deserialize( GenericReader reader )
|
||||
{
|
||||
base.Deserialize( reader );
|
||||
|
||||
int version = reader.ReadInt();
|
||||
}
|
||||
}
|
||||
}
|
||||
96
Scripts/Mobiles/Monsters/ML/Bedlam/RedDeath.cs
Normal file
96
Scripts/Mobiles/Monsters/ML/Bedlam/RedDeath.cs
Normal file
|
|
@ -0,0 +1,96 @@
|
|||
using System;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a Red Death corpse" )]
|
||||
public class RedDeath : SkeletalMount
|
||||
{
|
||||
[Constructable]
|
||||
public RedDeath()
|
||||
: base( "Red Death" )
|
||||
{
|
||||
IsParagon = true;
|
||||
|
||||
Hue = 0x21;
|
||||
BaseSoundID = 0x1C3;
|
||||
|
||||
AI = AIType.AI_Melee;
|
||||
FightMode = FightMode.Closest;
|
||||
|
||||
SetStr( 319, 324 );
|
||||
SetDex( 241, 244 );
|
||||
SetInt( 242, 255 );
|
||||
|
||||
SetHits( 1540, 1605 );
|
||||
|
||||
SetDamage( 25, 29 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 25 );
|
||||
SetDamageType( ResistanceType.Fire, 75 );
|
||||
SetDamageType( ResistanceType.Cold, 0 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 60, 70 );
|
||||
SetResistance( ResistanceType.Fire, 90 );
|
||||
SetResistance( ResistanceType.Cold, 0 );
|
||||
SetResistance( ResistanceType.Poison, 100 );
|
||||
SetResistance( ResistanceType.Energy, 0 );
|
||||
|
||||
SetSkill( SkillName.Wrestling, 121.4, 143.7 );
|
||||
SetSkill( SkillName.Tactics, 120.9, 142.2 );
|
||||
SetSkill( SkillName.MagicResist, 120.1, 142.3 );
|
||||
SetSkill( SkillName.Anatomy, 120.2, 144.0 );
|
||||
|
||||
Fame = 28000;
|
||||
Karma = -28000;
|
||||
|
||||
if ( Utility.RandomBool() )
|
||||
PackNecroScroll( Utility.RandomMinMax( 5, 9 ) );
|
||||
else
|
||||
PackScroll( 4, 7 );
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.UltraRich, 3 );
|
||||
}
|
||||
|
||||
public override WeaponAbility GetWeaponAbility()
|
||||
{
|
||||
return WeaponAbility.WhirlwindAttack;
|
||||
}
|
||||
|
||||
public override void OnDeath( Container c )
|
||||
{
|
||||
base.OnDeath( c );
|
||||
|
||||
c.DropItem( new ResolvesBridle() );
|
||||
}
|
||||
|
||||
public override bool GivesMLMinorArtifact{ get{ return true; } }
|
||||
public override bool AlwaysMurderer{ get{ return true; } }
|
||||
public override bool HasBreath{ get{ return true; } }
|
||||
public override int BreathChaosDamage{ get { return 100; } }
|
||||
public override int BreathFireDamage{ get{ return 0; } }
|
||||
|
||||
public RedDeath( Serial serial )
|
||||
: base( serial )
|
||||
{
|
||||
}
|
||||
|
||||
public override void Serialize( GenericWriter writer )
|
||||
{
|
||||
base.Serialize( writer );
|
||||
|
||||
writer.Write( (int) 0 ); // version
|
||||
}
|
||||
|
||||
public override void Deserialize( GenericReader reader )
|
||||
{
|
||||
base.Deserialize( reader );
|
||||
|
||||
int version = reader.ReadInt();
|
||||
}
|
||||
}
|
||||
}
|
||||
139
Scripts/Mobiles/Monsters/ML/Bedlam/SirPatrick.cs
Normal file
139
Scripts/Mobiles/Monsters/ML/Bedlam/SirPatrick.cs
Normal file
|
|
@ -0,0 +1,139 @@
|
|||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a Sir Patrick corpse" )]
|
||||
public class SirPatrick : SkeletalKnight
|
||||
{
|
||||
[Constructable]
|
||||
public SirPatrick()
|
||||
{
|
||||
IsParagon = true;
|
||||
|
||||
Name = "Sir Patrick";
|
||||
Hue = 0x47E;
|
||||
|
||||
SetStr( 208, 319 );
|
||||
SetDex( 98, 132 );
|
||||
SetInt( 45, 91 );
|
||||
|
||||
SetHits( 616, 884 );
|
||||
|
||||
SetDamage( 15, 25 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 40 );
|
||||
SetDamageType( ResistanceType.Cold, 60 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 55, 62 );
|
||||
SetResistance( ResistanceType.Fire, 40, 48 );
|
||||
SetResistance( ResistanceType.Cold, 71, 80 );
|
||||
SetResistance( ResistanceType.Poison, 40, 50 );
|
||||
SetResistance( ResistanceType.Energy, 50, 60 );
|
||||
|
||||
SetSkill( SkillName.Wrestling, 126.3, 136.5 );
|
||||
SetSkill( SkillName.Tactics, 128.5, 143.8 );
|
||||
SetSkill( SkillName.MagicResist, 102.8, 117.9 );
|
||||
SetSkill( SkillName.Anatomy, 127.5, 137.2 );
|
||||
|
||||
Fame = 18000;
|
||||
Karma = -18000;
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.UltraRich, 2 );
|
||||
}
|
||||
|
||||
public override void OnGaveMeleeAttack( Mobile defender )
|
||||
{
|
||||
base.OnGaveMeleeAttack( defender );
|
||||
|
||||
if ( Utility.RandomDouble() < 0.1 )
|
||||
DrainLife();
|
||||
}
|
||||
|
||||
public override void OnGotMeleeAttack( Mobile attacker )
|
||||
{
|
||||
base.OnGotMeleeAttack( attacker );
|
||||
|
||||
if ( Utility.RandomDouble() < 0.1 )
|
||||
DrainLife();
|
||||
}
|
||||
|
||||
public virtual void DrainLife()
|
||||
{
|
||||
List<Mobile> list = new List<Mobile>();
|
||||
|
||||
foreach ( Mobile m in GetMobilesInRange( 2 ) )
|
||||
{
|
||||
if ( m == this || !CanBeHarmful( m, false ) || ( Core.AOS && !InLOS( m ) ) )
|
||||
continue;
|
||||
|
||||
if ( m is BaseCreature )
|
||||
{
|
||||
BaseCreature bc = (BaseCreature)m;
|
||||
|
||||
if ( bc.Controlled || bc.Summoned || bc.Team != Team )
|
||||
list.Add( m );
|
||||
}
|
||||
else if ( m.Player )
|
||||
{
|
||||
list.Add( m );
|
||||
}
|
||||
}
|
||||
|
||||
foreach ( Mobile m in list )
|
||||
{
|
||||
DoHarmful( m );
|
||||
|
||||
m.FixedParticles( 0x374A, 10, 15, 5013, 0x455, 0, EffectLayer.Waist );
|
||||
m.PlaySound( 0x1EA );
|
||||
|
||||
int drain = Utility.RandomMinMax( 14, 30 );
|
||||
|
||||
Hits += drain;
|
||||
m.Damage( drain, this );
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
// TODO: uncomment once added
|
||||
public override void OnDeath( Container c )
|
||||
{
|
||||
base.OnDeath( c );
|
||||
|
||||
if ( Utility.RandomDouble() < 0.15 )
|
||||
c.DropItem( new DisintegratingThesisNotes() );
|
||||
|
||||
if ( Utility.RandomDouble() < 0.05 )
|
||||
c.DropItem( new AssassinChest() );
|
||||
}
|
||||
*/
|
||||
|
||||
public override bool GivesMLMinorArtifact{ get{ return true; } }
|
||||
|
||||
public SirPatrick( Serial serial )
|
||||
: base( serial )
|
||||
{
|
||||
}
|
||||
|
||||
public override void Serialize( GenericWriter writer )
|
||||
{
|
||||
base.Serialize( writer );
|
||||
|
||||
writer.Write( (int) 0 ); // version
|
||||
}
|
||||
|
||||
public override void Deserialize( GenericReader reader )
|
||||
{
|
||||
base.Deserialize( reader );
|
||||
|
||||
int version = reader.ReadInt();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
79
Scripts/Mobiles/Monsters/ML/Blighted Grove/Abscess.cs
Normal file
79
Scripts/Mobiles/Monsters/ML/Blighted Grove/Abscess.cs
Normal file
|
|
@ -0,0 +1,79 @@
|
|||
using System;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "an Abscess corpse" )]
|
||||
public class Abscess : Hydra
|
||||
{
|
||||
[Constructable]
|
||||
public Abscess()
|
||||
{
|
||||
IsParagon = true;
|
||||
|
||||
Name = "Abscess";
|
||||
Hue = 0x8FD;
|
||||
|
||||
SetStr( 845, 871 );
|
||||
SetDex( 121, 134 );
|
||||
SetInt( 124, 142 );
|
||||
|
||||
SetHits( 7470, 7540 );
|
||||
|
||||
SetDamage( 26, 31 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 60 );
|
||||
SetDamageType( ResistanceType.Fire, 10 );
|
||||
SetDamageType( ResistanceType.Cold, 10 );
|
||||
SetDamageType( ResistanceType.Poison, 10 );
|
||||
SetDamageType( ResistanceType.Energy, 10 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 65, 75 );
|
||||
SetResistance( ResistanceType.Fire, 70, 80 );
|
||||
SetResistance( ResistanceType.Cold, 25, 35 );
|
||||
SetResistance( ResistanceType.Poison, 35, 45 );
|
||||
SetResistance( ResistanceType.Energy, 35, 45 );
|
||||
|
||||
SetSkill( SkillName.Wrestling, 132.3, 143.8 );
|
||||
SetSkill( SkillName.Tactics, 121.0, 130.5 );
|
||||
SetSkill( SkillName.MagicResist, 102.9, 119.0 );
|
||||
SetSkill( SkillName.Anatomy, 91.8, 94.3 );
|
||||
|
||||
// TODO: Fame/Karma
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.UltraRich, 4 );
|
||||
}
|
||||
|
||||
public override void OnDeath( Container c )
|
||||
{
|
||||
base.OnDeath( c );
|
||||
|
||||
c.DropItem( new AbscessTail() );
|
||||
}
|
||||
|
||||
public override bool GivesMLMinorArtifact { get { return true; } }
|
||||
|
||||
public Abscess( Serial serial )
|
||||
: base( serial )
|
||||
{
|
||||
}
|
||||
|
||||
public override void Serialize( GenericWriter writer )
|
||||
{
|
||||
base.Serialize( writer );
|
||||
|
||||
writer.Write( (int) 0 ); // version
|
||||
}
|
||||
|
||||
public override void Deserialize( GenericReader reader )
|
||||
{
|
||||
base.Deserialize( reader );
|
||||
|
||||
int version = reader.ReadInt();
|
||||
}
|
||||
}
|
||||
}
|
||||
106
Scripts/Mobiles/Monsters/ML/Blighted Grove/Coil.cs
Normal file
106
Scripts/Mobiles/Monsters/ML/Blighted Grove/Coil.cs
Normal file
|
|
@ -0,0 +1,106 @@
|
|||
using System;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a Coil corpse" )]
|
||||
public class Coil : SilverSerpent
|
||||
{
|
||||
// TODO: Check faction allegiance
|
||||
|
||||
[Constructable]
|
||||
public Coil()
|
||||
{
|
||||
IsParagon = true;
|
||||
|
||||
Name = "Coil";
|
||||
Hue = 0x3F;
|
||||
|
||||
SetStr( 205, 343 );
|
||||
SetDex( 202, 283 );
|
||||
SetInt( 88, 142 );
|
||||
|
||||
SetHits( 628, 1291 );
|
||||
|
||||
SetDamage( 19, 28 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 50 );
|
||||
SetDamageType( ResistanceType.Poison, 50 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 56, 62 );
|
||||
SetResistance( ResistanceType.Fire, 25, 30 );
|
||||
SetResistance( ResistanceType.Cold, 25, 30 );
|
||||
SetResistance( ResistanceType.Poison, 100 );
|
||||
SetResistance( ResistanceType.Energy, 25, 30 );
|
||||
|
||||
SetSkill( SkillName.Wrestling, 124.5, 141.3 );
|
||||
SetSkill( SkillName.Tactics, 130.2, 142.0 );
|
||||
SetSkill( SkillName.MagicResist, 102.3, 113.0 );
|
||||
SetSkill( SkillName.Anatomy, 120.8, 138.1 );
|
||||
SetSkill( SkillName.Poisoning, 110.1, 133.4 );
|
||||
|
||||
// TODO: Fame/Karma
|
||||
|
||||
PackGem( 2 );
|
||||
PackItem( new Bone() );
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.UltraRich, 3 );
|
||||
}
|
||||
|
||||
public override WeaponAbility GetWeaponAbility()
|
||||
{
|
||||
return WeaponAbility.MortalStrike;
|
||||
}
|
||||
|
||||
public override void OnDeath( Container c )
|
||||
{
|
||||
base.OnDeath( c );
|
||||
|
||||
c.DropItem( new CoilsFang() );
|
||||
|
||||
/*
|
||||
// TODO: uncomment once added
|
||||
if ( Utility.RandomDouble() < 0.025 )
|
||||
{
|
||||
switch ( Utility.Random( 5 ) )
|
||||
{
|
||||
case 0: c.DropItem( new AssassinChest() ); break;
|
||||
case 1: c.DropItem( new DeathGloves() ); break;
|
||||
case 2: c.DropItem( new LeafweaveLegs() ); break;
|
||||
case 3: c.DropItem( new HunterLegs() ); break;
|
||||
case 4: c.DropItem( new MyrmidonLegs() ); break;
|
||||
}
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
public override Poison HitPoison { get { return Poison.Lethal; } }
|
||||
public override Poison PoisonImmune { get { return Poison.Lethal; } }
|
||||
public override bool GivesMLMinorArtifact { get { return true; } }
|
||||
public override int Hides { get { return 48; } }
|
||||
public override int Meat { get { return 1; } }
|
||||
|
||||
public Coil( Serial serial )
|
||||
: base( serial )
|
||||
{
|
||||
}
|
||||
|
||||
public override void Serialize( GenericWriter writer )
|
||||
{
|
||||
base.Serialize( writer );
|
||||
|
||||
writer.Write( (int) 0 ); // version
|
||||
}
|
||||
|
||||
public override void Deserialize( GenericReader reader )
|
||||
{
|
||||
base.Deserialize( reader );
|
||||
|
||||
int version = reader.ReadInt();
|
||||
}
|
||||
}
|
||||
}
|
||||
46
Scripts/Mobiles/Monsters/ML/Blighted Grove/EnslavedSatyr.cs
Normal file
46
Scripts/Mobiles/Monsters/ML/Blighted Grove/EnslavedSatyr.cs
Normal file
|
|
@ -0,0 +1,46 @@
|
|||
using System;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "an enslaved satyr corpse" )]
|
||||
public class EnslavedSatyr : Satyr
|
||||
{
|
||||
[Constructable]
|
||||
public EnslavedSatyr()
|
||||
{
|
||||
Name = "an enslaved satyr";
|
||||
}
|
||||
|
||||
/*
|
||||
// TODO: uncomment once added
|
||||
public override void OnDeath( Container c )
|
||||
{
|
||||
base.OnDeath( c );
|
||||
|
||||
if ( Utility.RandomDouble() < 0.1 )
|
||||
c.DropItem( new ParrotItem() );
|
||||
}
|
||||
*/
|
||||
|
||||
public EnslavedSatyr( Serial serial )
|
||||
: base( serial )
|
||||
{
|
||||
}
|
||||
|
||||
public override void Serialize( GenericWriter writer )
|
||||
{
|
||||
base.Serialize( writer );
|
||||
|
||||
writer.Write( (int) 0 ); // version
|
||||
}
|
||||
|
||||
public override void Deserialize( GenericReader reader )
|
||||
{
|
||||
base.Deserialize( reader );
|
||||
|
||||
int version = reader.ReadInt();
|
||||
}
|
||||
}
|
||||
}
|
||||
91
Scripts/Mobiles/Monsters/ML/Blighted Grove/Hydra.cs
Normal file
91
Scripts/Mobiles/Monsters/ML/Blighted Grove/Hydra.cs
Normal file
|
|
@ -0,0 +1,91 @@
|
|||
using System;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a hydra corpse" )]
|
||||
public class Hydra : BaseCreature
|
||||
{
|
||||
[Constructable]
|
||||
public Hydra()
|
||||
: base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
Name = "a hydra";
|
||||
Body = 0x109;
|
||||
BaseSoundID = 0x16A;
|
||||
|
||||
SetStr( 801, 828 );
|
||||
SetDex( 102, 118 );
|
||||
SetInt( 102, 120 );
|
||||
|
||||
SetHits( 1480, 1500 );
|
||||
|
||||
SetDamage( 21, 26 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 60 );
|
||||
SetDamageType( ResistanceType.Fire, 10 );
|
||||
SetDamageType( ResistanceType.Cold, 10 );
|
||||
SetDamageType( ResistanceType.Poison, 10 );
|
||||
SetDamageType( ResistanceType.Energy, 10 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 65, 75 );
|
||||
SetResistance( ResistanceType.Fire, 70, 85 );
|
||||
SetResistance( ResistanceType.Cold, 25, 35 );
|
||||
SetResistance( ResistanceType.Poison, 35, 43 );
|
||||
SetResistance( ResistanceType.Energy, 36, 45 );
|
||||
|
||||
SetSkill( SkillName.Wrestling, 103.5, 117.4 );
|
||||
SetSkill( SkillName.Tactics, 100.1, 109.8 );
|
||||
SetSkill( SkillName.MagicResist, 85.5, 98.5 );
|
||||
SetSkill( SkillName.Anatomy, 75.4, 79.8 );
|
||||
|
||||
// TODO: Fame/Karma
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.UltraRich, 3 );
|
||||
}
|
||||
|
||||
public override void OnDeath( Container c )
|
||||
{
|
||||
base.OnDeath( c );
|
||||
|
||||
c.DropItem( new HydraScale() );
|
||||
|
||||
/*
|
||||
// TODO: uncomment once added
|
||||
if ( Utility.RandomDouble() < 0.2 )
|
||||
c.DropItem( new ParrotItem() );
|
||||
|
||||
if ( Utility.RandomDouble() < 0.05 )
|
||||
c.DropItem( new ThorvaldsMedallion() );
|
||||
*/
|
||||
}
|
||||
|
||||
public override bool HasBreath { get { return true; } }
|
||||
public override int Hides { get { return 40; } }
|
||||
public override int Meat { get { return 19; } }
|
||||
public override int TreasureMapLevel { get { return 5; } }
|
||||
|
||||
public Hydra( Serial serial )
|
||||
: base( serial )
|
||||
{
|
||||
}
|
||||
|
||||
public override void Serialize( GenericWriter writer )
|
||||
{
|
||||
base.Serialize( writer );
|
||||
|
||||
writer.Write( (int) 0 ); // version
|
||||
}
|
||||
|
||||
public override void Deserialize( GenericReader reader )
|
||||
{
|
||||
base.Deserialize( reader );
|
||||
|
||||
int version = reader.ReadInt();
|
||||
}
|
||||
}
|
||||
}
|
||||
50
Scripts/Mobiles/Monsters/ML/Blighted Grove/InsaneDryad.cs
Normal file
50
Scripts/Mobiles/Monsters/ML/Blighted Grove/InsaneDryad.cs
Normal file
|
|
@ -0,0 +1,50 @@
|
|||
using System;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "an insane dryad corpse" )]
|
||||
public class InsaneDryad : MLDryad
|
||||
{
|
||||
public override bool InitialInnocent { get { return false; } }
|
||||
|
||||
[Constructable]
|
||||
public InsaneDryad()
|
||||
{
|
||||
Name = "an insane dryad";
|
||||
|
||||
// TODO: Perhaps these should have negative karma?
|
||||
}
|
||||
|
||||
/*
|
||||
// TODO: uncomment once added
|
||||
public override void OnDeath( Container c )
|
||||
{
|
||||
base.OnDeath( c );
|
||||
|
||||
if ( Utility.RandomDouble() < 0.1 )
|
||||
c.DropItem( new ParrotItem() );
|
||||
}
|
||||
*/
|
||||
|
||||
public InsaneDryad( Serial serial )
|
||||
: base( serial )
|
||||
{
|
||||
}
|
||||
|
||||
public override void Serialize( GenericWriter writer )
|
||||
{
|
||||
base.Serialize( writer );
|
||||
|
||||
writer.Write( (int) 0 ); // version
|
||||
}
|
||||
|
||||
public override void Deserialize( GenericReader reader )
|
||||
{
|
||||
base.Deserialize( reader );
|
||||
|
||||
int version = reader.ReadInt();
|
||||
}
|
||||
}
|
||||
}
|
||||
77
Scripts/Mobiles/Monsters/ML/Blighted Grove/Saliva.cs
Normal file
77
Scripts/Mobiles/Monsters/ML/Blighted Grove/Saliva.cs
Normal file
|
|
@ -0,0 +1,77 @@
|
|||
using System;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a Saliva corpse" )]
|
||||
public class Saliva : Harpy
|
||||
{
|
||||
[Constructable]
|
||||
public Saliva()
|
||||
{
|
||||
// TODO: Not a paragon? No ML arties?
|
||||
// It moves like a paragon on OSI...
|
||||
|
||||
Name = "Saliva";
|
||||
Hue = 0x11E;
|
||||
|
||||
SetStr( 110, 206 );
|
||||
SetDex( 123, 222 );
|
||||
SetInt( 80, 127 );
|
||||
|
||||
SetHits( 409, 842 );
|
||||
|
||||
SetDamage( 20, 22 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 100 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 46, 48 );
|
||||
SetResistance( ResistanceType.Fire, 32, 40 );
|
||||
SetResistance( ResistanceType.Cold, 34, 49 );
|
||||
SetResistance( ResistanceType.Poison, 40, 48 );
|
||||
SetResistance( ResistanceType.Energy, 35, 39 );
|
||||
|
||||
SetSkill( SkillName.Wrestling, 106.4, 128.8 );
|
||||
SetSkill( SkillName.Tactics, 129.9, 141.0 );
|
||||
SetSkill( SkillName.MagicResist, 84.3, 105.0 );
|
||||
|
||||
// TODO: Fame/Karma?
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.UltraRich, 2 );
|
||||
}
|
||||
|
||||
public override void OnDeath( Container c )
|
||||
{
|
||||
base.OnDeath( c );
|
||||
|
||||
c.DropItem( new SalivasFeather() );
|
||||
|
||||
// TODO: uncomment once added
|
||||
//if ( Utility.RandomDouble() < 0.1 )
|
||||
// c.DropItem( new ParrotItem() );
|
||||
}
|
||||
|
||||
public Saliva( Serial serial )
|
||||
: base( serial )
|
||||
{
|
||||
}
|
||||
|
||||
public override void Serialize( GenericWriter writer )
|
||||
{
|
||||
base.Serialize( writer );
|
||||
|
||||
writer.Write( (int) 0 ); // version
|
||||
}
|
||||
|
||||
public override void Deserialize( GenericReader reader )
|
||||
{
|
||||
base.Deserialize( reader );
|
||||
|
||||
int version = reader.ReadInt();
|
||||
}
|
||||
}
|
||||
}
|
||||
78
Scripts/Mobiles/Monsters/ML/Blighted Grove/Tangle.cs
Normal file
78
Scripts/Mobiles/Monsters/ML/Blighted Grove/Tangle.cs
Normal file
|
|
@ -0,0 +1,78 @@
|
|||
using System;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a Tangle corpse" )]
|
||||
public class Tangle : BogThing
|
||||
{
|
||||
[Constructable]
|
||||
public Tangle()
|
||||
{
|
||||
// TODO: Not a paragon? No ML arties?
|
||||
// It moves like a paragon on OSI...
|
||||
|
||||
Name = "Tangle";
|
||||
Hue = 0x21;
|
||||
|
||||
SetStr( 870, 940 );
|
||||
SetDex( 58, 74 );
|
||||
SetInt( 46, 58 );
|
||||
|
||||
SetHits( 2468, 2733 );
|
||||
SetMana( 8, 12 );
|
||||
|
||||
SetDamage( 15, 28 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 60 );
|
||||
SetDamageType( ResistanceType.Poison, 40 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 50, 57 );
|
||||
SetResistance( ResistanceType.Fire, 40, 43 );
|
||||
SetResistance( ResistanceType.Cold, 30, 35 );
|
||||
SetResistance( ResistanceType.Poison, 61, 69 );
|
||||
SetResistance( ResistanceType.Energy, 41, 45 );
|
||||
|
||||
SetSkill( SkillName.Wrestling, 77.8, 94.6 );
|
||||
SetSkill( SkillName.Tactics, 90.6, 100.4 );
|
||||
SetSkill( SkillName.MagicResist, 108.4, 114.0 );
|
||||
|
||||
// TODO: Fame/Karma?
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.UltraRich, 3 );
|
||||
}
|
||||
|
||||
public override void OnDeath( Container c )
|
||||
{
|
||||
base.OnDeath( c );
|
||||
|
||||
if ( Utility.RandomDouble() < 0.3 )
|
||||
c.DropItem( new TaintedSeeds() );
|
||||
}
|
||||
|
||||
public override Poison PoisonImmune { get { return Poison.Lethal; } }
|
||||
|
||||
public Tangle( Serial serial )
|
||||
: base( serial )
|
||||
{
|
||||
}
|
||||
|
||||
public override void Serialize( GenericWriter writer )
|
||||
{
|
||||
base.Serialize( writer );
|
||||
|
||||
writer.Write( (int) 0 ); // version
|
||||
}
|
||||
|
||||
public override void Deserialize( GenericReader reader )
|
||||
{
|
||||
base.Deserialize( reader );
|
||||
|
||||
int version = reader.ReadInt();
|
||||
}
|
||||
}
|
||||
}
|
||||
81
Scripts/Mobiles/Monsters/ML/Blighted Grove/Thrasher.cs
Normal file
81
Scripts/Mobiles/Monsters/ML/Blighted Grove/Thrasher.cs
Normal file
|
|
@ -0,0 +1,81 @@
|
|||
using System;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a Thrasher corpse" )]
|
||||
public class Thrasher : Alligator
|
||||
{
|
||||
[Constructable]
|
||||
public Thrasher()
|
||||
{
|
||||
IsParagon = true;
|
||||
|
||||
Name = "Thrasher";
|
||||
Hue = 0x497;
|
||||
|
||||
SetStr( 93, 327 );
|
||||
SetDex( 7, 201 );
|
||||
SetInt( 15, 67 );
|
||||
|
||||
SetHits( 260, 984 );
|
||||
SetStam( 56, 75 );
|
||||
SetMana( 25, 30 );
|
||||
|
||||
SetDamage( 20, 30 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 100 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 50, 55 );
|
||||
SetResistance( ResistanceType.Fire, 25, 29 );
|
||||
SetResistance( ResistanceType.Poison, 25, 28 );
|
||||
|
||||
SetSkill( SkillName.Wrestling, 101.2, 118.3 );
|
||||
SetSkill( SkillName.Tactics, 96.3, 117.3 );
|
||||
SetSkill( SkillName.MagicResist, 102.4, 118.6 );
|
||||
|
||||
// TODO: Fame/Karma
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.FilthyRich, 4 );
|
||||
}
|
||||
|
||||
public override WeaponAbility GetWeaponAbility()
|
||||
{
|
||||
return WeaponAbility.ArmorIgnore;
|
||||
}
|
||||
|
||||
public override void OnDeath( Container c )
|
||||
{
|
||||
base.OnDeath( c );
|
||||
|
||||
c.DropItem( new ThrashersTail() );
|
||||
}
|
||||
|
||||
public override bool GivesMLMinorArtifact { get { return true; } }
|
||||
public override int Hides { get { return 48; } }
|
||||
public override int Meat { get { return 1; } }
|
||||
|
||||
public Thrasher( Serial serial )
|
||||
: base( serial )
|
||||
{
|
||||
}
|
||||
|
||||
public override void Serialize( GenericWriter writer )
|
||||
{
|
||||
base.Serialize( writer );
|
||||
|
||||
writer.Write( (int) 0 ); // version
|
||||
}
|
||||
|
||||
public override void Deserialize( GenericReader reader )
|
||||
{
|
||||
base.Deserialize( reader );
|
||||
|
||||
int version = reader.ReadInt();
|
||||
}
|
||||
}
|
||||
}
|
||||
111
Scripts/Mobiles/Monsters/ML/Humanoid/Magic/FetidEssence.cs
Normal file
111
Scripts/Mobiles/Monsters/ML/Humanoid/Magic/FetidEssence.cs
Normal file
|
|
@ -0,0 +1,111 @@
|
|||
using System;
|
||||
using System.Collections;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName("a fetid essence corpse")]
|
||||
public class FetidEssence : BaseCreature
|
||||
{
|
||||
[Constructable]
|
||||
public FetidEssence () : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
Name = "a fetid essence";
|
||||
Body = 273;
|
||||
|
||||
SetStr( 101, 150 );
|
||||
SetDex( 210, 250 );
|
||||
SetInt( 451, 550 );
|
||||
|
||||
SetHits( 551, 650 );
|
||||
|
||||
SetDamage( 21, 25 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 30 );
|
||||
SetDamageType( ResistanceType.Poison, 70 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 40, 50 );
|
||||
SetResistance( ResistanceType.Fire, 40, 50 );
|
||||
SetResistance( ResistanceType.Cold, 40, 50 );
|
||||
SetResistance( ResistanceType.Poison, 70, 90 );
|
||||
SetResistance( ResistanceType.Energy, 75, 80 );
|
||||
|
||||
SetSkill(SkillName.Meditation, 91.4, 99.4 );
|
||||
SetSkill(SkillName.EvalInt, 88.5, 92.3 );
|
||||
SetSkill(SkillName.Magery, 97.9, 101.7 );
|
||||
SetSkill(SkillName.Poisoning, 100 );
|
||||
SetSkill(SkillName.Anatomy, 0, 4.5 );
|
||||
SetSkill( SkillName.MagicResist, 103.5, 108.8 );
|
||||
SetSkill( SkillName.Tactics, 81.0, 84.6 );
|
||||
SetSkill( SkillName.Wrestling, 81.3, 83.9 );
|
||||
|
||||
Fame = 3700; // Guessed
|
||||
Karma = -3700; // Guessed
|
||||
}
|
||||
|
||||
public override void GenerateLoot() // Need to verify
|
||||
{
|
||||
AddLoot( LootPack.FilthyRich );
|
||||
}
|
||||
|
||||
public override Poison HitPoison{ get{ return Poison.Deadly; } }
|
||||
public override Poison PoisonImmune{ get{ return Poison.Deadly; } }
|
||||
|
||||
public override int GetAngerSound()
|
||||
{
|
||||
return 0x56d;
|
||||
}
|
||||
|
||||
public override int GetIdleSound()
|
||||
{
|
||||
return 0x56b;
|
||||
}
|
||||
|
||||
public override int GetAttackSound()
|
||||
{
|
||||
return 0x56c;
|
||||
}
|
||||
|
||||
public override int GetHurtSound()
|
||||
{
|
||||
return 0x56c;
|
||||
}
|
||||
|
||||
public override int GetDeathSound()
|
||||
{
|
||||
return 0x56e;
|
||||
}
|
||||
|
||||
public FetidEssence ( 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();
|
||||
}
|
||||
|
||||
/*private class InternalTimer : Timer
|
||||
{
|
||||
private Mobile m_From;
|
||||
private Mobile m_Mobile;
|
||||
private int m_Count;
|
||||
|
||||
public InternalTimer( Mobile from, Mobile m ) : base( TimeSpan.FromSeconds( 1.0 ), TimeSpan.FromSeconds( 1.0 ) )
|
||||
{
|
||||
m_From = from;
|
||||
m_Mobile = m;
|
||||
Priority = TimerPriority.TwoFiftyMS;
|
||||
}
|
||||
|
||||
}*/
|
||||
}
|
||||
}
|
||||
178
Scripts/Mobiles/Monsters/ML/Humanoid/Magic/InterredGrizzle .cs
Normal file
178
Scripts/Mobiles/Monsters/ML/Humanoid/Magic/InterredGrizzle .cs
Normal file
|
|
@ -0,0 +1,178 @@
|
|||
using System;
|
||||
using System.Collections;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName("an interred grizzle corpse")]
|
||||
public class InterredGrizzle : BaseCreature
|
||||
{
|
||||
[Constructable]
|
||||
public InterredGrizzle () : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
Name = "an interred grizzle";
|
||||
Body = 259;
|
||||
|
||||
SetStr( 451, 500 );
|
||||
SetDex( 201, 250 );
|
||||
SetInt( 801, 850 );
|
||||
|
||||
SetHits( 1500 );
|
||||
SetStam( 150 );
|
||||
|
||||
SetDamage( 16, 19 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 30 );
|
||||
SetDamageType( ResistanceType.Fire, 70 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 35, 55 );
|
||||
SetResistance( ResistanceType.Fire, 20, 65 );
|
||||
SetResistance( ResistanceType.Cold, 55, 80 );
|
||||
SetResistance( ResistanceType.Poison, 20, 35 );
|
||||
SetResistance( ResistanceType.Energy, 60, 80 );
|
||||
|
||||
SetSkill(SkillName.Meditation, 77.7, 84.0 );
|
||||
SetSkill(SkillName.EvalInt, 72.2, 79.6 );
|
||||
SetSkill(SkillName.Magery, 83.7, 89.6);
|
||||
SetSkill(SkillName.Poisoning, 0 );
|
||||
SetSkill(SkillName.Anatomy, 0 );
|
||||
SetSkill( SkillName.MagicResist, 80.2, 87.3 );
|
||||
SetSkill( SkillName.Tactics, 104.5, 105.1 );
|
||||
SetSkill( SkillName.Wrestling, 105.1, 109.4 );
|
||||
|
||||
Fame = 3700; // Guessed
|
||||
Karma = -3700; // Guessed
|
||||
}
|
||||
|
||||
public override void GenerateLoot() // -- Need to verify
|
||||
{
|
||||
AddLoot( LootPack.FilthyRich );
|
||||
}
|
||||
|
||||
// TODO: Acid Blood
|
||||
/*
|
||||
* Message: 1070820
|
||||
* Spits pool of acid (blood, hue 0x3F), hits lost 6-10 per second/step
|
||||
* Damage is resistable (physical)
|
||||
* Acid last 10 seconds
|
||||
*/
|
||||
|
||||
public override int GetAngerSound()
|
||||
{
|
||||
return 0x581;
|
||||
}
|
||||
|
||||
public override int GetIdleSound()
|
||||
{
|
||||
return 0x582;
|
||||
}
|
||||
|
||||
public override int GetAttackSound()
|
||||
{
|
||||
return 0x580;
|
||||
}
|
||||
|
||||
public override int GetHurtSound()
|
||||
{
|
||||
return 0x583;
|
||||
}
|
||||
|
||||
public override int GetDeathSound()
|
||||
{
|
||||
return 0x584;
|
||||
}
|
||||
|
||||
public override void OnDamage( int amount, Mobile from, bool willKill )
|
||||
{
|
||||
if( Utility.RandomDouble() < 0.1 )
|
||||
DropOoze();
|
||||
|
||||
base.OnDamage( amount, from, willKill );
|
||||
}
|
||||
|
||||
private int RandomPoint( int mid )
|
||||
{
|
||||
return ( mid + Utility.RandomMinMax( -2, 2 ) );
|
||||
}
|
||||
|
||||
public virtual Point3D GetSpawnPosition( int range )
|
||||
{
|
||||
return GetSpawnPosition( Location, Map, range );
|
||||
}
|
||||
|
||||
public virtual Point3D GetSpawnPosition( Point3D from, Map map, int range )
|
||||
{
|
||||
if( map == null )
|
||||
return from;
|
||||
|
||||
Point3D loc = new Point3D( ( RandomPoint( X ) ), ( RandomPoint( Y ) ), Z );
|
||||
|
||||
loc.Z = Map.GetAverageZ( loc.X, loc.Y );
|
||||
|
||||
return loc;
|
||||
}
|
||||
|
||||
public virtual void DropOoze()
|
||||
{
|
||||
int amount = Utility.RandomMinMax( 1, 3 );
|
||||
bool corrosive = Utility.RandomBool();
|
||||
|
||||
for( int i = 0; i < amount; i++ )
|
||||
{
|
||||
Item ooze = new StainedOoze( corrosive );
|
||||
Point3D p = new Point3D( Location );
|
||||
|
||||
for( int j = 0; j < 5; j++ )
|
||||
{
|
||||
p = GetSpawnPosition( 2 );
|
||||
bool found = false;
|
||||
|
||||
foreach( Item item in Map.GetItemsInRange( p, 0 ) )
|
||||
if( item is StainedOoze )
|
||||
{
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
|
||||
if( !found )
|
||||
break;
|
||||
}
|
||||
|
||||
ooze.MoveToWorld( p, Map );
|
||||
}
|
||||
|
||||
if( Combatant != null )
|
||||
{
|
||||
if( corrosive )
|
||||
Combatant.SendLocalizedMessage( 1072071 ); // A corrosive gas seeps out of your enemy's skin!
|
||||
else
|
||||
Combatant.SendLocalizedMessage( 1072072 ); // A poisonous gas seeps out of your enemy's skin!
|
||||
}
|
||||
}
|
||||
/*
|
||||
public override bool OnBeforeDeath()
|
||||
{
|
||||
SpillAcid( 1, 4, 10, 6, 10 );
|
||||
|
||||
return base.OnBeforeDeath();
|
||||
}
|
||||
*/
|
||||
|
||||
public InterredGrizzle ( 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
161
Scripts/Mobiles/Monsters/ML/Humanoid/Magic/MLDryad.cs
Normal file
161
Scripts/Mobiles/Monsters/ML/Humanoid/Magic/MLDryad.cs
Normal file
|
|
@ -0,0 +1,161 @@
|
|||
using System;
|
||||
using Server.Engines.Plants;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a dryad's corpse" )]
|
||||
public class MLDryad : BaseCreature
|
||||
{
|
||||
public override bool InitialInnocent { get { return true; } }
|
||||
|
||||
public override OppositionGroup OppositionGroup
|
||||
{
|
||||
get { return OppositionGroup.FeyAndUndead; }
|
||||
}
|
||||
|
||||
[Constructable]
|
||||
public MLDryad() : base( AIType.AI_Mage, FightMode.Evil, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
Name = "a dryad";
|
||||
Body = 266;
|
||||
BaseSoundID = 0x57B;
|
||||
|
||||
SetStr( 132, 149 );
|
||||
SetDex( 152, 168 );
|
||||
SetInt( 251, 280 );
|
||||
|
||||
SetHits( 304, 321 );
|
||||
|
||||
SetDamage( 11, 20 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 100 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 40, 50 );
|
||||
SetResistance( ResistanceType.Fire, 15, 25 );
|
||||
SetResistance( ResistanceType.Cold, 40, 45 );
|
||||
SetResistance( ResistanceType.Poison, 30, 40 );
|
||||
SetResistance( ResistanceType.Energy, 25, 35 );
|
||||
|
||||
SetSkill( SkillName.Meditation, 80.0, 90.0 );
|
||||
SetSkill( SkillName.EvalInt, 70.0, 80.0 );
|
||||
SetSkill( SkillName.Magery, 70.0, 80.0 );
|
||||
SetSkill( SkillName.Anatomy, 0 );
|
||||
SetSkill( SkillName.MagicResist, 100.0, 120.0 );
|
||||
SetSkill( SkillName.Tactics, 70.0, 80.0 );
|
||||
SetSkill( SkillName.Wrestling, 70.0, 80.0 );
|
||||
|
||||
Fame = 5000;
|
||||
Karma = 5000;
|
||||
|
||||
VirtualArmor = 28; // Don't know what it should be
|
||||
|
||||
if ( Core.ML && Utility.RandomDouble() < .60 )
|
||||
PackItem( Seed.RandomPeculiarSeed( 1 ) );
|
||||
|
||||
PackArcanceScroll( 0.05 );
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.MlRich );
|
||||
}
|
||||
|
||||
public override int Meat { get { return 1; } }
|
||||
|
||||
public override void OnThink()
|
||||
{
|
||||
base.OnThink();
|
||||
|
||||
AreaPeace();
|
||||
AreaUndress();
|
||||
}
|
||||
|
||||
#region Area Peace
|
||||
private DateTime m_NextPeace;
|
||||
|
||||
public void AreaPeace()
|
||||
{
|
||||
if ( Combatant == null || Deleted || !Alive || m_NextPeace > DateTime.UtcNow || 0.1 < Utility.RandomDouble() )
|
||||
return;
|
||||
|
||||
TimeSpan duration = TimeSpan.FromSeconds( Utility.RandomMinMax( 20, 80 ) );
|
||||
|
||||
foreach ( Mobile m in GetMobilesInRange( RangePerception ) )
|
||||
{
|
||||
PlayerMobile p = m as PlayerMobile;
|
||||
|
||||
if ( IsValidTarget( p ) )
|
||||
{
|
||||
p.PeacedUntil = DateTime.UtcNow + duration;
|
||||
p.SendLocalizedMessage( 1072065 ); // You gaze upon the dryad's beauty, and forget to continue battling!
|
||||
p.FixedParticles( 0x376A, 1, 20, 0x7F5, EffectLayer.Waist );
|
||||
p.Combatant = null;
|
||||
}
|
||||
}
|
||||
|
||||
m_NextPeace = DateTime.UtcNow + TimeSpan.FromSeconds( 10 );
|
||||
PlaySound( 0x1D3 );
|
||||
}
|
||||
|
||||
public bool IsValidTarget( PlayerMobile m )
|
||||
{
|
||||
if ( m != null && m.PeacedUntil < DateTime.UtcNow && !m.Hidden && m.AccessLevel == AccessLevel.Player && CanBeHarmful( m ) )
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Undress
|
||||
private DateTime m_NextUndress;
|
||||
|
||||
public void AreaUndress()
|
||||
{
|
||||
if ( Combatant == null || Deleted || !Alive || m_NextUndress > DateTime.UtcNow || 0.005 < Utility.RandomDouble() )
|
||||
return;
|
||||
|
||||
foreach ( Mobile m in GetMobilesInRange( RangePerception ) )
|
||||
{
|
||||
if ( m != null && m.Player && !m.Female && !m.Hidden && m.AccessLevel == AccessLevel.Player && CanBeHarmful( m ) )
|
||||
{
|
||||
UndressItem( m, Layer.OuterTorso );
|
||||
UndressItem( m, Layer.InnerTorso );
|
||||
UndressItem( m, Layer.MiddleTorso );
|
||||
UndressItem( m, Layer.Pants );
|
||||
UndressItem( m, Layer.Shirt );
|
||||
|
||||
m.SendLocalizedMessage( 1072197 ); // The dryad's beauty makes your blood race. Your clothing is too confining.
|
||||
}
|
||||
}
|
||||
|
||||
m_NextUndress = DateTime.UtcNow + TimeSpan.FromMinutes( 1 );
|
||||
}
|
||||
|
||||
public void UndressItem( Mobile m, Layer layer )
|
||||
{
|
||||
Item item = m.FindItemOnLayer( layer );
|
||||
|
||||
if ( item != null && item.Movable )
|
||||
m.PlaceInBackpack( item );
|
||||
}
|
||||
#endregion
|
||||
|
||||
public MLDryad( Serial serial ) : base( serial )
|
||||
{
|
||||
}
|
||||
|
||||
public override void Serialize( GenericWriter writer )
|
||||
{
|
||||
base.Serialize( writer );
|
||||
|
||||
writer.Write( (int) 0 ); // version
|
||||
}
|
||||
|
||||
public override void Deserialize( GenericReader reader )
|
||||
{
|
||||
base.Deserialize( reader );
|
||||
|
||||
int version = reader.ReadInt();
|
||||
}
|
||||
}
|
||||
}
|
||||
239
Scripts/Mobiles/Monsters/ML/Humanoid/Magic/Satyr.cs
Normal file
239
Scripts/Mobiles/Monsters/ML/Humanoid/Magic/Satyr.cs
Normal file
|
|
@ -0,0 +1,239 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a satyr's corpse" )]
|
||||
public class Satyr : BaseCreature
|
||||
{
|
||||
[Constructable]
|
||||
public Satyr() : base( AIType.AI_Animal, FightMode.Aggressor, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
Name = "a satyr";
|
||||
Body = 271;
|
||||
BaseSoundID = 0x586;
|
||||
|
||||
SetStr( 177, 195 );
|
||||
SetDex( 251, 269 );
|
||||
SetInt( 153, 170 );
|
||||
|
||||
SetHits( 350, 400 );
|
||||
|
||||
SetDamage( 13, 24 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 100 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 55, 60 );
|
||||
SetResistance( ResistanceType.Fire, 25, 35 );
|
||||
SetResistance( ResistanceType.Cold, 30, 40 );
|
||||
SetResistance( ResistanceType.Poison, 30, 40 );
|
||||
SetResistance( ResistanceType.Energy, 30, 40 );
|
||||
|
||||
SetSkill( SkillName.MagicResist, 55.0, 65.0 );
|
||||
SetSkill( SkillName.Tactics, 80.0, 100.0 );
|
||||
SetSkill( SkillName.Wrestling, 80.0, 100.0 );
|
||||
|
||||
Fame = 5000;
|
||||
Karma = 0;
|
||||
|
||||
VirtualArmor = 28; // Don't know what it should be
|
||||
|
||||
PackArcanceScroll( 0.05 );
|
||||
}
|
||||
|
||||
public override OppositionGroup OppositionGroup
|
||||
{
|
||||
get { return OppositionGroup.FeyAndUndead; }
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.MlRich );
|
||||
}
|
||||
|
||||
public override void OnThink()
|
||||
{
|
||||
base.OnThink();
|
||||
|
||||
Peace( Combatant );
|
||||
Undress( Combatant );
|
||||
Suppress( Combatant );
|
||||
Provoke( Combatant );
|
||||
}
|
||||
|
||||
#region Peace
|
||||
private DateTime m_NextPeace;
|
||||
|
||||
public void Peace( Mobile target )
|
||||
{
|
||||
if ( target == null || Deleted || !Alive || m_NextPeace > DateTime.UtcNow || 0.1 < Utility.RandomDouble() )
|
||||
return;
|
||||
|
||||
PlayerMobile p = target as PlayerMobile;
|
||||
|
||||
if ( p != null && p.PeacedUntil < DateTime.UtcNow && !p.Hidden && CanBeHarmful( p ) )
|
||||
{
|
||||
p.PeacedUntil = DateTime.UtcNow + TimeSpan.FromMinutes( 1 );
|
||||
p.SendLocalizedMessage( 500616 ); // You hear lovely music, and forget to continue battling!
|
||||
p.FixedParticles( 0x376A, 1, 32, 0x15BD, EffectLayer.Waist );
|
||||
p.Combatant = null;
|
||||
|
||||
PlaySound( 0x58D );
|
||||
}
|
||||
|
||||
m_NextPeace = DateTime.UtcNow + TimeSpan.FromSeconds( 10 );
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Suppress
|
||||
private static Dictionary<Mobile, Timer> m_Suppressed = new Dictionary<Mobile, Timer>();
|
||||
private DateTime m_NextSuppress;
|
||||
|
||||
public void Suppress( Mobile target )
|
||||
{
|
||||
if ( target == null || m_Suppressed.ContainsKey( target ) || Deleted || !Alive || m_NextSuppress > DateTime.UtcNow || 0.1 < Utility.RandomDouble() )
|
||||
return;
|
||||
|
||||
TimeSpan delay = TimeSpan.FromSeconds( Utility.RandomMinMax( 20, 80 ) );
|
||||
|
||||
if ( !target.Hidden && CanBeHarmful( target ) )
|
||||
{
|
||||
target.SendLocalizedMessage( 1072061 ); // You hear jarring music, suppressing your strength.
|
||||
|
||||
for ( int i = 0; i < target.Skills.Length; i++ )
|
||||
{
|
||||
Skill s = target.Skills[ i ];
|
||||
|
||||
target.AddSkillMod( new TimedSkillMod( s.SkillName, true, s.Base * -0.28, delay ) );
|
||||
}
|
||||
|
||||
int count = (int) Math.Round( delay.TotalSeconds / 1.25 );
|
||||
Timer timer = new AnimateTimer( target, count );
|
||||
m_Suppressed.Add( target, timer );
|
||||
timer.Start();
|
||||
|
||||
PlaySound( 0x58C );
|
||||
}
|
||||
|
||||
m_NextSuppress = DateTime.UtcNow + TimeSpan.FromSeconds( 10 );
|
||||
}
|
||||
|
||||
public static void SuppressRemove( Mobile target )
|
||||
{
|
||||
if ( target != null && m_Suppressed.ContainsKey( target ) )
|
||||
{
|
||||
Timer timer = m_Suppressed[ target ];
|
||||
|
||||
if ( timer != null || timer.Running )
|
||||
timer.Stop();
|
||||
|
||||
m_Suppressed.Remove( target );
|
||||
}
|
||||
}
|
||||
|
||||
private class AnimateTimer : Timer
|
||||
{
|
||||
private Mobile m_Owner;
|
||||
private int m_Count;
|
||||
|
||||
public AnimateTimer( Mobile owner, int count ) : base( TimeSpan.Zero, TimeSpan.FromSeconds( 1.25 ) )
|
||||
{
|
||||
m_Owner = owner;
|
||||
m_Count = count;
|
||||
}
|
||||
|
||||
protected override void OnTick()
|
||||
{
|
||||
if ( m_Owner.Deleted || !m_Owner.Alive || m_Count-- < 0 )
|
||||
{
|
||||
SuppressRemove( m_Owner );
|
||||
}
|
||||
else
|
||||
m_Owner.FixedParticles( 0x376A, 1, 32, 0x15BD, EffectLayer.Waist );
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Undress
|
||||
private DateTime m_NextUndress;
|
||||
|
||||
public void Undress( Mobile target )
|
||||
{
|
||||
if ( target == null || Deleted || !Alive || m_NextUndress > DateTime.UtcNow || 0.005 < Utility.RandomDouble() )
|
||||
return;
|
||||
|
||||
if ( target.Player && target.Female && !target.Hidden && CanBeHarmful( target ) )
|
||||
{
|
||||
UndressItem( target, Layer.OuterTorso );
|
||||
UndressItem( target, Layer.InnerTorso );
|
||||
UndressItem( target, Layer.MiddleTorso );
|
||||
UndressItem( target, Layer.Pants );
|
||||
UndressItem( target, Layer.Shirt );
|
||||
|
||||
target.SendLocalizedMessage( 1072196 ); // The satyr's music makes your blood race. Your clothing is too confining.
|
||||
}
|
||||
|
||||
m_NextUndress = DateTime.UtcNow + TimeSpan.FromMinutes( 1 );
|
||||
}
|
||||
|
||||
public void UndressItem( Mobile m, Layer layer )
|
||||
{
|
||||
Item item = m.FindItemOnLayer( layer );
|
||||
|
||||
if ( item != null && item.Movable )
|
||||
m.PlaceInBackpack( item );
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Provoke
|
||||
private DateTime m_NextProvoke;
|
||||
|
||||
public void Provoke( Mobile target )
|
||||
{
|
||||
if ( target == null || Deleted || !Alive || m_NextProvoke > DateTime.UtcNow || 0.05 < Utility.RandomDouble() )
|
||||
return;
|
||||
|
||||
foreach ( Mobile m in GetMobilesInRange( RangePerception ) )
|
||||
{
|
||||
if ( m is BaseCreature )
|
||||
{
|
||||
BaseCreature c = (BaseCreature) m;
|
||||
|
||||
if ( c == this || c == target || c.Unprovokable || c.IsParagon || c.BardProvoked || c.AccessLevel != AccessLevel.Player || !c.CanBeHarmful( target ) )
|
||||
continue;
|
||||
|
||||
c.Provoke( this, target, true );
|
||||
|
||||
if ( target.Player )
|
||||
target.SendLocalizedMessage( 1072062 ); // You hear angry music, and start to fight.
|
||||
|
||||
PlaySound( 0x58A );
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
m_NextProvoke = DateTime.UtcNow + TimeSpan.FromSeconds( 10 );
|
||||
}
|
||||
#endregion
|
||||
|
||||
public override int Meat { get { return 1; } }
|
||||
|
||||
public Satyr( Serial serial ) : base( serial )
|
||||
{
|
||||
}
|
||||
|
||||
public override void Serialize( GenericWriter writer )
|
||||
{
|
||||
base.Serialize( writer );
|
||||
|
||||
writer.Write( (int) 0 ); // version
|
||||
}
|
||||
|
||||
public override void Deserialize( GenericReader reader )
|
||||
{
|
||||
base.Deserialize( reader );
|
||||
|
||||
int version = reader.ReadInt();
|
||||
}
|
||||
}
|
||||
}
|
||||
100
Scripts/Mobiles/Monsters/ML/Humanoid/Melee/CorruptedSoul.cs
Normal file
100
Scripts/Mobiles/Monsters/ML/Humanoid/Melee/CorruptedSoul.cs
Normal file
|
|
@ -0,0 +1,100 @@
|
|||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using Server.Items;
|
||||
using Server.Targeting;
|
||||
using Server.Engines.Quests;
|
||||
using Server.Engines.Quests.Haven;
|
||||
using Server.ContextMenus;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
public class CorruptedSoul : BaseCreature
|
||||
{
|
||||
public override bool DeleteCorpseOnDeath{ get{ return true; } }
|
||||
|
||||
[Constructable]
|
||||
public CorruptedSoul() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, .1, 5 )
|
||||
{
|
||||
Name = "a corrupted soul";
|
||||
Body = 0x3CA;
|
||||
Hue = 0x453;
|
||||
|
||||
SetStr( 102, 115 );
|
||||
SetDex( 101, 115 );
|
||||
SetInt( 203, 215 );
|
||||
|
||||
SetHits( 61, 69 );
|
||||
|
||||
SetDamage( 4, 40 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 100 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 61, 74 );
|
||||
SetResistance( ResistanceType.Fire, 22, 48 );
|
||||
SetResistance( ResistanceType.Cold, 73, 100 );
|
||||
SetResistance( ResistanceType.Poison, 0 );
|
||||
SetResistance( ResistanceType.Energy, 51, 60 );
|
||||
|
||||
SetSkill( SkillName.MagicResist, 80.2, 89.4 );
|
||||
SetSkill( SkillName.Tactics, 81.3, 89.9 );
|
||||
SetSkill( SkillName.Wrestling, 80.1, 88.7 );
|
||||
|
||||
Fame = 5000;
|
||||
Karma = -5000;
|
||||
|
||||
// VirtualArmor = 6; Not sure
|
||||
}
|
||||
|
||||
public override bool AlwaysAttackable{ get{ return true; } }
|
||||
public override bool BleedImmune{ get{ return true; } } // NEED TO VERIFY
|
||||
|
||||
// NEED TO VERIFY SOUNDS! Known: No Idle Sound.
|
||||
|
||||
/*public override int GetAngerSound()
|
||||
{
|
||||
return 0x0;
|
||||
}*/
|
||||
|
||||
public override int GetAttackSound()
|
||||
{
|
||||
return 0x233;
|
||||
}
|
||||
|
||||
/*public override int GetDeathSound()
|
||||
{
|
||||
return 0x0;
|
||||
}*/
|
||||
|
||||
public override bool AlwaysMurderer{ get{ return true; } }
|
||||
|
||||
// TODO: Proper OnDeath Effect
|
||||
|
||||
public override bool OnBeforeDeath()
|
||||
{
|
||||
if ( !base.OnBeforeDeath() )
|
||||
return false;
|
||||
|
||||
// 1 in 20 chance that a Thread of Fate will appear in the killer's pack
|
||||
|
||||
Effects.SendLocationEffect( Location, Map, 0x376A, 10, 1 );
|
||||
return true;
|
||||
}
|
||||
|
||||
public CorruptedSoul( 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,90 @@
|
|||
using System;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a treefellow corpse" )]
|
||||
public class FerelTreefellow : BaseCreature
|
||||
{
|
||||
public override WeaponAbility GetWeaponAbility()
|
||||
{
|
||||
return WeaponAbility.Dismount;
|
||||
}
|
||||
|
||||
[Constructable]
|
||||
public FerelTreefellow() : base( AIType.AI_Melee, FightMode.Evil, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
Name = "a ferel treefellow";
|
||||
Body = 301;
|
||||
|
||||
SetStr( 1351, 1600 );
|
||||
SetDex( 301, 550 );
|
||||
SetInt( 651, 900 );
|
||||
|
||||
SetHits( 1170, 1320 );
|
||||
|
||||
SetDamage( 26, 35 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 100 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 60, 70 );
|
||||
SetResistance( ResistanceType.Cold, 70, 80 );
|
||||
SetResistance( ResistanceType.Poison, 60, 70 );
|
||||
SetResistance( ResistanceType.Energy, 40, 60 );
|
||||
|
||||
SetSkill( SkillName.MagicResist, 40.1, 55.0 );// Unknown
|
||||
SetSkill( SkillName.Tactics, 65.1, 90.0 );// Unknown
|
||||
SetSkill( SkillName.Wrestling, 65.1, 85.0 );// Unknown
|
||||
|
||||
Fame = 12500; //Unknown
|
||||
Karma = 12500; //Unknown
|
||||
|
||||
VirtualArmor = 24;
|
||||
PackItem( new Log( Utility.RandomMinMax( 23, 34 ) ) );
|
||||
}
|
||||
|
||||
public override OppositionGroup OppositionGroup
|
||||
{
|
||||
get{ return OppositionGroup.FeyAndUndead; }
|
||||
}
|
||||
|
||||
public override int GetIdleSound()
|
||||
{
|
||||
return 443;
|
||||
}
|
||||
|
||||
public override int GetDeathSound()
|
||||
{
|
||||
return 31;
|
||||
}
|
||||
|
||||
public override int GetAttackSound()
|
||||
{
|
||||
return 672;
|
||||
}
|
||||
|
||||
public override bool BleedImmune{ get{ return true; } }
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.Average ); //Unknown
|
||||
}
|
||||
|
||||
public FerelTreefellow( 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
101
Scripts/Mobiles/Monsters/ML/Humanoid/Melee/Minotaur.cs
Normal file
101
Scripts/Mobiles/Monsters/ML/Humanoid/Melee/Minotaur.cs
Normal file
|
|
@ -0,0 +1,101 @@
|
|||
using System;
|
||||
using System.Collections;
|
||||
using Server.Items;
|
||||
using Server.Targeting;
|
||||
using Server.Misc;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a minotaur corpse" )]
|
||||
public class Minotaur : BaseCreature
|
||||
{
|
||||
public override WeaponAbility GetWeaponAbility()
|
||||
{
|
||||
return WeaponAbility.ParalyzingBlow;
|
||||
}
|
||||
|
||||
[Constructable]
|
||||
public Minotaur() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 ) // NEED TO CHECK
|
||||
{
|
||||
Name = "a minotaur";
|
||||
Body = 263;
|
||||
|
||||
SetStr( 301, 340 );
|
||||
SetDex( 91, 110 );
|
||||
SetInt( 31, 50 );
|
||||
|
||||
SetHits( 301, 340 );
|
||||
|
||||
SetDamage( 11, 20 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 100 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 55, 65 );
|
||||
SetResistance( ResistanceType.Fire, 25, 35 );
|
||||
SetResistance( ResistanceType.Cold, 30, 40 );
|
||||
SetResistance( ResistanceType.Poison, 30, 40 );
|
||||
SetResistance( ResistanceType.Energy, 30, 40 );
|
||||
|
||||
SetSkill( SkillName.Meditation, 0 );
|
||||
SetSkill( SkillName.EvalInt, 0 );
|
||||
SetSkill( SkillName.Magery, 0 );
|
||||
SetSkill( SkillName.Poisoning, 0 );
|
||||
SetSkill( SkillName.Anatomy, 0 );
|
||||
SetSkill( SkillName.MagicResist, 56.1, 64.0 );
|
||||
SetSkill( SkillName.Tactics, 93.3, 97.8 );
|
||||
SetSkill( SkillName.Wrestling, 90.4, 92.1 );
|
||||
|
||||
Fame = 5000;
|
||||
Karma = -5000;
|
||||
|
||||
VirtualArmor = 28; // Don't know what it should be
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.Rich ); // Need to verify
|
||||
}
|
||||
|
||||
// Using Tormented Minotaur sounds - Need to veryfy
|
||||
public override int GetAngerSound()
|
||||
{
|
||||
return 0x597;
|
||||
}
|
||||
|
||||
public override int GetIdleSound()
|
||||
{
|
||||
return 0x596;
|
||||
}
|
||||
|
||||
public override int GetAttackSound()
|
||||
{
|
||||
return 0x599;
|
||||
}
|
||||
|
||||
public override int GetHurtSound()
|
||||
{
|
||||
return 0x59a;
|
||||
}
|
||||
|
||||
public override int GetDeathSound()
|
||||
{
|
||||
return 0x59c;
|
||||
}
|
||||
|
||||
public Minotaur( 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
101
Scripts/Mobiles/Monsters/ML/Humanoid/Melee/MinotaurCaptain.cs
Normal file
101
Scripts/Mobiles/Monsters/ML/Humanoid/Melee/MinotaurCaptain.cs
Normal file
|
|
@ -0,0 +1,101 @@
|
|||
using System;
|
||||
using System.Collections;
|
||||
using Server.Items;
|
||||
using Server.Targeting;
|
||||
using Server.Misc;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a minotaur corpse" )]
|
||||
public class MinotaurCaptain : BaseCreature
|
||||
{
|
||||
public override WeaponAbility GetWeaponAbility()
|
||||
{
|
||||
return WeaponAbility.ParalyzingBlow;
|
||||
}
|
||||
|
||||
[Constructable]
|
||||
public MinotaurCaptain() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 ) // NEED TO CHECK
|
||||
{
|
||||
Name = "a minotaur captain";
|
||||
Body = 280;
|
||||
|
||||
SetStr( 401, 425 );
|
||||
SetDex( 91, 110 );
|
||||
SetInt( 31, 50 );
|
||||
|
||||
SetHits( 401, 440 );
|
||||
|
||||
SetDamage( 11, 20 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 100 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 65, 75 );
|
||||
SetResistance( ResistanceType.Fire, 35, 45 );
|
||||
SetResistance( ResistanceType.Cold, 40, 50 );
|
||||
SetResistance( ResistanceType.Poison, 40, 50 );
|
||||
SetResistance( ResistanceType.Energy, 40, 50 );
|
||||
|
||||
SetSkill( SkillName.Meditation, 0 );
|
||||
SetSkill( SkillName.EvalInt, 0 );
|
||||
SetSkill( SkillName.Magery, 0 );
|
||||
SetSkill( SkillName.Poisoning, 0 );
|
||||
SetSkill( SkillName.Anatomy, 0, 6.3 );
|
||||
SetSkill( SkillName.MagicResist, 66.1, 73.6 );
|
||||
SetSkill( SkillName.Tactics, 93.0, 109.9 );
|
||||
SetSkill( SkillName.Wrestling, 92.6, 107.2 );
|
||||
|
||||
Fame = 7000;
|
||||
Karma = -7000;
|
||||
|
||||
VirtualArmor = 28; // Don't know what it should be
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.Rich ); // Need to verify
|
||||
}
|
||||
|
||||
// Using Tormented Minotaur sounds - Need to veryfy
|
||||
public override int GetAngerSound()
|
||||
{
|
||||
return 0x597;
|
||||
}
|
||||
|
||||
public override int GetIdleSound()
|
||||
{
|
||||
return 0x596;
|
||||
}
|
||||
|
||||
public override int GetAttackSound()
|
||||
{
|
||||
return 0x599;
|
||||
}
|
||||
|
||||
public override int GetHurtSound()
|
||||
{
|
||||
return 0x59a;
|
||||
}
|
||||
|
||||
public override int GetDeathSound()
|
||||
{
|
||||
return 0x59c;
|
||||
}
|
||||
|
||||
public MinotaurCaptain( 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
101
Scripts/Mobiles/Monsters/ML/Humanoid/Melee/MinotaurScout.cs
Normal file
101
Scripts/Mobiles/Monsters/ML/Humanoid/Melee/MinotaurScout.cs
Normal file
|
|
@ -0,0 +1,101 @@
|
|||
using System;
|
||||
using System.Collections;
|
||||
using Server.Items;
|
||||
using Server.Targeting;
|
||||
using Server.Misc;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a minotaur corpse" )]
|
||||
public class MinotaurScout : BaseCreature
|
||||
{
|
||||
public override WeaponAbility GetWeaponAbility()
|
||||
{
|
||||
return WeaponAbility.ParalyzingBlow;
|
||||
}
|
||||
|
||||
[Constructable]
|
||||
public MinotaurScout() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 ) // NEED TO CHECK
|
||||
{
|
||||
Name = "a minotaur scout";
|
||||
Body = 281;
|
||||
|
||||
SetStr( 353, 375 );
|
||||
SetDex( 111, 130 );
|
||||
SetInt( 34, 50 );
|
||||
|
||||
SetHits( 354, 383 );
|
||||
|
||||
SetDamage( 11, 20 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 100 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 55, 65 );
|
||||
SetResistance( ResistanceType.Fire, 25, 35 );
|
||||
SetResistance( ResistanceType.Cold, 30, 40 );
|
||||
SetResistance( ResistanceType.Poison, 30, 40 );
|
||||
SetResistance( ResistanceType.Energy, 30, 40 );
|
||||
|
||||
//SetSkill( SkillName.Meditation, Unknown );
|
||||
//SetSkill( SkillName.EvalInt, Unknown );
|
||||
//SetSkill( SkillName.Magery, Unknown );
|
||||
//SetSkill( SkillName.Poisoning, Unknown );
|
||||
SetSkill( SkillName.Anatomy, 0 );
|
||||
SetSkill( SkillName.MagicResist, 60.6, 67.5 );
|
||||
SetSkill( SkillName.Tactics, 86.9, 103.6 );
|
||||
SetSkill( SkillName.Wrestling, 85.6, 104.5 );
|
||||
|
||||
Fame = 5000;
|
||||
Karma = -5000;
|
||||
|
||||
VirtualArmor = 28; // Don't know what it should be
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.Rich ); // Need to verify
|
||||
}
|
||||
|
||||
// Using Tormented Minotaur sounds - Need to veryfy
|
||||
public override int GetAngerSound()
|
||||
{
|
||||
return 0x597;
|
||||
}
|
||||
|
||||
public override int GetIdleSound()
|
||||
{
|
||||
return 0x596;
|
||||
}
|
||||
|
||||
public override int GetAttackSound()
|
||||
{
|
||||
return 0x599;
|
||||
}
|
||||
|
||||
public override int GetHurtSound()
|
||||
{
|
||||
return 0x59a;
|
||||
}
|
||||
|
||||
public override int GetDeathSound()
|
||||
{
|
||||
return 0x59c;
|
||||
}
|
||||
|
||||
public MinotaurScout( 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,82 @@
|
|||
using System;
|
||||
using System.Collections;
|
||||
using Server.Items;
|
||||
using Server.Targeting;
|
||||
using Server.Misc;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName("a pestilent bandage corpse")]
|
||||
public class PestilentBandage : BaseCreature
|
||||
{
|
||||
// Neither Stratics nor UOGuide have much description
|
||||
// beyond being a "Grey Mummy". BodyValue, Sound and
|
||||
// Hue are all guessed until they can be verified.
|
||||
// Loot and Fame/Karma are also guesses at this point.
|
||||
//
|
||||
// They also apparently have a Poison Attack, which I've stolen from Yamandons.
|
||||
[Constructable]
|
||||
public PestilentBandage() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 ) // NEED TO CHECK
|
||||
{
|
||||
Name = "a pestilent bandage";
|
||||
Body = 154;
|
||||
Hue = 0x515;
|
||||
BaseSoundID = 471;
|
||||
|
||||
SetStr( 691, 740 );
|
||||
SetDex( 141, 180 );
|
||||
SetInt( 51, 80 );
|
||||
|
||||
SetHits( 415, 445 );
|
||||
|
||||
SetDamage( 13, 23 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 40 );
|
||||
SetDamageType( ResistanceType.Cold, 20 );
|
||||
SetDamageType( ResistanceType.Poison, 40 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 45, 55 );
|
||||
SetResistance( ResistanceType.Fire, 10, 20 );
|
||||
SetResistance( ResistanceType.Cold, 50, 60 );
|
||||
SetResistance( ResistanceType.Poison, 20, 30 );
|
||||
SetResistance( ResistanceType.Energy, 20, 30 );
|
||||
|
||||
SetSkill( SkillName.Poisoning, 0.0, 10.0 );
|
||||
SetSkill( SkillName.Anatomy, 0 );
|
||||
SetSkill( SkillName.MagicResist, 75.0, 80.0 );
|
||||
SetSkill( SkillName.Tactics, 80.0, 85.0 );
|
||||
SetSkill( SkillName.Wrestling, 70.0, 75.0 );
|
||||
|
||||
Fame = 20000;
|
||||
Karma = -20000;
|
||||
|
||||
// VirtualArmor = 28; // Don't know what it should be
|
||||
|
||||
PackItem( new Bandage( 5 ) ); // How many?
|
||||
|
||||
}
|
||||
|
||||
public override Poison HitPoison{ get{ return Poison.Lethal; } }
|
||||
public override bool CanHeal { get { return true; } }
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.Rich ); // Need to verify
|
||||
}
|
||||
|
||||
public PestilentBandage( 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,78 @@
|
|||
using System;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a tormented minotaur corpse" )]
|
||||
public class TormentedMinotaur : BaseCreature
|
||||
{
|
||||
public override WeaponAbility GetWeaponAbility()
|
||||
{
|
||||
return WeaponAbility.Dismount;
|
||||
}
|
||||
|
||||
[Constructable]
|
||||
public TormentedMinotaur() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
Name = "Tormented Minotaur";
|
||||
Body = 262;
|
||||
|
||||
SetStr( 822, 930 );
|
||||
SetDex( 401, 415 );
|
||||
SetInt( 128, 138 );
|
||||
|
||||
SetHits( 4000, 4200 );
|
||||
|
||||
SetDamage( 16, 30 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 100 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 62 );
|
||||
SetResistance( ResistanceType.Fire, 74 );
|
||||
SetResistance( ResistanceType.Cold, 54 );
|
||||
SetResistance( ResistanceType.Poison, 56 );
|
||||
SetResistance( ResistanceType.Energy, 54 );
|
||||
|
||||
SetSkill( SkillName.Wrestling, 110.1, 111.0 );
|
||||
SetSkill( SkillName.Tactics, 100.7, 102.8 );
|
||||
SetSkill( SkillName.MagicResist, 104.3, 116.3 );
|
||||
|
||||
|
||||
Fame = 20000;
|
||||
Karma = -20000;
|
||||
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot(LootPack.FilthyRich, 10);
|
||||
}
|
||||
|
||||
public override Poison PoisonImmune{ get{ return Poison.Deadly; } }
|
||||
public override int TreasureMapLevel{ get{ return 3; } }
|
||||
|
||||
public override int GetDeathSound() { return 0x596; }
|
||||
public override int GetAttackSound() { return 0x597; }
|
||||
public override int GetIdleSound() { return 0x598; }
|
||||
public override int GetAngerSound() { return 0x599; }
|
||||
public override int GetHurtSound() { return 0x59A; }
|
||||
|
||||
public TormentedMinotaur( Serial serial ) : base( serial )
|
||||
{
|
||||
}
|
||||
|
||||
public override void Serialize( GenericWriter writer )
|
||||
{
|
||||
base.Serialize( writer );
|
||||
|
||||
writer.Write( (int) 0 ); // version
|
||||
}
|
||||
|
||||
public override void Deserialize( GenericReader reader )
|
||||
{
|
||||
base.Deserialize( reader );
|
||||
|
||||
int version = reader.ReadInt();
|
||||
}
|
||||
}
|
||||
}
|
||||
81
Scripts/Mobiles/Monsters/ML/Humanoid/Melee/Troglodyte.cs
Normal file
81
Scripts/Mobiles/Monsters/ML/Humanoid/Melee/Troglodyte.cs
Normal file
|
|
@ -0,0 +1,81 @@
|
|||
using System;
|
||||
using System.Collections;
|
||||
using Server.Items;
|
||||
using Server.Targeting;
|
||||
using Server.Misc;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a troglodyte corpse" )]
|
||||
public class Troglodyte : BaseCreature
|
||||
{
|
||||
[Constructable]
|
||||
public Troglodyte() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 ) // NEED TO CHECK
|
||||
{
|
||||
Name = "a troglodyte";
|
||||
Body = 267;
|
||||
BaseSoundID = 0x59F;
|
||||
|
||||
SetStr( 148, 217 );
|
||||
SetDex( 91, 120 );
|
||||
SetInt( 51, 70 );
|
||||
|
||||
SetHits( 302, 340 );
|
||||
|
||||
SetDamage( 11, 14 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 100 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 30, 35 );
|
||||
SetResistance( ResistanceType.Fire, 20, 30 );
|
||||
SetResistance( ResistanceType.Cold, 35, 40 );
|
||||
SetResistance( ResistanceType.Poison, 30, 40 );
|
||||
SetResistance( ResistanceType.Energy, 30, 40 );
|
||||
|
||||
SetSkill( SkillName.Anatomy, 70.5, 94.8 );
|
||||
SetSkill( SkillName.MagicResist, 51.8, 65.0 );
|
||||
SetSkill( SkillName.Tactics, 80.4, 94.7 );
|
||||
SetSkill( SkillName.Wrestling, 70.2, 93.5 );
|
||||
SetSkill( SkillName.Healing, 70.0, 95.0 );
|
||||
|
||||
Fame = 5000;
|
||||
Karma = -5000;
|
||||
|
||||
VirtualArmor = 28; // Don't know what it should be
|
||||
|
||||
PackItem( new Bandage( 5 ) ); // How many?
|
||||
PackItem( new Ribs() );
|
||||
}
|
||||
|
||||
public override bool CanHeal { get { return true; } }
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.Rich ); // Need to verify
|
||||
}
|
||||
|
||||
public override void OnDeath( Container c )
|
||||
{
|
||||
base.OnDeath( c );
|
||||
|
||||
if ( Utility.RandomDouble() < 0.1 )
|
||||
c.DropItem( new PrimitiveFetish() );
|
||||
}
|
||||
|
||||
public Troglodyte( 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
114
Scripts/Mobiles/Monsters/ML/Labyrinth/Miasma.cs
Normal file
114
Scripts/Mobiles/Monsters/ML/Labyrinth/Miasma.cs
Normal file
|
|
@ -0,0 +1,114 @@
|
|||
using System;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a Miasma corpse" )]
|
||||
public class Miasma : Scorpion
|
||||
{
|
||||
[Constructable]
|
||||
public Miasma()
|
||||
{
|
||||
IsParagon = true;
|
||||
|
||||
Name = "Miasma";
|
||||
Hue = 0x8FD;
|
||||
|
||||
SetStr( 255, 847 );
|
||||
SetDex( 145, 428 );
|
||||
SetInt( 26, 380 );
|
||||
|
||||
SetHits( 750, 2000 );
|
||||
SetMana( 5, 60 );
|
||||
|
||||
SetDamage( 20, 30 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 60 );
|
||||
SetDamageType( ResistanceType.Poison, 40 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 50, 54 );
|
||||
SetResistance( ResistanceType.Fire, 40, 45 );
|
||||
SetResistance( ResistanceType.Cold, 50, 55 );
|
||||
SetResistance( ResistanceType.Poison, 70, 80 );
|
||||
SetResistance( ResistanceType.Energy, 40, 45 );
|
||||
|
||||
SetSkill( SkillName.Wrestling, 84.9, 103.3 );
|
||||
SetSkill( SkillName.Tactics, 98.4, 110.6 );
|
||||
SetSkill( SkillName.Anatomy, 0 );
|
||||
SetSkill( SkillName.MagicResist, 74.4, 77.7 );
|
||||
SetSkill( SkillName.Poisoning, 128.5, 143.6 );
|
||||
|
||||
Fame = 21000;
|
||||
Karma = -21000;
|
||||
}
|
||||
|
||||
/* yes, this is OSI style */
|
||||
public override double WeaponAbilityChance { get { return 0.75; } }
|
||||
public override double HitPoisonChance { get { return 0.35; } }
|
||||
public override Poison HitPoison { get { return ( Poison.Lethal ); } }
|
||||
public override bool HasManaOveride { get { return true; } }
|
||||
public override bool GivesMLMinorArtifact { get { return true; } }
|
||||
public override int TreasureMapLevel { get { return 5; } }
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.UltraRich, 4 );
|
||||
}
|
||||
|
||||
public override WeaponAbility GetWeaponAbility()
|
||||
{
|
||||
return WeaponAbility.MortalStrike;
|
||||
}
|
||||
|
||||
/*
|
||||
// TODO: uncomment once added
|
||||
public override void OnDeath( Container c )
|
||||
{
|
||||
base.OnDeath( c );
|
||||
|
||||
if ( Utility.RandomDouble() < 0.025 )
|
||||
{
|
||||
switch ( Utility.Random( 16 ) )
|
||||
{
|
||||
case 0: c.DropItem( new MyrmidonGloves() ); break;
|
||||
case 1: c.DropItem( new MyrmidonGorget() ); break;
|
||||
case 2: c.DropItem( new MyrmidonLegs() ); break;
|
||||
case 3: c.DropItem( new MyrmidonArms() ); break;
|
||||
case 4: c.DropItem( new PaladinArms() ); break;
|
||||
case 5: c.DropItem( new PaladinGorget() ); break;
|
||||
case 6: c.DropItem( new LeafweaveLegs() ); break;
|
||||
case 7: c.DropItem( new DeathChest() ); break;
|
||||
case 8: c.DropItem( new DeathGloves() ); break;
|
||||
case 9: c.DropItem( new DeathLegs() ); break;
|
||||
case 10: c.DropItem( new GreymistGloves() ); break;
|
||||
case 11: c.DropItem( new GreymistArms() ); break;
|
||||
case 12: c.DropItem( new AssassinChest() ); break;
|
||||
case 13: c.DropItem( new AssassinArms() ); break;
|
||||
case 14: c.DropItem( new HunterGloves() ); break;
|
||||
case 15: c.DropItem( new HunterLegs() ); break;
|
||||
}
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
public Miasma( Serial serial )
|
||||
: base( serial )
|
||||
{
|
||||
}
|
||||
|
||||
public override void Serialize( GenericWriter writer )
|
||||
{
|
||||
base.Serialize( writer );
|
||||
|
||||
writer.Write( (int) 0 ); // version
|
||||
}
|
||||
|
||||
public override void Deserialize( GenericReader reader )
|
||||
{
|
||||
base.Deserialize( reader );
|
||||
|
||||
int version = reader.ReadInt();
|
||||
}
|
||||
}
|
||||
}
|
||||
87
Scripts/Mobiles/Monsters/ML/Labyrinth/Pyre.cs
Normal file
87
Scripts/Mobiles/Monsters/ML/Labyrinth/Pyre.cs
Normal file
|
|
@ -0,0 +1,87 @@
|
|||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
using Server.Spells;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a Pyre corpse" )]
|
||||
public class Pyre : Phoenix
|
||||
{
|
||||
[Constructable]
|
||||
public Pyre()
|
||||
{
|
||||
IsParagon = true;
|
||||
|
||||
Name = "Pyre";
|
||||
Hue = 0x489;
|
||||
|
||||
FightMode = FightMode.Closest;
|
||||
|
||||
SetStr( 605, 611 );
|
||||
SetDex( 391, 519 );
|
||||
SetInt( 669, 818 );
|
||||
|
||||
SetHits( 1783, 1939 );
|
||||
|
||||
SetDamage( 30 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 50 );
|
||||
SetDamageType( ResistanceType.Fire, 50 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 65 );
|
||||
SetResistance( ResistanceType.Fire, 72, 75 );
|
||||
SetResistance( ResistanceType.Poison, 36, 41 );
|
||||
SetResistance( ResistanceType.Energy, 50, 51 );
|
||||
|
||||
SetSkill( SkillName.Wrestling, 121.9, 130.6 );
|
||||
SetSkill( SkillName.Tactics, 114.4, 117.4 );
|
||||
SetSkill( SkillName.MagicResist, 147.7, 153.0 );
|
||||
SetSkill( SkillName.Poisoning, 122.8, 124.0 );
|
||||
SetSkill( SkillName.Magery, 121.8, 127.8 );
|
||||
SetSkill( SkillName.EvalInt, 103.6, 117.0 );
|
||||
SetSkill( SkillName.Meditation, 100.0, 110.0 );
|
||||
|
||||
Fame = 21000;
|
||||
Karma = -21000;
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.UltraRich, 3 );
|
||||
}
|
||||
|
||||
public override WeaponAbility GetWeaponAbility()
|
||||
{
|
||||
if ( Utility.RandomBool() )
|
||||
return WeaponAbility.ParalyzingBlow;
|
||||
else
|
||||
return WeaponAbility.BleedAttack;
|
||||
}
|
||||
|
||||
public override bool GivesMLMinorArtifact{ get{ return true; } }
|
||||
public override int TreasureMapLevel{ get{ return 5; } }
|
||||
public override bool HasAura{ get{ return true; } }
|
||||
|
||||
public Pyre( Serial serial )
|
||||
: base( serial )
|
||||
{
|
||||
}
|
||||
|
||||
public override void Serialize( GenericWriter writer )
|
||||
{
|
||||
base.Serialize( writer );
|
||||
|
||||
writer.Write( (int) 0 ); // version
|
||||
}
|
||||
|
||||
public override void Deserialize( GenericReader reader )
|
||||
{
|
||||
base.Deserialize( reader );
|
||||
|
||||
int version = reader.ReadInt();
|
||||
}
|
||||
}
|
||||
}
|
||||
79
Scripts/Mobiles/Monsters/ML/Labyrinth/Rend.cs
Normal file
79
Scripts/Mobiles/Monsters/ML/Labyrinth/Rend.cs
Normal file
|
|
@ -0,0 +1,79 @@
|
|||
using System;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a Rend corpse" )]
|
||||
public class Rend : Reptalon
|
||||
{
|
||||
[Constructable]
|
||||
public Rend()
|
||||
{
|
||||
IsParagon = true;
|
||||
|
||||
Name = "Rend";
|
||||
Hue = 0x455;
|
||||
|
||||
SetStr( 1261, 1284 );
|
||||
SetDex( 363, 384 );
|
||||
SetInt( 601, 642 );
|
||||
|
||||
SetHits( 5176, 6100 );
|
||||
|
||||
SetDamage( 26, 33 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 100 );
|
||||
SetDamageType( ResistanceType.Poison, 0 );
|
||||
SetDamageType( ResistanceType.Energy, 0 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 75, 85 );
|
||||
SetResistance( ResistanceType.Fire, 81, 94 );
|
||||
SetResistance( ResistanceType.Cold, 46, 55 );
|
||||
SetResistance( ResistanceType.Poison, 35, 44 );
|
||||
SetResistance( ResistanceType.Energy, 45, 52 );
|
||||
|
||||
SetSkill( SkillName.Wrestling, 136.3, 150.3 );
|
||||
SetSkill( SkillName.Tactics, 133.4, 141.4 );
|
||||
SetSkill( SkillName.MagicResist, 90.9, 110.0 );
|
||||
SetSkill( SkillName.Anatomy, 66.6, 72.0 );
|
||||
|
||||
Fame = 21000;
|
||||
Karma = -21000;
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.UltraRich, 3 );
|
||||
}
|
||||
|
||||
public override WeaponAbility GetWeaponAbility()
|
||||
{
|
||||
if ( Utility.RandomBool() )
|
||||
return WeaponAbility.ParalyzingBlow;
|
||||
else
|
||||
return WeaponAbility.BleedAttack;
|
||||
}
|
||||
|
||||
public override bool GivesMLMinorArtifact{ get{ return true; } }
|
||||
|
||||
public Rend( Serial serial )
|
||||
: base( serial )
|
||||
{
|
||||
}
|
||||
|
||||
public override void Serialize( GenericWriter writer )
|
||||
{
|
||||
base.Serialize( writer );
|
||||
|
||||
writer.Write( (int) 0 ); // version
|
||||
}
|
||||
|
||||
public override void Deserialize( GenericReader reader )
|
||||
{
|
||||
base.Deserialize( reader );
|
||||
|
||||
int version = reader.ReadInt();
|
||||
}
|
||||
}
|
||||
}
|
||||
104
Scripts/Mobiles/Monsters/ML/Misc/Magic/GreaterDragon.cs
Normal file
104
Scripts/Mobiles/Monsters/ML/Misc/Magic/GreaterDragon.cs
Normal file
|
|
@ -0,0 +1,104 @@
|
|||
using System;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a dragon corpse" )]
|
||||
public class GreaterDragon : BaseCreature
|
||||
{
|
||||
public override bool StatLossAfterTame { get { return true; } }
|
||||
|
||||
[Constructable]
|
||||
public GreaterDragon () : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.3, 0.5 )
|
||||
{
|
||||
Name = "a greater dragon";
|
||||
Body = Utility.RandomList( 12, 59 );
|
||||
BaseSoundID = 362;
|
||||
|
||||
SetStr( 1025, 1425 );
|
||||
SetDex( 81, 148 );
|
||||
SetInt( 475, 675 );
|
||||
|
||||
SetHits( 1000, 2000 );
|
||||
SetStam( 120, 135 );
|
||||
|
||||
SetDamage( 24, 33 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 100 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 60, 85 );
|
||||
SetResistance( ResistanceType.Fire, 65, 90 );
|
||||
SetResistance( ResistanceType.Cold, 40, 55 );
|
||||
SetResistance( ResistanceType.Poison, 40, 60 );
|
||||
SetResistance( ResistanceType.Energy, 50, 75 );
|
||||
|
||||
SetSkill( SkillName.Meditation, 0 );
|
||||
SetSkill( SkillName.EvalInt, 110.0, 140.0 );
|
||||
SetSkill( SkillName.Magery, 110.0, 140.0 );
|
||||
SetSkill( SkillName.Poisoning, 0 );
|
||||
SetSkill( SkillName.Anatomy, 0 );
|
||||
SetSkill( SkillName.MagicResist, 110.0, 140.0 );
|
||||
SetSkill( SkillName.Tactics, 110.0, 140.0 );
|
||||
SetSkill( SkillName.Wrestling, 115.0, 145.0 );
|
||||
|
||||
Fame = 22000;
|
||||
Karma = -15000;
|
||||
|
||||
VirtualArmor = 60;
|
||||
|
||||
Tamable = true;
|
||||
ControlSlots = 5;
|
||||
MinTameSkill = 104.7;
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.FilthyRich, 4 );
|
||||
AddLoot( LootPack.Gems, 8 );
|
||||
}
|
||||
|
||||
public override bool ReacquireOnMovement{ get{ return !Controlled; } }
|
||||
public override bool HasBreath{ get{ return true; } } // fire breath enabled
|
||||
public override bool AutoDispel{ get{ return !Controlled; } }
|
||||
public override int TreasureMapLevel{ get{ return 5; } }
|
||||
public override int Meat{ get{ return 19; } }
|
||||
public override int Hides{ get{ return 30; } }
|
||||
public override HideType HideType{ get{ return HideType.Barbed; } }
|
||||
public override int Scales{ get{ return 7; } }
|
||||
public override ScaleType ScaleType{ get{ return ( Body == 12 ? ScaleType.Yellow : ScaleType.Red ); } }
|
||||
public override FoodType FavoriteFood{ get{ return FoodType.Meat; } }
|
||||
public override bool CanAngerOnTame { get { return true; } }
|
||||
public override bool CanFly { get { return true; } }
|
||||
|
||||
public override WeaponAbility GetWeaponAbility()
|
||||
{
|
||||
return WeaponAbility.BleedAttack;
|
||||
}
|
||||
|
||||
public GreaterDragon( Serial serial ) : base( serial )
|
||||
{
|
||||
}
|
||||
|
||||
public override void Serialize( GenericWriter writer )
|
||||
{
|
||||
base.Serialize( writer );
|
||||
writer.Write( (int) 1 );
|
||||
}
|
||||
|
||||
public override void Deserialize( GenericReader reader )
|
||||
{
|
||||
base.Deserialize( reader );
|
||||
int version = reader.ReadInt();
|
||||
|
||||
SetDamage( 24, 33 );
|
||||
|
||||
if( version == 0 )
|
||||
{
|
||||
Server.SkillHandlers.AnimalTaming.ScaleStats( this, 0.50 );
|
||||
Server.SkillHandlers.AnimalTaming.ScaleSkills( this, 0.80, 0.90 ); // 90% * 80% = 72% of original skills trainable to 90%
|
||||
Skills[SkillName.Magery].Base = Skills[SkillName.Magery].Cap; // Greater dragons have a 90% cap reduction and 90% skill reduction on magery
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
77
Scripts/Mobiles/Monsters/ML/Misc/Melee/CorrosiveSlime.cs
Normal file
77
Scripts/Mobiles/Monsters/ML/Misc/Melee/CorrosiveSlime.cs
Normal file
|
|
@ -0,0 +1,77 @@
|
|||
using System;
|
||||
using System.Collections;
|
||||
using Server.Items;
|
||||
using Server.Targeting;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a slimey corpse" )]
|
||||
public class CorrosiveSlime : BaseCreature
|
||||
{
|
||||
[Constructable]
|
||||
public CorrosiveSlime() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
Name = "a corrosive slime";
|
||||
Body = 51;
|
||||
BaseSoundID = 456;
|
||||
|
||||
Hue = Utility.RandomSlimeHue();
|
||||
|
||||
SetStr( 22, 34 );
|
||||
SetDex( 16, 21 );
|
||||
SetInt( 16, 20 );
|
||||
|
||||
SetHits( 15, 19 );
|
||||
|
||||
SetDamage( 1, 5 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 100 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 5, 10 );
|
||||
SetResistance( ResistanceType.Poison, 15, 20 );
|
||||
|
||||
SetSkill( SkillName.Poisoning, 36.0, 49.1 );
|
||||
SetSkill(SkillName.Anatomy, 0);
|
||||
SetSkill( SkillName.MagicResist, 15.9, 18.9 );
|
||||
SetSkill( SkillName.Tactics, 24.6, 26.1 );
|
||||
SetSkill( SkillName.Wrestling, 24.9, 26.1 );
|
||||
|
||||
Fame = 300;
|
||||
Karma = -300;
|
||||
|
||||
VirtualArmor = 8;
|
||||
|
||||
Tamable = true;
|
||||
ControlSlots = 1;
|
||||
MinTameSkill = 23.1;
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.Poor );
|
||||
AddLoot( LootPack.Gems );
|
||||
}
|
||||
|
||||
public override Poison PoisonImmune { get { return Poison.Regular; } }
|
||||
public override Poison HitPoison { get { return Poison.Regular; } }
|
||||
public override FoodType FavoriteFood{ get{ return FoodType.Fish; } }
|
||||
|
||||
//TODO: Damage weapon via acid
|
||||
|
||||
public CorrosiveSlime( 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
80
Scripts/Mobiles/Monsters/ML/Misc/Melee/Reptalon.cs
Normal file
80
Scripts/Mobiles/Monsters/ML/Misc/Melee/Reptalon.cs
Normal file
|
|
@ -0,0 +1,80 @@
|
|||
using System;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a reptalon corpse" )]
|
||||
public class Reptalon : BaseMount
|
||||
{
|
||||
[Constructable]
|
||||
public Reptalon() : base( "a reptalon", 0x114, 0x3E90, AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.35 )
|
||||
{
|
||||
BaseSoundID = 0x16A;
|
||||
|
||||
SetStr( 1001, 1025 );
|
||||
SetDex( 152, 164 );
|
||||
SetInt( 251, 289 );
|
||||
|
||||
SetHits( 833, 931 );
|
||||
|
||||
SetDamage( 21, 28 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 0 );
|
||||
SetDamageType( ResistanceType.Poison, 25 );
|
||||
SetDamageType( ResistanceType.Energy, 75 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 53, 64 );
|
||||
SetResistance( ResistanceType.Fire, 35, 45 );
|
||||
SetResistance( ResistanceType.Cold, 36, 45 );
|
||||
SetResistance( ResistanceType.Poison, 52, 63 );
|
||||
SetResistance( ResistanceType.Energy, 71, 83 );
|
||||
|
||||
SetSkill( SkillName.Wrestling, 101.5, 118.2 );
|
||||
SetSkill( SkillName.Tactics, 101.7, 108.2 );
|
||||
SetSkill( SkillName.MagicResist, 76.4, 89.9 );
|
||||
SetSkill( SkillName.Anatomy, 56.4, 59.7 );
|
||||
|
||||
Tamable = true;
|
||||
ControlSlots = 4;
|
||||
MinTameSkill = 101.1;
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.AosUltraRich, 3 );
|
||||
}
|
||||
|
||||
public override WeaponAbility GetWeaponAbility()
|
||||
{
|
||||
return WeaponAbility.ParalyzingBlow;
|
||||
}
|
||||
|
||||
public override int TreasureMapLevel{ get{ return 5; } }
|
||||
public override int Meat{ get{ return 5; } }
|
||||
public override int Hides{ get{ return 10; } }
|
||||
public override bool CanBreath{ get{ return true; } }
|
||||
public override bool CanAngerOnTame{ get { return true; } }
|
||||
public override bool StatLossAfterTame{ get{ return true; } }
|
||||
public override FoodType FavoriteFood{ get{ return FoodType.Meat; } }
|
||||
public override bool CanFly { get { return true; } }
|
||||
|
||||
public Reptalon( Serial serial ) : base( serial )
|
||||
{
|
||||
}
|
||||
|
||||
public override void Serialize( GenericWriter writer )
|
||||
{
|
||||
base.Serialize( writer );
|
||||
|
||||
writer.Write( (int) 0 ); // version
|
||||
}
|
||||
|
||||
public override void Deserialize( GenericReader reader )
|
||||
{
|
||||
base.Deserialize( reader );
|
||||
|
||||
int version = reader.ReadInt();
|
||||
}
|
||||
}
|
||||
}
|
||||
81
Scripts/Mobiles/Monsters/ML/Painted Caves/Grobu.cs
Normal file
81
Scripts/Mobiles/Monsters/ML/Painted Caves/Grobu.cs
Normal file
|
|
@ -0,0 +1,81 @@
|
|||
using System;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a Grobu corpse" )]
|
||||
public class Grobu : BlackBear
|
||||
{
|
||||
[Constructable]
|
||||
public Grobu()
|
||||
{
|
||||
IsParagon = true;
|
||||
|
||||
Name = "Grobu";
|
||||
Hue = 0x455;
|
||||
|
||||
AI = AIType.AI_Melee;
|
||||
FightMode = FightMode.Closest;
|
||||
|
||||
SetStr( 192, 210 );
|
||||
SetDex( 132, 150 );
|
||||
SetInt( 50, 52 );
|
||||
|
||||
SetHits( 1235, 1299 );
|
||||
SetStam( 132, 150 );
|
||||
SetMana( 9 );
|
||||
|
||||
SetDamage( 15, 18 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 100 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 40, 45 );
|
||||
SetResistance( ResistanceType.Fire, 20, 40 );
|
||||
SetResistance( ResistanceType.Cold, 32, 35 );
|
||||
SetResistance( ResistanceType.Poison, 25, 30 );
|
||||
SetResistance( ResistanceType.Energy, 22, 34 );
|
||||
|
||||
SetSkill( SkillName.Wrestling, 96.4, 119.0 );
|
||||
SetSkill( SkillName.Tactics, 96.2, 116.5 );
|
||||
SetSkill( SkillName.MagicResist, 66.2, 83.7 );
|
||||
|
||||
Fame = 1000;
|
||||
Karma = 1000;
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.FilthyRich, 2 );
|
||||
}
|
||||
|
||||
|
||||
public override void OnDeath( Container c )
|
||||
{
|
||||
base.OnDeath( c );
|
||||
|
||||
c.DropItem( new GrobusFur() );
|
||||
}
|
||||
|
||||
public override bool GivesMLMinorArtifact{ get{ return true; } }
|
||||
|
||||
public Grobu( Serial serial )
|
||||
: base( serial )
|
||||
{
|
||||
}
|
||||
|
||||
public override void Serialize( GenericWriter writer )
|
||||
{
|
||||
base.Serialize( writer );
|
||||
|
||||
writer.Write( (int) 0 ); // version
|
||||
}
|
||||
|
||||
public override void Deserialize( GenericReader reader )
|
||||
{
|
||||
base.Deserialize( reader );
|
||||
|
||||
int version = reader.ReadInt();
|
||||
}
|
||||
}
|
||||
}
|
||||
78
Scripts/Mobiles/Monsters/ML/Painted Caves/Lurg.cs
Normal file
78
Scripts/Mobiles/Monsters/ML/Painted Caves/Lurg.cs
Normal file
|
|
@ -0,0 +1,78 @@
|
|||
using System;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a Lurg corpse" )]
|
||||
public class Lurg : Troglodyte
|
||||
{
|
||||
[Constructable]
|
||||
public Lurg()
|
||||
{
|
||||
IsParagon = true;
|
||||
|
||||
Name = "Lurg";
|
||||
Hue = 0x455;
|
||||
|
||||
SetStr( 584, 625 );
|
||||
SetDex( 163, 176 );
|
||||
SetInt( 90, 106 );
|
||||
|
||||
SetHits( 3034, 3189 );
|
||||
SetStam( 163, 176 );
|
||||
SetMana( 90, 106 );
|
||||
|
||||
SetDamage( 16, 19 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 100 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 50, 53 );
|
||||
SetResistance( ResistanceType.Fire, 45, 47 );
|
||||
SetResistance( ResistanceType.Cold, 56, 60 );
|
||||
SetResistance( ResistanceType.Poison, 50, 60 );
|
||||
SetResistance( ResistanceType.Energy, 41, 56 );
|
||||
|
||||
SetSkill( SkillName.Wrestling, 122.7, 130.5 );
|
||||
SetSkill( SkillName.Tactics, 109.3, 118.5 );
|
||||
SetSkill( SkillName.MagicResist, 72.9, 87.6 );
|
||||
SetSkill( SkillName.Anatomy, 110.5, 124.0 );
|
||||
SetSkill( SkillName.Healing, 84.1, 105.0 );
|
||||
|
||||
Fame = 10000;
|
||||
Karma = -10000;
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.UltraRich, 2 );
|
||||
}
|
||||
|
||||
public override WeaponAbility GetWeaponAbility()
|
||||
{
|
||||
return WeaponAbility.CrushingBlow;
|
||||
}
|
||||
|
||||
public override bool GivesMLMinorArtifact{ get{ return true; } }
|
||||
public override int TreasureMapLevel{ get{ return 4; } }
|
||||
|
||||
public Lurg( Serial serial )
|
||||
: base( serial )
|
||||
{
|
||||
}
|
||||
|
||||
public override void Serialize( GenericWriter writer )
|
||||
{
|
||||
base.Serialize( writer );
|
||||
|
||||
writer.Write( (int) 0 ); // version
|
||||
}
|
||||
|
||||
public override void Deserialize( GenericReader reader )
|
||||
{
|
||||
base.Deserialize( reader );
|
||||
|
||||
int version = reader.ReadInt();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,94 @@
|
|||
using System;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a Putrefier corpse" )]
|
||||
public class Putrefier : Balron
|
||||
{
|
||||
[Constructable]
|
||||
public Putrefier()
|
||||
{
|
||||
IsParagon = true;
|
||||
|
||||
Name = "Putrefier";
|
||||
Hue = 63;
|
||||
|
||||
SetStr( 1057, 1400 );
|
||||
SetDex( 232, 560 );
|
||||
SetInt( 201, 440 );
|
||||
|
||||
SetHits( 3010, 4092 );
|
||||
|
||||
SetDamage( 27, 34 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 50 );
|
||||
SetDamageType( ResistanceType.Fire, 0 );
|
||||
SetDamageType( ResistanceType.Poison, 50 );
|
||||
SetDamageType( ResistanceType.Energy, 0 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 65, 80 );
|
||||
SetResistance( ResistanceType.Fire, 65, 80 );
|
||||
SetResistance( ResistanceType.Cold, 50, 60 );
|
||||
SetResistance( ResistanceType.Poison, 100 );
|
||||
SetResistance( ResistanceType.Energy, 40, 50 );
|
||||
|
||||
SetSkill( SkillName.Wrestling, 111.2, 128.0 );
|
||||
SetSkill( SkillName.Tactics, 115.2, 125.2 );
|
||||
SetSkill( SkillName.MagicResist, 143.4, 170.0 );
|
||||
SetSkill( SkillName.Anatomy, 44.6, 67.0 );
|
||||
SetSkill( SkillName.Magery, 117.6, 118.8 );
|
||||
SetSkill( SkillName.EvalInt, 113.0, 128.8 );
|
||||
SetSkill( SkillName.Meditation, 41.4, 85.0 );
|
||||
SetSkill( SkillName.Poisoning, 45.0, 50.0 );
|
||||
|
||||
Fame = 24000;
|
||||
Karma = -24000;
|
||||
|
||||
PackScroll( 4, 7 );
|
||||
PackScroll( 4, 7 );
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.UltraRich, 3 );
|
||||
}
|
||||
|
||||
/*
|
||||
// TODO: uncomment once added
|
||||
public override void OnDeath( Container c )
|
||||
{
|
||||
base.OnDeath( c );
|
||||
|
||||
c.DropItem( new SpleenOfThePutrefier() );
|
||||
|
||||
if ( Utility.RandomDouble() < 0.6 )
|
||||
c.DropItem( new ParrotItem() );
|
||||
}
|
||||
*/
|
||||
|
||||
public override bool GivesMLMinorArtifact{ get{ return true; } }
|
||||
public override Poison HitPoison{ get{ return Poison.Deadly; } } // Becomes Lethal with Paragon bonus
|
||||
public override int TreasureMapLevel{ get{ return 5; } }
|
||||
|
||||
public Putrefier( Serial serial )
|
||||
: base( serial )
|
||||
{
|
||||
}
|
||||
|
||||
public override void Serialize( GenericWriter writer )
|
||||
{
|
||||
base.Serialize( writer );
|
||||
|
||||
writer.Write( (int) 0 ); // version
|
||||
}
|
||||
|
||||
public override void Deserialize( GenericReader reader )
|
||||
{
|
||||
base.Deserialize( reader );
|
||||
|
||||
int version = reader.ReadInt();
|
||||
}
|
||||
}
|
||||
}
|
||||
83
Scripts/Mobiles/Monsters/ML/Prism of Light/CorporealBrume.cs
Normal file
83
Scripts/Mobiles/Monsters/ML/Prism of Light/CorporealBrume.cs
Normal file
|
|
@ -0,0 +1,83 @@
|
|||
using System;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a corporeal brume corpse" )]
|
||||
public class CorporealBrume : BaseCreature
|
||||
{
|
||||
[Constructable]
|
||||
public CorporealBrume()
|
||||
: base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
Name = "a corporeal brume";
|
||||
Body = 0x104; // TODO: Verify
|
||||
BaseSoundID = 0x56B;
|
||||
|
||||
SetStr( 400, 450 );
|
||||
SetDex( 100, 150 );
|
||||
SetInt( 50, 60 );
|
||||
|
||||
SetHits( 1150, 1250 );
|
||||
|
||||
SetDamage( 21, 25 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 100 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 100 );
|
||||
SetResistance( ResistanceType.Fire, 40, 50 );
|
||||
SetResistance( ResistanceType.Cold, 40, 50 );
|
||||
SetResistance( ResistanceType.Poison, 50, 60 );
|
||||
SetResistance( ResistanceType.Energy, 30, 40 );
|
||||
|
||||
SetSkill( SkillName.Wrestling, 110.0, 115.0 );
|
||||
SetSkill( SkillName.Tactics, 110.0, 115.0 );
|
||||
SetSkill( SkillName.MagicResist, 80.0, 95.0 );
|
||||
SetSkill( SkillName.Anatomy, 100.0, 110.0 );
|
||||
|
||||
Fame = 12000;
|
||||
Karma = -12000;
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.FilthyRich );
|
||||
AddLoot( LootPack.Rich );
|
||||
}
|
||||
|
||||
// TODO: Verify area attack specifics
|
||||
public override bool HasAura { get { return ( Combatant != null ); } }
|
||||
public override TimeSpan AuraInterval { get { return TimeSpan.FromSeconds( 20 ); } }
|
||||
public override int AuraRange { get { return 10; } }
|
||||
|
||||
public override int AuraBaseDamage { get { return Utility.RandomMinMax( 25, 35 ); } }
|
||||
public override int AuraFireDamage { get { return 0; } }
|
||||
public override int AuraColdDamage { get { return 100; } }
|
||||
|
||||
public override void AuraEffect( Mobile m )
|
||||
{
|
||||
m.FixedParticles( 0x374A, 10, 15, 5038, 1181, 2, EffectLayer.Head );
|
||||
m.PlaySound( 0x213 );
|
||||
}
|
||||
|
||||
public CorporealBrume( Serial serial )
|
||||
: base( serial )
|
||||
{
|
||||
}
|
||||
|
||||
public override void Serialize( GenericWriter writer )
|
||||
{
|
||||
base.Serialize( writer );
|
||||
|
||||
writer.Write( (int) 0 ); // version
|
||||
}
|
||||
|
||||
public override void Deserialize( GenericReader reader )
|
||||
{
|
||||
base.Deserialize( reader );
|
||||
|
||||
int version = reader.ReadInt();
|
||||
}
|
||||
}
|
||||
}
|
||||
85
Scripts/Mobiles/Monsters/ML/Prism of Light/CrystalDaemon.cs
Normal file
85
Scripts/Mobiles/Monsters/ML/Prism of Light/CrystalDaemon.cs
Normal file
|
|
@ -0,0 +1,85 @@
|
|||
using System;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a crystal daemon corpse" )]
|
||||
public class CrystalDaemon : BaseCreature
|
||||
{
|
||||
[Constructable]
|
||||
public CrystalDaemon()
|
||||
: base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
Name = "a crystal daemon";
|
||||
Body = 0x310;
|
||||
Hue = 0x3E8;
|
||||
BaseSoundID = 0x47D;
|
||||
|
||||
SetStr( 140, 200 );
|
||||
SetDex( 120, 150 );
|
||||
SetInt( 800, 850 );
|
||||
|
||||
SetHits( 200, 220 );
|
||||
|
||||
SetDamage( 16, 20 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 0 );
|
||||
SetDamageType( ResistanceType.Cold, 40 );
|
||||
SetDamageType( ResistanceType.Energy, 60 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 20, 40 );
|
||||
SetResistance( ResistanceType.Fire, 0, 20 );
|
||||
SetResistance( ResistanceType.Cold, 60, 80 );
|
||||
SetResistance( ResistanceType.Poison, 20, 40 );
|
||||
SetResistance( ResistanceType.Energy, 65, 75 );
|
||||
|
||||
SetSkill( SkillName.Wrestling, 60.0, 80.0 );
|
||||
SetSkill( SkillName.Tactics, 70.0, 80.0 );
|
||||
SetSkill( SkillName.MagicResist, 100.0, 110.0 );
|
||||
SetSkill( SkillName.Magery, 120.0, 130.0 );
|
||||
SetSkill( SkillName.EvalInt, 100.0, 110.0 );
|
||||
SetSkill( SkillName.Meditation, 100.0, 110.0 );
|
||||
|
||||
Fame = 15000;
|
||||
Karma = -15000;
|
||||
|
||||
PackArcaneScroll( 0, 1 );
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.FilthyRich, 3 );
|
||||
}
|
||||
|
||||
/*
|
||||
// TODO: uncomment once added
|
||||
public override void OnDeath( Container c )
|
||||
{
|
||||
base.OnDeath( c );
|
||||
|
||||
if ( Utility.RandomDouble() < 0.4 )
|
||||
c.DropItem( new ScatteredCrystals() );
|
||||
}
|
||||
*/
|
||||
|
||||
public CrystalDaemon( Serial serial )
|
||||
: base( serial )
|
||||
{
|
||||
}
|
||||
|
||||
public override void Serialize( GenericWriter writer )
|
||||
{
|
||||
base.Serialize( writer );
|
||||
|
||||
writer.Write( (int) 0 ); // version
|
||||
}
|
||||
|
||||
public override void Deserialize( GenericReader reader )
|
||||
{
|
||||
base.Deserialize( reader );
|
||||
|
||||
int version = reader.ReadInt();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,153 @@
|
|||
using System;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a Crystal Lattice Seeker corpse" )]
|
||||
public class CrystalLatticeSeeker : BaseCreature
|
||||
{
|
||||
[Constructable]
|
||||
public CrystalLatticeSeeker()
|
||||
: base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
Name = "Crystal Lattice Seeker";
|
||||
Body = 0x7B;
|
||||
Hue = 0x47E;
|
||||
|
||||
SetStr( 550, 850 );
|
||||
SetDex( 190, 250 );
|
||||
SetInt( 350, 450 );
|
||||
|
||||
SetHits( 350, 550 );
|
||||
|
||||
SetDamage( 13, 19 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 100 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 80, 90 );
|
||||
SetResistance( ResistanceType.Fire, 40, 50 );
|
||||
SetResistance( ResistanceType.Cold, 40, 50 );
|
||||
SetResistance( ResistanceType.Poison, 40, 50 );
|
||||
SetResistance( ResistanceType.Energy, 40, 50 );
|
||||
|
||||
SetSkill( SkillName.Anatomy, 50.0, 75.0 );
|
||||
SetSkill( SkillName.EvalInt, 90.0, 100.0 );
|
||||
SetSkill( SkillName.Magery, 100.0, 100.0 );
|
||||
SetSkill( SkillName.Meditation, 90.0, 100.0 );
|
||||
SetSkill( SkillName.MagicResist, 90.0, 100.0 );
|
||||
SetSkill( SkillName.Tactics, 90.0, 100.0 );
|
||||
SetSkill( SkillName.Wrestling, 90.0, 100.0 );
|
||||
|
||||
Fame = 17000;
|
||||
Karma = -17000;
|
||||
|
||||
PackArcaneScroll( 0, 2 );
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.FilthyRich, 4 );
|
||||
// TODO: uncomment once added
|
||||
//AddLoot( LootPack.Parrot );
|
||||
AddLoot( LootPack.Gems );
|
||||
}
|
||||
|
||||
public override void OnGaveMeleeAttack( Mobile defender )
|
||||
{
|
||||
base.OnGaveMeleeAttack( defender );
|
||||
|
||||
if ( Utility.RandomDouble() < 0.1 )
|
||||
Drain( defender );
|
||||
}
|
||||
|
||||
public override void OnGotMeleeAttack( Mobile attacker )
|
||||
{
|
||||
base.OnGotMeleeAttack( attacker );
|
||||
|
||||
if ( Utility.RandomDouble() < 0.1 )
|
||||
Drain( attacker );
|
||||
}
|
||||
|
||||
public virtual void Drain( Mobile m )
|
||||
{
|
||||
int toDrain;
|
||||
|
||||
switch ( Utility.Random( 3 ) )
|
||||
{
|
||||
case 0:
|
||||
{
|
||||
Say( 1042156 ); // I can grant life, and I can sap it as easily.
|
||||
PlaySound( 0x1E6 );
|
||||
|
||||
toDrain = Utility.RandomMinMax( 3, 6 );
|
||||
Hits += toDrain;
|
||||
m.Hits -= toDrain;
|
||||
break;
|
||||
}
|
||||
case 1:
|
||||
{
|
||||
Say( 1042157 ); // You'll go nowhere, unless I deem it should be so.
|
||||
PlaySound( 0x1DF );
|
||||
|
||||
toDrain = Utility.RandomMinMax( 10, 25 );
|
||||
Stam += toDrain;
|
||||
m.Stam -= toDrain;
|
||||
break;
|
||||
}
|
||||
case 2:
|
||||
{
|
||||
Say( 1042155 ); // Your power is mine to use as I will.
|
||||
PlaySound( 0x1F8 );
|
||||
|
||||
toDrain = Utility.RandomMinMax( 15, 25 );
|
||||
Mana += toDrain;
|
||||
m.Mana -= toDrain;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
// TODO: uncomment once added
|
||||
public override void OnDeath( Container c )
|
||||
{
|
||||
base.OnDeath( c );
|
||||
|
||||
if ( Utility.RandomDouble() < 0.75 )
|
||||
c.DropItem( new CrystallineFragments() );
|
||||
|
||||
if ( Utility.RandomDouble() < 0.07 )
|
||||
c.DropItem( new PiecesOfCrystal() );
|
||||
}
|
||||
*/
|
||||
|
||||
public override int Feathers { get { return 100; } }
|
||||
public override int TreasureMapLevel { get { return 5; } }
|
||||
|
||||
public override int GetAttackSound() { return 0x2F6; }
|
||||
public override int GetDeathSound() { return 0x2F7; }
|
||||
public override int GetAngerSound() { return 0x2F8; }
|
||||
public override int GetHurtSound() { return 0x2F9; }
|
||||
public override int GetIdleSound() { return 0x2FA; }
|
||||
|
||||
public CrystalLatticeSeeker( Serial serial )
|
||||
: base( serial )
|
||||
{
|
||||
}
|
||||
|
||||
public override void Serialize( GenericWriter writer )
|
||||
{
|
||||
base.Serialize( writer );
|
||||
|
||||
writer.Write( (int) 0 ); // version
|
||||
}
|
||||
|
||||
public override void Deserialize( GenericReader reader )
|
||||
{
|
||||
base.Deserialize( reader );
|
||||
|
||||
int version = reader.ReadInt();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,71 @@
|
|||
using System;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a crystal sea serpent corpse" )]
|
||||
public class CrystalSeaSerpent : SeaSerpent
|
||||
{
|
||||
[Constructable]
|
||||
public CrystalSeaSerpent()
|
||||
{
|
||||
Name = "a crystal sea serpent";
|
||||
Hue = 0x47E;
|
||||
|
||||
SetStr( 250, 450 );
|
||||
SetDex( 100, 150 );
|
||||
SetInt( 90, 190 );
|
||||
|
||||
SetHits( 230, 330 );
|
||||
|
||||
SetDamage( 10, 18 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 10 );
|
||||
SetDamageType( ResistanceType.Cold, 45 );
|
||||
SetDamageType( ResistanceType.Energy, 45 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 50, 70 );
|
||||
SetResistance( ResistanceType.Fire, 0 );
|
||||
SetResistance( ResistanceType.Cold, 70, 90 );
|
||||
SetResistance( ResistanceType.Poison, 20, 30 );
|
||||
SetResistance( ResistanceType.Energy, 60, 80 );
|
||||
}
|
||||
|
||||
/*
|
||||
// TODO: uncomment once added
|
||||
public override void OnDeath( Container c )
|
||||
{
|
||||
base.OnDeath( c );
|
||||
|
||||
if ( Utility.RandomDouble() < 0.05 )
|
||||
c.DropItem( new CrushedCrystals() );
|
||||
|
||||
if ( Utility.RandomDouble() < 0.1 )
|
||||
c.DropItem( new IcyHeart() );
|
||||
|
||||
if ( Utility.RandomDouble() < 0.1 )
|
||||
c.DropItem( new LuckyDagger() );
|
||||
}
|
||||
*/
|
||||
|
||||
public CrystalSeaSerpent( Serial serial )
|
||||
: base( serial )
|
||||
{
|
||||
}
|
||||
|
||||
public override void Serialize( GenericWriter writer )
|
||||
{
|
||||
base.Serialize( writer );
|
||||
|
||||
writer.Write( (int) 0 ); // version
|
||||
}
|
||||
|
||||
public override void Deserialize( GenericReader reader )
|
||||
{
|
||||
base.Deserialize( reader );
|
||||
|
||||
int version = reader.ReadInt();
|
||||
}
|
||||
}
|
||||
}
|
||||
91
Scripts/Mobiles/Monsters/ML/Prism of Light/CrystalVortex.cs
Normal file
91
Scripts/Mobiles/Monsters/ML/Prism of Light/CrystalVortex.cs
Normal file
|
|
@ -0,0 +1,91 @@
|
|||
using System;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a crystal vortex corpse" )]
|
||||
public class CrystalVortex : BaseCreature
|
||||
{
|
||||
[Constructable]
|
||||
public CrystalVortex()
|
||||
: base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
Name = "a crystal vortex";
|
||||
Body = 0xD;
|
||||
Hue = 0x2B2;
|
||||
BaseSoundID = 0x107;
|
||||
|
||||
SetStr( 800, 900 );
|
||||
SetDex( 500, 600 );
|
||||
SetInt( 200 );
|
||||
|
||||
SetHits( 350, 400 );
|
||||
SetMana( 0 );
|
||||
|
||||
SetDamage( 15, 20 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 0 );
|
||||
SetDamageType( ResistanceType.Cold, 50 );
|
||||
SetDamageType( ResistanceType.Energy, 50 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 60, 80 );
|
||||
SetResistance( ResistanceType.Fire, 0, 10 );
|
||||
SetResistance( ResistanceType.Cold, 70, 80 );
|
||||
SetResistance( ResistanceType.Poison, 40, 50 );
|
||||
SetResistance( ResistanceType.Energy, 60, 90 );
|
||||
|
||||
SetSkill( SkillName.MagicResist, 120.0 );
|
||||
SetSkill( SkillName.Tactics, 120.0 );
|
||||
SetSkill( SkillName.Wrestling, 120.0 );
|
||||
|
||||
Fame = 17000;
|
||||
Karma = -17000;
|
||||
|
||||
PackArcaneScroll( 0, 2 );
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.FilthyRich, 2 );
|
||||
// TODO: uncomment once added
|
||||
//AddLoot( LootPack.Parrot );
|
||||
}
|
||||
|
||||
/*
|
||||
// TODO: uncomment once added
|
||||
public override void OnDeath( Container c )
|
||||
{
|
||||
base.OnDeath( c );
|
||||
|
||||
if ( Utility.RandomDouble() < 0.75 )
|
||||
c.DropItem( new CrystallineFragments() );
|
||||
|
||||
if ( Utility.RandomDouble() < 0.06 )
|
||||
c.DropItem( new JaggedCrystals() );
|
||||
}
|
||||
*/
|
||||
|
||||
public override int GetAngerSound() { return 0x15; }
|
||||
public override int GetAttackSound() { return 0x28; }
|
||||
|
||||
public CrystalVortex( Serial serial )
|
||||
: base( serial )
|
||||
{
|
||||
}
|
||||
|
||||
public override void Serialize( GenericWriter writer )
|
||||
{
|
||||
base.Serialize( writer );
|
||||
|
||||
writer.Write( (int) 0 ); // version
|
||||
}
|
||||
|
||||
public override void Deserialize( GenericReader reader )
|
||||
{
|
||||
base.Deserialize( reader );
|
||||
|
||||
int version = reader.ReadInt();
|
||||
}
|
||||
}
|
||||
}
|
||||
37
Scripts/Mobiles/Monsters/ML/Prism of Light/CrystalWisp.cs
Normal file
37
Scripts/Mobiles/Monsters/ML/Prism of Light/CrystalWisp.cs
Normal file
|
|
@ -0,0 +1,37 @@
|
|||
using System;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
public class CrystalWisp : Wisp
|
||||
{
|
||||
[Constructable]
|
||||
public CrystalWisp()
|
||||
{
|
||||
Name = "a crystal wisp";
|
||||
Hue = 0x482;
|
||||
|
||||
PackArcaneScroll( 0, 1 );
|
||||
}
|
||||
|
||||
public CrystalWisp( Serial serial )
|
||||
: base( serial )
|
||||
{
|
||||
}
|
||||
|
||||
public override void Serialize( GenericWriter writer )
|
||||
{
|
||||
base.Serialize( writer );
|
||||
|
||||
writer.Write( (int) 0 ); // version
|
||||
}
|
||||
|
||||
public override void Deserialize( GenericReader reader )
|
||||
{
|
||||
base.Deserialize( reader );
|
||||
|
||||
int version = reader.ReadInt();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,71 @@
|
|||
using System;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a mantra effervescence corpse" )]
|
||||
public class MantraEffervescence : BaseCreature
|
||||
{
|
||||
[Constructable]
|
||||
public MantraEffervescence()
|
||||
: base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
Name = "a mantra effervescence";
|
||||
Body = 0x111;
|
||||
BaseSoundID = 0x56E;
|
||||
|
||||
SetStr( 130, 150 );
|
||||
SetDex( 120, 130 );
|
||||
SetInt( 150, 230 );
|
||||
|
||||
SetHits( 150, 250 );
|
||||
|
||||
SetDamage( 21, 25 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 30 );
|
||||
SetDamageType( ResistanceType.Energy, 70 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 60, 65 );
|
||||
SetResistance( ResistanceType.Fire, 40, 50 );
|
||||
SetResistance( ResistanceType.Cold, 40, 50 );
|
||||
SetResistance( ResistanceType.Poison, 50, 60 );
|
||||
SetResistance( ResistanceType.Energy, 100 );
|
||||
|
||||
SetSkill( SkillName.Wrestling, 80.0, 85.0 );
|
||||
SetSkill( SkillName.Tactics, 80.0, 85.0 );
|
||||
SetSkill( SkillName.MagicResist, 105.0, 115.0 );
|
||||
SetSkill( SkillName.Magery, 90.0, 110.0 );
|
||||
SetSkill( SkillName.EvalInt, 80.0, 90.0 );
|
||||
SetSkill( SkillName.Meditation, 90.0, 100.0 );
|
||||
|
||||
Fame = 6500;
|
||||
Karma = -6500;
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.FilthyRich );
|
||||
AddLoot( LootPack.Rich );
|
||||
}
|
||||
|
||||
public MantraEffervescence( Serial serial )
|
||||
: base( serial )
|
||||
{
|
||||
}
|
||||
|
||||
public override void Serialize( GenericWriter writer )
|
||||
{
|
||||
base.Serialize( writer );
|
||||
|
||||
writer.Write( (int) 0 ); // version
|
||||
}
|
||||
|
||||
public override void Deserialize( GenericReader reader )
|
||||
{
|
||||
base.Deserialize( reader );
|
||||
|
||||
int version = reader.ReadInt();
|
||||
}
|
||||
}
|
||||
}
|
||||
108
Scripts/Mobiles/Monsters/ML/Prism of Light/Protector.cs
Normal file
108
Scripts/Mobiles/Monsters/ML/Prism of Light/Protector.cs
Normal file
|
|
@ -0,0 +1,108 @@
|
|||
using System;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a human corpse" )]
|
||||
public class Protector : BaseCreature
|
||||
{
|
||||
[Constructable]
|
||||
public Protector()
|
||||
: base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
Body = 401;
|
||||
Female = true;
|
||||
Hue = Race.Human.RandomSkinHue();
|
||||
HairItemID = Race.Human.RandomHair( this );
|
||||
HairHue = Race.Human.RandomHairHue();
|
||||
|
||||
Name = "a Protector";
|
||||
Title = "the mystic llamaherder";
|
||||
|
||||
SetStr( 700, 800 );
|
||||
SetDex( 100, 150 );
|
||||
SetInt( 50, 75 );
|
||||
|
||||
SetHits( 350, 450 );
|
||||
|
||||
SetDamage( 6, 12 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 100 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 30, 40 );
|
||||
SetResistance( ResistanceType.Fire, 20, 30 );
|
||||
SetResistance( ResistanceType.Cold, 35, 40 );
|
||||
SetResistance( ResistanceType.Poison, 30, 40 );
|
||||
SetResistance( ResistanceType.Energy, 30, 40 );
|
||||
|
||||
SetSkill( SkillName.Wrestling, 70.0, 100.0 );
|
||||
SetSkill( SkillName.Tactics, 80.0, 100.0 );
|
||||
SetSkill( SkillName.MagicResist, 50.0, 70.0 );
|
||||
SetSkill( SkillName.Anatomy, 70.0, 100.0 );
|
||||
|
||||
Fame = 10000;
|
||||
Karma = -10000;
|
||||
|
||||
Item boots = new ThighBoots();
|
||||
boots.Movable = false;
|
||||
boots.Hue = Utility.Random( 2 );
|
||||
|
||||
Item shroud = new Item( 0x204E );
|
||||
shroud.Layer = Layer.OuterTorso;
|
||||
shroud.Movable = false;
|
||||
shroud.Hue = Utility.Random( 2 );
|
||||
|
||||
AddItem( boots );
|
||||
AddItem( shroud );
|
||||
}
|
||||
|
||||
public override bool AlwaysMurderer { get { return true; } }
|
||||
public override bool PropertyTitle { get { return false; } }
|
||||
public override bool ShowFameTitle { get { return false; } }
|
||||
|
||||
public Protector( Serial serial )
|
||||
: base( serial )
|
||||
{
|
||||
}
|
||||
|
||||
public override void GenerateLoot( bool spawning )
|
||||
{
|
||||
if ( spawning )
|
||||
return; // No loot/backpack on spawn
|
||||
|
||||
base.GenerateLoot( true );
|
||||
base.GenerateLoot( false );
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.FilthyRich );
|
||||
}
|
||||
|
||||
/*
|
||||
// TODO: uncomment once added
|
||||
public override void OnDeath( Container c )
|
||||
{
|
||||
base.OnDeath( c );
|
||||
|
||||
if ( Utility.RandomDouble() < 0.4 )
|
||||
c.DropItem( new ProtectorsEssence() );
|
||||
}
|
||||
*/
|
||||
|
||||
public override void Serialize( GenericWriter writer )
|
||||
{
|
||||
base.Serialize( writer );
|
||||
|
||||
writer.Write( (int) 0 ); // version
|
||||
}
|
||||
|
||||
public override void Deserialize( GenericReader reader )
|
||||
{
|
||||
base.Deserialize( reader );
|
||||
|
||||
int version = reader.ReadInt();
|
||||
}
|
||||
}
|
||||
}
|
||||
90
Scripts/Mobiles/Monsters/ML/Prism of Light/UnfrozenMummy.cs
Normal file
90
Scripts/Mobiles/Monsters/ML/Prism of Light/UnfrozenMummy.cs
Normal file
|
|
@ -0,0 +1,90 @@
|
|||
using System;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "an unfrozen mummy corpse" )]
|
||||
public class UnfrozenMummy : BaseCreature
|
||||
{
|
||||
[Constructable]
|
||||
public UnfrozenMummy()
|
||||
: base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.4, 0.8 )
|
||||
{
|
||||
Name = "an unfrozen mummy";
|
||||
Body = 0x9B;
|
||||
Hue = 0x480;
|
||||
BaseSoundID = 0x1D7;
|
||||
|
||||
SetStr( 450, 500 );
|
||||
SetDex( 200, 250 );
|
||||
SetInt( 800, 850 );
|
||||
|
||||
SetHits( 1500 );
|
||||
|
||||
SetDamage( 16, 20 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 0 );
|
||||
SetDamageType( ResistanceType.Energy, 50 );
|
||||
SetDamageType( ResistanceType.Cold, 50 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 35, 40 );
|
||||
SetResistance( ResistanceType.Fire, 20, 30 );
|
||||
SetResistance( ResistanceType.Cold, 60, 80 );
|
||||
SetResistance( ResistanceType.Poison, 20, 30 );
|
||||
SetResistance( ResistanceType.Energy, 70, 80 );
|
||||
|
||||
SetSkill( SkillName.Wrestling, 90.0, 100.0 );
|
||||
SetSkill( SkillName.Tactics, 100.0 );
|
||||
SetSkill( SkillName.MagicResist, 250.0 );
|
||||
SetSkill( SkillName.Magery, 50.0, 60.0 );
|
||||
SetSkill( SkillName.EvalInt, 50.0, 60.0 );
|
||||
SetSkill( SkillName.Meditation, 80.0 );
|
||||
|
||||
Fame = 25000;
|
||||
Karma = -25000;
|
||||
|
||||
PackArcaneScroll( 0, 2 );
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.UltraRich, 2 );
|
||||
// TODO: uncomment once added
|
||||
//AddLoot( LootPack.Parrot );
|
||||
}
|
||||
|
||||
/*
|
||||
// TODO: uncomment once added
|
||||
public override void OnDeath( Container c )
|
||||
{
|
||||
base.OnDeath( c );
|
||||
|
||||
if ( Utility.RandomDouble() < 0.6 )
|
||||
c.DropItem( new BrokenCrystals() );
|
||||
|
||||
if ( Utility.RandomDouble() < 0.1 )
|
||||
c.DropItem( new ParrotItem() );
|
||||
}
|
||||
*/
|
||||
|
||||
public UnfrozenMummy( Serial serial )
|
||||
: base( serial )
|
||||
{
|
||||
}
|
||||
|
||||
public override void Serialize( GenericWriter writer )
|
||||
{
|
||||
base.Serialize( writer );
|
||||
|
||||
writer.Write( (int) 0 ); // version
|
||||
}
|
||||
|
||||
public override void Deserialize( GenericReader reader )
|
||||
{
|
||||
base.Deserialize( reader );
|
||||
|
||||
int version = reader.ReadInt();
|
||||
}
|
||||
}
|
||||
}
|
||||
62
Scripts/Mobiles/Monsters/ML/Sanctuary/Chiikkaha.cs
Normal file
62
Scripts/Mobiles/Monsters/ML/Sanctuary/Chiikkaha.cs
Normal file
|
|
@ -0,0 +1,62 @@
|
|||
using System;
|
||||
using System.Collections;
|
||||
using Server.Misc;
|
||||
using Server.Items;
|
||||
using Server.Mobiles;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a Chiikkaha the Toothed corpse" )]
|
||||
public class Chiikkaha : RatmanMage
|
||||
{
|
||||
[Constructable]
|
||||
public Chiikkaha()
|
||||
{
|
||||
Name = "Chiikkaha the Toothed";
|
||||
|
||||
SetStr( 450, 476 );
|
||||
SetDex( 157, 179 );
|
||||
SetInt( 251, 275 );
|
||||
|
||||
SetHits( 400, 425 );
|
||||
|
||||
SetDamage( 10, 17 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 100 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 40, 45 );
|
||||
SetResistance( ResistanceType.Fire, 10, 20 );
|
||||
SetResistance( ResistanceType.Cold, 10, 20 );
|
||||
SetResistance( ResistanceType.Poison, 10, 20 );
|
||||
SetResistance( ResistanceType.Energy, 100 );
|
||||
|
||||
SetSkill( SkillName.EvalInt, 70.1, 80.0 );
|
||||
SetSkill( SkillName.Magery, 70.1, 90.0 );
|
||||
SetSkill( SkillName.MagicResist, 65.1, 96.0 );
|
||||
SetSkill( SkillName.Tactics, 50.1, 75.0 );
|
||||
SetSkill( SkillName.Wrestling, 50.1, 75.0 );
|
||||
|
||||
Fame = 7500;
|
||||
Karma = -7500;
|
||||
}
|
||||
|
||||
public Chiikkaha( Serial serial )
|
||||
: base( serial )
|
||||
{
|
||||
}
|
||||
|
||||
public override void Serialize( GenericWriter writer )
|
||||
{
|
||||
base.Serialize( writer );
|
||||
|
||||
writer.Write( (int) 0 ); // version
|
||||
}
|
||||
|
||||
public override void Deserialize( GenericReader reader )
|
||||
{
|
||||
base.Deserialize( reader );
|
||||
|
||||
int version = reader.ReadInt();
|
||||
}
|
||||
}
|
||||
}
|
||||
59
Scripts/Mobiles/Monsters/ML/Sanctuary/MougGuur.cs
Normal file
59
Scripts/Mobiles/Monsters/ML/Sanctuary/MougGuur.cs
Normal file
|
|
@ -0,0 +1,59 @@
|
|||
using System;
|
||||
using System.Collections;
|
||||
using Server.Items;
|
||||
using Server.Targeting;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a Moug-Guur corpse" )]
|
||||
public class MougGuur : Ettin
|
||||
{
|
||||
[Constructable]
|
||||
public MougGuur()
|
||||
{
|
||||
Name = "Moug-Guur";
|
||||
|
||||
SetStr( 556, 575 );
|
||||
SetDex( 84, 94 );
|
||||
SetInt( 59, 73 );
|
||||
|
||||
SetHits( 400, 415 );
|
||||
|
||||
SetDamage( 12, 20 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 100 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 61, 65 );
|
||||
SetResistance( ResistanceType.Fire, 16, 19 );
|
||||
SetResistance( ResistanceType.Cold, 41, 46 );
|
||||
SetResistance( ResistanceType.Poison, 21, 24 );
|
||||
SetResistance( ResistanceType.Energy, 19, 25 );
|
||||
|
||||
SetSkill( SkillName.MagicResist, 70.2, 75.0 );
|
||||
SetSkill( SkillName.Tactics, 80.8, 81.7 );
|
||||
SetSkill( SkillName.Wrestling, 93.9, 99.4 );
|
||||
|
||||
Fame = 3000;
|
||||
Karma = -3000;
|
||||
}
|
||||
|
||||
public MougGuur( Serial serial )
|
||||
: base( serial )
|
||||
{
|
||||
}
|
||||
|
||||
public override void Serialize( GenericWriter writer )
|
||||
{
|
||||
base.Serialize( writer );
|
||||
|
||||
writer.Write( (int) 0 ); // version
|
||||
}
|
||||
|
||||
public override void Deserialize( GenericReader reader )
|
||||
{
|
||||
base.Deserialize( reader );
|
||||
|
||||
int version = reader.ReadInt();
|
||||
}
|
||||
}
|
||||
}
|
||||
63
Scripts/Mobiles/Monsters/ML/Sanctuary/Szavetra.cs
Normal file
63
Scripts/Mobiles/Monsters/ML/Sanctuary/Szavetra.cs
Normal file
|
|
@ -0,0 +1,63 @@
|
|||
using System;
|
||||
using System.Collections;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a Szavetra corpse" )]
|
||||
public class Szavetra : Succubus
|
||||
{
|
||||
[Constructable]
|
||||
public Szavetra()
|
||||
{
|
||||
Name = "Szavetra";
|
||||
|
||||
SetStr( 627, 655 );
|
||||
SetDex( 164, 193 );
|
||||
SetInt( 566, 595 );
|
||||
|
||||
SetHits( 312, 415 );
|
||||
|
||||
SetDamage( 20, 30 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 75 );
|
||||
SetDamageType( ResistanceType.Energy, 25 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 83, 90 );
|
||||
SetResistance( ResistanceType.Fire, 72, 80 );
|
||||
SetResistance( ResistanceType.Cold, 40, 49 );
|
||||
SetResistance( ResistanceType.Poison, 51, 60 );
|
||||
SetResistance( ResistanceType.Energy, 50, 60 );
|
||||
|
||||
SetSkill( SkillName.EvalInt, 90.3, 99.8 );
|
||||
SetSkill( SkillName.Magery, 100.1, 100.6 ); // 10.1-10.6 on OSI, bug?
|
||||
SetSkill( SkillName.Meditation, 90.1, 110.0 );
|
||||
SetSkill( SkillName.MagicResist, 112.2, 127.2 );
|
||||
SetSkill( SkillName.Tactics, 91.2, 92.8 );
|
||||
SetSkill( SkillName.Wrestling, 80.2, 86.4 );
|
||||
|
||||
Fame = 24000;
|
||||
Karma = -24000;
|
||||
}
|
||||
|
||||
public Szavetra( Serial serial )
|
||||
: base( serial )
|
||||
{
|
||||
}
|
||||
|
||||
public override void Serialize( GenericWriter writer )
|
||||
{
|
||||
base.Serialize( writer );
|
||||
|
||||
writer.Write( (int) 0 ); // version
|
||||
}
|
||||
|
||||
public override void Deserialize( GenericReader reader )
|
||||
{
|
||||
base.Deserialize( reader );
|
||||
|
||||
int version = reader.ReadInt();
|
||||
}
|
||||
}
|
||||
}
|
||||
449
Scripts/Mobiles/Monsters/ML/Special/Ilhenir.cs
Normal file
449
Scripts/Mobiles/Monsters/ML/Special/Ilhenir.cs
Normal file
|
|
@ -0,0 +1,449 @@
|
|||
using System;
|
||||
using System.Collections;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
using Server.Spells;
|
||||
using Server.Network;
|
||||
using System.Collections.Generic;
|
||||
using Server.Engines.CannedEvil;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a corpse of Ilhenir" )]
|
||||
public class Ilhenir : BaseChampion
|
||||
{
|
||||
public override ChampionSkullType SkullType { get { return ChampionSkullType.Pain; } }
|
||||
|
||||
public override Type[] UniqueList { get { return new Type[] { }; } }
|
||||
public override Type[] SharedList
|
||||
{
|
||||
get
|
||||
{
|
||||
return new Type[] { typeof( ANecromancerShroud ),
|
||||
typeof( LieutenantOfTheBritannianRoyalGuard ),
|
||||
typeof( OblivionsNeedle ),
|
||||
typeof( TheRobeOfBritanniaAri ) };
|
||||
}
|
||||
}
|
||||
public override Type[] DecorativeList { get { return new Type[] { typeof( MonsterStatuette ) }; } }
|
||||
|
||||
public override MonsterStatuetteType[] StatueTypes
|
||||
{
|
||||
get
|
||||
{
|
||||
return new MonsterStatuetteType[] { MonsterStatuetteType.PlagueBeast,
|
||||
MonsterStatuetteType.RedDeath };
|
||||
}
|
||||
}
|
||||
|
||||
[Constructable]
|
||||
public Ilhenir()
|
||||
: base( AIType.AI_Mage )
|
||||
{
|
||||
Name = "Ilhenir";
|
||||
Title = "the Stained";
|
||||
Body = 0x103;
|
||||
|
||||
BaseSoundID = 589;
|
||||
|
||||
SetStr( 1105, 1350 );
|
||||
SetDex( 82, 160 );
|
||||
SetInt( 505, 750 );
|
||||
|
||||
SetHits( 9000 );
|
||||
|
||||
SetDamage( 21, 28 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 60 );
|
||||
SetDamageType( ResistanceType.Fire, 20 );
|
||||
SetDamageType( ResistanceType.Poison, 20 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 55, 65 );
|
||||
SetResistance( ResistanceType.Fire, 50, 60 );
|
||||
SetResistance( ResistanceType.Cold, 55, 65 );
|
||||
SetResistance( ResistanceType.Poison, 70, 90 );
|
||||
SetResistance( ResistanceType.Energy, 65, 75 );
|
||||
|
||||
SetSkill( SkillName.EvalInt, 100 );
|
||||
SetSkill( SkillName.Magery, 100 );
|
||||
SetSkill( SkillName.Meditation, 0 );
|
||||
SetSkill( SkillName.Poisoning, 5.4 );
|
||||
SetSkill( SkillName.Anatomy, 117.5 );
|
||||
SetSkill( SkillName.MagicResist, 120.0 );
|
||||
SetSkill( SkillName.Tactics, 119.9 );
|
||||
SetSkill( SkillName.Wrestling, 119.9 );
|
||||
|
||||
Fame = 50000;
|
||||
Karma = -50000;
|
||||
|
||||
VirtualArmor = 44;
|
||||
|
||||
if ( Core.ML ) {
|
||||
PackResources( 8 );
|
||||
PackTalismans( 5 );
|
||||
}
|
||||
}
|
||||
|
||||
public virtual void PackResources( int amount )
|
||||
{
|
||||
for( int i = 0; i < amount; i++ )
|
||||
switch( Utility.Random( 6 ) )
|
||||
{
|
||||
case 0: PackItem( new Blight() ); break;
|
||||
case 1: PackItem( new Scourge() ); break;
|
||||
case 2: PackItem( new Taint() ); break;
|
||||
case 3: PackItem( new Putrefication() ); break;
|
||||
case 4: PackItem( new Corruption() ); break;
|
||||
case 5: PackItem( new Muculent() ); break;
|
||||
}
|
||||
}
|
||||
|
||||
public virtual void PackItems( Item item, int amount )
|
||||
{
|
||||
for( int i = 0; i < amount; i++ )
|
||||
PackItem( item );
|
||||
}
|
||||
|
||||
public virtual void PackTalismans( int amount )
|
||||
{
|
||||
int count = Utility.Random( amount );
|
||||
|
||||
for( int i = 0; i < count; i++ )
|
||||
PackItem( new RandomTalisman() );
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.FilthyRich, 8 );
|
||||
}
|
||||
|
||||
public override void OnDeath( Container c )
|
||||
{
|
||||
base.OnDeath( c );
|
||||
|
||||
if ( Core.ML ) {
|
||||
c.DropItem( new GrizzledBones() );
|
||||
|
||||
// TODO: Parrots
|
||||
/*if ( Utility.RandomDouble() < 0.6 )
|
||||
c.DropItem( new ParrotItem() ); */
|
||||
|
||||
if( Utility.RandomDouble() < 0.05 )
|
||||
c.DropItem( new GrizzledMareStatuette() );
|
||||
|
||||
if( Utility.RandomDouble() < 0.025 )
|
||||
c.DropItem( new CrimsonCincture() );
|
||||
|
||||
// TODO: Armor sets
|
||||
/*if ( Utility.RandomDouble() < 0.05 )
|
||||
{
|
||||
switch ( Utility.Random(5) )
|
||||
{
|
||||
case 0: c.DropItem( new GrizzleGauntlets() ); break;
|
||||
case 1: c.DropItem( new GrizzleGreaves() ); break;
|
||||
case 2: c.DropItem( new GrizzleHelm() ); break;
|
||||
case 3: c.DropItem( new GrizzleTunic() ); break;
|
||||
case 4: c.DropItem( new GrizzleVambraces() ); break;
|
||||
}
|
||||
}*/
|
||||
}
|
||||
}
|
||||
|
||||
public override bool Unprovokable { get { return true; } }
|
||||
public override bool Uncalmable { get { return true; } }
|
||||
public override Poison PoisonImmune { get { return Poison.Lethal; } }
|
||||
//public override bool GivesMLMinorArtifact { get { return true; } } // TODO: Needs verification
|
||||
public override int TreasureMapLevel { get { return 5; } }
|
||||
|
||||
public override void OnGaveMeleeAttack( Mobile defender )
|
||||
{
|
||||
base.OnGaveMeleeAttack( defender );
|
||||
|
||||
if( Utility.RandomDouble() < 0.25 )
|
||||
CacophonicAttack( defender );
|
||||
}
|
||||
|
||||
public override void OnDamage( int amount, Mobile from, bool willKill )
|
||||
{
|
||||
if( Utility.RandomDouble() < 0.1 )
|
||||
DropOoze();
|
||||
|
||||
base.OnDamage( amount, from, willKill );
|
||||
}
|
||||
|
||||
public override int GetAngerSound()
|
||||
{
|
||||
return 0x581;
|
||||
}
|
||||
|
||||
public override int GetIdleSound()
|
||||
{
|
||||
return 0x582;
|
||||
}
|
||||
|
||||
public override int GetAttackSound()
|
||||
{
|
||||
return 0x580;
|
||||
}
|
||||
|
||||
public override int GetHurtSound()
|
||||
{
|
||||
return 0x583;
|
||||
}
|
||||
|
||||
public override int GetDeathSound()
|
||||
{
|
||||
return 0x584;
|
||||
}
|
||||
|
||||
public Ilhenir( Serial serial )
|
||||
: base( serial )
|
||||
{
|
||||
}
|
||||
|
||||
public override void Serialize( GenericWriter writer )
|
||||
{
|
||||
base.Serialize( writer );
|
||||
|
||||
writer.Write( (int)0 ); // version
|
||||
}
|
||||
|
||||
public override void Deserialize( GenericReader reader )
|
||||
{
|
||||
base.Deserialize( reader );
|
||||
|
||||
int version = reader.ReadInt();
|
||||
}
|
||||
|
||||
private static Hashtable m_Table;
|
||||
|
||||
public virtual void CacophonicAttack( Mobile to )
|
||||
{
|
||||
if( m_Table == null )
|
||||
m_Table = new Hashtable();
|
||||
|
||||
if( to.Alive && to.Player && m_Table[ to ] == null )
|
||||
{
|
||||
to.Send( SpeedControl.WalkSpeed );
|
||||
to.SendLocalizedMessage( 1072069 ); // A cacophonic sound lambastes you, suppressing your ability to move.
|
||||
to.PlaySound( 0x584 );
|
||||
|
||||
m_Table[ to ] = Timer.DelayCall( TimeSpan.FromSeconds( 30 ), new TimerStateCallback( EndCacophonic_Callback ), to );
|
||||
}
|
||||
}
|
||||
|
||||
private void EndCacophonic_Callback( object state )
|
||||
{
|
||||
if( state is Mobile )
|
||||
CacophonicEnd( (Mobile)state );
|
||||
}
|
||||
|
||||
public virtual void CacophonicEnd( Mobile from )
|
||||
{
|
||||
if( m_Table == null )
|
||||
m_Table = new Hashtable();
|
||||
|
||||
m_Table[ from ] = null;
|
||||
|
||||
from.Send( SpeedControl.Disable );
|
||||
}
|
||||
|
||||
public static bool UnderCacophonicAttack( Mobile from )
|
||||
{
|
||||
if( m_Table == null )
|
||||
m_Table = new Hashtable();
|
||||
|
||||
return m_Table[ from ] != null;
|
||||
}
|
||||
|
||||
private DateTime m_NextDrop = DateTime.UtcNow;
|
||||
|
||||
public virtual void DropOoze()
|
||||
{
|
||||
int amount = Utility.RandomMinMax( 1, 3 );
|
||||
bool corrosive = Utility.RandomBool();
|
||||
|
||||
for( int i = 0; i < amount; i++ )
|
||||
{
|
||||
Item ooze = new StainedOoze( corrosive );
|
||||
Point3D p = new Point3D( Location );
|
||||
|
||||
for( int j = 0; j < 5; j++ )
|
||||
{
|
||||
p = GetSpawnPosition( 2 );
|
||||
bool found = false;
|
||||
|
||||
foreach( Item item in Map.GetItemsInRange( p, 0 ) )
|
||||
if( item is StainedOoze )
|
||||
{
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
|
||||
if( !found )
|
||||
break;
|
||||
}
|
||||
|
||||
ooze.MoveToWorld( p, Map );
|
||||
}
|
||||
|
||||
if( Combatant != null )
|
||||
{
|
||||
if( corrosive )
|
||||
Combatant.SendLocalizedMessage( 1072071 ); // A corrosive gas seeps out of your enemy's skin!
|
||||
else
|
||||
Combatant.SendLocalizedMessage( 1072072 ); // A poisonous gas seeps out of your enemy's skin!
|
||||
}
|
||||
}
|
||||
|
||||
private int RandomPoint( int mid )
|
||||
{
|
||||
return ( mid + Utility.RandomMinMax( -2, 2 ) );
|
||||
}
|
||||
|
||||
public virtual Point3D GetSpawnPosition( int range )
|
||||
{
|
||||
return GetSpawnPosition( Location, Map, range );
|
||||
}
|
||||
|
||||
public virtual Point3D GetSpawnPosition( Point3D from, Map map, int range )
|
||||
{
|
||||
if( map == null )
|
||||
return from;
|
||||
|
||||
Point3D loc = new Point3D( ( RandomPoint( X ) ), ( RandomPoint( Y ) ), Z );
|
||||
|
||||
loc.Z = Map.GetAverageZ( loc.X, loc.Y );
|
||||
|
||||
return loc;
|
||||
}
|
||||
}
|
||||
|
||||
public class StainedOoze : Item
|
||||
{
|
||||
private bool m_Corrosive;
|
||||
private Timer m_Timer;
|
||||
private int m_Ticks;
|
||||
|
||||
[CommandProperty( AccessLevel.GameMaster )]
|
||||
public bool Corrosive
|
||||
{
|
||||
get { return m_Corrosive; }
|
||||
set { m_Corrosive = value; }
|
||||
}
|
||||
|
||||
[Constructable]
|
||||
public StainedOoze()
|
||||
: this( false )
|
||||
{
|
||||
}
|
||||
|
||||
[Constructable]
|
||||
public StainedOoze( bool corrosive )
|
||||
: base( 0x122A )
|
||||
{
|
||||
Movable = false;
|
||||
Hue = 0x95;
|
||||
|
||||
m_Corrosive = corrosive;
|
||||
m_Timer = Timer.DelayCall( TimeSpan.Zero, TimeSpan.FromSeconds( 1 ), OnTick );
|
||||
m_Ticks = 0;
|
||||
}
|
||||
|
||||
public override void OnAfterDelete()
|
||||
{
|
||||
if ( m_Timer != null )
|
||||
{
|
||||
m_Timer.Stop();
|
||||
m_Timer = null;
|
||||
}
|
||||
}
|
||||
|
||||
private void OnTick()
|
||||
{
|
||||
List<Mobile> toDamage = new List<Mobile>();
|
||||
|
||||
foreach ( Mobile m in GetMobilesInRange( 0 ) )
|
||||
{
|
||||
if ( m is BaseCreature )
|
||||
{
|
||||
BaseCreature bc = (BaseCreature)m;
|
||||
|
||||
if ( !bc.Controlled && !bc.Summoned )
|
||||
continue;
|
||||
}
|
||||
else if ( !m.Player )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if ( m.Alive && !m.IsDeadBondedPet && m.CanBeDamaged() )
|
||||
toDamage.Add( m );
|
||||
}
|
||||
|
||||
for ( int i = 0; i < toDamage.Count; ++i )
|
||||
Damage( toDamage[i] );
|
||||
|
||||
++m_Ticks;
|
||||
|
||||
if ( m_Ticks >= 35 )
|
||||
Delete();
|
||||
else if ( m_Ticks == 30 )
|
||||
ItemID = 0x122B;
|
||||
}
|
||||
|
||||
public void Damage( Mobile m )
|
||||
{
|
||||
if ( m_Corrosive )
|
||||
{
|
||||
List<Item> items = m.Items;
|
||||
bool damaged = false;
|
||||
|
||||
for ( int i = 0; i < items.Count; ++i )
|
||||
{
|
||||
IDurability wearable = items[i] as IDurability;
|
||||
|
||||
if ( wearable != null && wearable.HitPoints >= 10 && Utility.RandomDouble() < 0.25 )
|
||||
{
|
||||
wearable.HitPoints -= ( wearable.HitPoints == 10 ) ? Utility.Random( 1, 5 ) : 10;
|
||||
damaged = true;
|
||||
}
|
||||
}
|
||||
|
||||
if ( damaged )
|
||||
{
|
||||
m.LocalOverheadMessage( MessageType.Regular, 0x21, 1072070 ); // The infernal ooze scorches you, setting you and your equipment ablaze!
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
AOS.Damage( m, 40, 0, 0, 0, 100, 0 );
|
||||
}
|
||||
|
||||
public StainedOoze( Serial serial )
|
||||
: base( serial )
|
||||
{
|
||||
}
|
||||
|
||||
public override void Serialize( GenericWriter writer )
|
||||
{
|
||||
base.Serialize( writer );
|
||||
|
||||
writer.Write( (int) 0 ); // version
|
||||
|
||||
writer.Write( m_Corrosive );
|
||||
}
|
||||
|
||||
public override void Deserialize( GenericReader reader )
|
||||
{
|
||||
base.Deserialize( reader );
|
||||
|
||||
int version = reader.ReadInt();
|
||||
|
||||
m_Corrosive = reader.ReadBool();
|
||||
|
||||
m_Timer = Timer.DelayCall( TimeSpan.Zero, TimeSpan.FromSeconds( 1 ), OnTick );
|
||||
m_Ticks = ( ItemID == 0x122A ) ? 0 : 30;
|
||||
}
|
||||
}
|
||||
}
|
||||
241
Scripts/Mobiles/Monsters/ML/Special/Meraktus.cs
Normal file
241
Scripts/Mobiles/Monsters/ML/Special/Meraktus.cs
Normal file
|
|
@ -0,0 +1,241 @@
|
|||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using Server.Items;
|
||||
using Server.Targeting;
|
||||
using Server.Misc;
|
||||
using Server.Engines.CannedEvil;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "the remains of Meraktus" )]
|
||||
public class Meraktus : BaseChampion
|
||||
{
|
||||
public override ChampionSkullType SkullType{ get{ return ChampionSkullType.Pain; } }
|
||||
|
||||
public override Type[] UniqueList{ get{ return new Type[] { typeof( Subdue ) }; } }
|
||||
public override Type[] SharedList{ get{ return new Type[] { }; } }
|
||||
public override Type[] DecorativeList{ get{ return new Type[] { typeof( ArtifactLargeVase ),
|
||||
typeof( ArtifactVase ),
|
||||
typeof( MinotaurStatueDeed ) }; } }
|
||||
|
||||
public override MonsterStatuetteType[] StatueTypes{ get{ return new MonsterStatuetteType[] {
|
||||
MonsterStatuetteType.Minotaur }; } }
|
||||
|
||||
public override WeaponAbility GetWeaponAbility()
|
||||
{
|
||||
return WeaponAbility.Dismount;
|
||||
}
|
||||
|
||||
[Constructable]
|
||||
public Meraktus()
|
||||
: base(AIType.AI_Melee)
|
||||
{
|
||||
Name = "Meraktus";
|
||||
Title = "the Tormented";
|
||||
Body = 263;
|
||||
BaseSoundID = 680;
|
||||
Hue = 0x835;
|
||||
|
||||
SetStr( 1419, 1438 );
|
||||
SetDex( 309, 413 );
|
||||
SetInt( 129, 131 );
|
||||
|
||||
SetHits( 4100, 4200 );
|
||||
|
||||
SetDamage( 16, 30 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 100 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 65, 90 );
|
||||
SetResistance( ResistanceType.Fire, 65, 70 );
|
||||
SetResistance( ResistanceType.Cold, 50, 60 );
|
||||
SetResistance( ResistanceType.Poison, 40, 60 );
|
||||
SetResistance( ResistanceType.Energy, 50, 55 );
|
||||
|
||||
//SetSkill( SkillName.Meditation, Unknown );
|
||||
//SetSkill( SkillName.EvalInt, Unknown );
|
||||
//SetSkill( SkillName.Magery, Unknown );
|
||||
//SetSkill( SkillName.Poisoning, Unknown );
|
||||
SetSkill( SkillName.Anatomy, 0);
|
||||
SetSkill( SkillName.MagicResist, 107.0, 111.3 );
|
||||
SetSkill( SkillName.Tactics, 107.0, 117.0 );
|
||||
SetSkill( SkillName.Wrestling, 100.0, 105.0 );
|
||||
|
||||
Fame = 70000;
|
||||
Karma = -70000;
|
||||
|
||||
VirtualArmor = 28; // Don't know what it should be
|
||||
|
||||
if ( Core.ML ) {
|
||||
PackResources(8);
|
||||
PackTalismans(5);
|
||||
}
|
||||
|
||||
Timer.DelayCall(TimeSpan.FromSeconds(1), new TimerCallback(SpawnTormented));
|
||||
}
|
||||
|
||||
public virtual void PackResources(int amount)
|
||||
{
|
||||
for (int i = 0; i < amount; i++)
|
||||
switch (Utility.Random(6))
|
||||
{
|
||||
case 0: PackItem(new Blight()); break;
|
||||
case 1: PackItem(new Scourge()); break;
|
||||
case 2: PackItem(new Taint()); break;
|
||||
case 3: PackItem(new Putrefication()); break;
|
||||
case 4: PackItem(new Corruption()); break;
|
||||
case 5: PackItem(new Muculent()); break;
|
||||
}
|
||||
}
|
||||
|
||||
public virtual void PackTalismans(int amount)
|
||||
{
|
||||
int count = Utility.Random(amount);
|
||||
|
||||
for (int i = 0; i < count; i++)
|
||||
PackItem(new RandomTalisman());
|
||||
}
|
||||
|
||||
public override void OnDeath( Container c )
|
||||
{
|
||||
base.OnDeath( c );
|
||||
|
||||
if ( Core.ML ) {
|
||||
c.DropItem( new MalletAndChisel() );
|
||||
|
||||
switch ( Utility.Random( 3 ) )
|
||||
{
|
||||
case 0: c.DropItem( new MinotaurHedge() ); break;
|
||||
case 1: c.DropItem( new BonePile() ); break;
|
||||
case 2: c.DropItem( new LightYarn() ); break;
|
||||
}
|
||||
|
||||
if ( Utility.RandomBool() )
|
||||
c.DropItem( new TormentedChains() );
|
||||
|
||||
if ( Utility.RandomDouble() < 0.025 )
|
||||
c.DropItem(new CrimsonCincture());
|
||||
}
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
if ( Core.ML ) {
|
||||
AddLoot( LootPack.AosSuperBoss, 5 ); // Need to verify
|
||||
}
|
||||
}
|
||||
|
||||
public override int GetAngerSound()
|
||||
{
|
||||
return 0x597;
|
||||
}
|
||||
|
||||
public override int GetIdleSound()
|
||||
{
|
||||
return 0x596;
|
||||
}
|
||||
|
||||
public override int GetAttackSound()
|
||||
{
|
||||
return 0x599;
|
||||
}
|
||||
|
||||
public override int GetHurtSound()
|
||||
{
|
||||
return 0x59a;
|
||||
}
|
||||
|
||||
public override int GetDeathSound()
|
||||
{
|
||||
return 0x59c;
|
||||
}
|
||||
|
||||
public override int Meat { get { return 2; } }
|
||||
public override int Hides { get { return 10; } }
|
||||
public override HideType HideType { get { return HideType.Regular; } }
|
||||
public override Poison PoisonImmune{ get{ return Poison.Regular; } }
|
||||
public override int TreasureMapLevel{ get{ return 3; } }
|
||||
public override bool BardImmune{ get{ return true; } }
|
||||
public override bool Unprovokable{ get{ return true; } }
|
||||
public override bool Uncalmable { get { return true; } }
|
||||
|
||||
public override void OnGaveMeleeAttack(Mobile defender)
|
||||
{
|
||||
base.OnGaveMeleeAttack(defender);
|
||||
if (0.2 >= Utility.RandomDouble())
|
||||
Earthquake();
|
||||
}
|
||||
|
||||
public void Earthquake()
|
||||
{
|
||||
Map map = this.Map;
|
||||
if (map == null)
|
||||
return;
|
||||
ArrayList targets = new ArrayList();
|
||||
foreach (Mobile m in this.GetMobilesInRange(8))
|
||||
{
|
||||
if (m == this || !CanBeHarmful(m))
|
||||
continue;
|
||||
if (m is BaseCreature && (((BaseCreature)m).Controlled || ((BaseCreature)m).Summoned || ((BaseCreature)m).Team != this.Team))
|
||||
targets.Add(m);
|
||||
else if (m.Player)
|
||||
targets.Add(m);
|
||||
}
|
||||
PlaySound(0x2F3);
|
||||
for (int i = 0; i < targets.Count; ++i)
|
||||
{
|
||||
Mobile m = (Mobile)targets[i];
|
||||
if( m != null && !m.Deleted && m is PlayerMobile )
|
||||
{
|
||||
PlayerMobile pm = m as PlayerMobile;
|
||||
if(pm != null && pm.Mounted)
|
||||
{
|
||||
pm.Mount.Rider=null;
|
||||
}
|
||||
}
|
||||
double damage = m.Hits * 0.6;//was .6
|
||||
if (damage < 10.0)
|
||||
damage = 10.0;
|
||||
else if (damage > 75.0)
|
||||
damage = 75.0;
|
||||
DoHarmful(m);
|
||||
AOS.Damage(m, this, (int)damage, 100, 0, 0, 0, 0);
|
||||
if (m.Alive && m.Body.IsHuman && !m.Mounted)
|
||||
m.Animate(20, 7, 1, true, false, 0); // take hit
|
||||
}
|
||||
}
|
||||
|
||||
public Meraktus( 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();
|
||||
}
|
||||
#region SpawnHelpers
|
||||
public void SpawnTormented()
|
||||
{
|
||||
BaseCreature spawna = new TormentedMinotaur();
|
||||
spawna.MoveToWorld(Location, Map);
|
||||
|
||||
BaseCreature spawnb = new TormentedMinotaur();
|
||||
spawnb.MoveToWorld(Location, Map);
|
||||
|
||||
BaseCreature spawnc = new TormentedMinotaur();
|
||||
spawnc.MoveToWorld(Location, Map);
|
||||
|
||||
BaseCreature spawnd = new TormentedMinotaur();
|
||||
spawnd.MoveToWorld(Location, Map);
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
162
Scripts/Mobiles/Monsters/ML/Special/Twaulo.cs
Normal file
162
Scripts/Mobiles/Monsters/ML/Special/Twaulo.cs
Normal file
|
|
@ -0,0 +1,162 @@
|
|||
using System;
|
||||
using Server;
|
||||
using System.Collections;
|
||||
using Server.Items;
|
||||
using Server.Targeting;
|
||||
using System.Collections.Generic;
|
||||
using Server.Engines.CannedEvil;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName("a corpse of Twaulo")]
|
||||
public class Twaulo : BaseChampion
|
||||
{
|
||||
public override ChampionSkullType SkullType{ get{ return ChampionSkullType.Pain; } }
|
||||
|
||||
public override Type[] UniqueList{ get{ return new Type[] { typeof( Quell ) }; } }
|
||||
public override Type[] SharedList{ get{ return new Type[] { typeof( TheMostKnowledgePerson ), typeof( OblivionsNeedle ) }; } }
|
||||
public override Type[] DecorativeList{ get{ return new Type[] { typeof( Pier ), typeof( MonsterStatuette ) }; } }
|
||||
|
||||
public override MonsterStatuetteType[] StatueTypes{ get{ return new MonsterStatuetteType[] { MonsterStatuetteType.DreadHorn }; } }
|
||||
|
||||
[Constructable]
|
||||
public Twaulo()
|
||||
: base(AIType.AI_Melee)
|
||||
{
|
||||
Name = "Twaulo";
|
||||
Title = "of the Glade";
|
||||
Body = 101;
|
||||
BaseSoundID = 679;
|
||||
Hue = 0x455;
|
||||
|
||||
SetStr( 1751, 1950 );
|
||||
SetDex( 251, 450 );
|
||||
SetInt( 801, 1000 );
|
||||
|
||||
SetHits( 7500 );
|
||||
|
||||
SetDamage( 19, 24 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 100 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 65, 75 );
|
||||
SetResistance( ResistanceType.Fire, 45, 55 );
|
||||
SetResistance( ResistanceType.Cold, 50, 60 );
|
||||
SetResistance( ResistanceType.Poison, 50, 60 );
|
||||
SetResistance( ResistanceType.Energy, 50, 60 );
|
||||
|
||||
SetSkill( SkillName.EvalInt, 0 ); // Per Stratics?!?
|
||||
SetSkill( SkillName.Magery, 0 ); // Per Stratics?!?
|
||||
SetSkill( SkillName.Meditation, 0 ); // Per Stratics?!?
|
||||
SetSkill(SkillName.Anatomy, 95.1, 115.0);
|
||||
SetSkill(SkillName.Archery, 95.1, 100.0);
|
||||
SetSkill(SkillName.MagicResist, 50.3, 80.0);
|
||||
SetSkill(SkillName.Tactics, 90.1, 100.0);
|
||||
SetSkill(SkillName.Wrestling, 95.1, 100.0);
|
||||
|
||||
Fame = 50000;
|
||||
Karma = 50000;
|
||||
|
||||
VirtualArmor = 50;
|
||||
|
||||
AddItem(new Bow());
|
||||
PackItem(new Arrow(Utility.RandomMinMax(500, 700)));
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot(LootPack.UltraRich, 2);
|
||||
AddLoot(LootPack.Average);
|
||||
AddLoot(LootPack.Gems);
|
||||
}
|
||||
|
||||
public override OppositionGroup OppositionGroup
|
||||
{
|
||||
get{ return OppositionGroup.FeyAndUndead; }
|
||||
}
|
||||
|
||||
public override bool Unprovokable{ get{ return true; } }
|
||||
public override Poison PoisonImmune{ get{ return Poison.Regular; } }
|
||||
public override int TreasureMapLevel{ get{ return 5; } }
|
||||
public override int Meat { get { return 1; } }
|
||||
public override int Hides { get { return 8; } }
|
||||
public override HideType HideType { get { return HideType.Spined; } }
|
||||
|
||||
public void SpawnPixies( Mobile target )
|
||||
{
|
||||
Map map = this.Map;
|
||||
|
||||
if ( map == null )
|
||||
return;
|
||||
|
||||
int newPixies = Utility.RandomMinMax( 3, 6 );
|
||||
|
||||
for ( int i = 0; i < newPixies; ++i )
|
||||
{
|
||||
Pixie pixie = new Pixie();
|
||||
|
||||
pixie.Team = this.Team;
|
||||
pixie.FightMode = FightMode.Closest;
|
||||
|
||||
bool validLocation = false;
|
||||
Point3D loc = this.Location;
|
||||
|
||||
for ( int j = 0; !validLocation && j < 10; ++j )
|
||||
{
|
||||
int x = X + Utility.Random( 3 ) - 1;
|
||||
int y = Y + Utility.Random( 3 ) - 1;
|
||||
int z = map.GetAverageZ( x, y );
|
||||
|
||||
if ( validLocation = map.CanFit( x, y, this.Z, 16, false, false ) )
|
||||
loc = new Point3D( x, y, Z );
|
||||
else if ( validLocation = map.CanFit( x, y, z, 16, false, false ) )
|
||||
loc = new Point3D( x, y, z );
|
||||
}
|
||||
|
||||
pixie.MoveToWorld( loc, map );
|
||||
pixie.Combatant = target;
|
||||
}
|
||||
}
|
||||
|
||||
public override void AlterDamageScalarFrom( Mobile caster, ref double scalar )
|
||||
{
|
||||
if ( 0.1 >= Utility.RandomDouble() )
|
||||
SpawnPixies( caster );
|
||||
}
|
||||
|
||||
public override void OnGaveMeleeAttack( Mobile defender )
|
||||
{
|
||||
base.OnGaveMeleeAttack( defender );
|
||||
|
||||
defender.Damage( Utility.Random( 20, 10 ), this );
|
||||
defender.Stam -= Utility.Random( 20, 10 );
|
||||
defender.Mana -= Utility.Random( 20, 10 );
|
||||
}
|
||||
|
||||
public override void OnGotMeleeAttack( Mobile attacker )
|
||||
{
|
||||
base.OnGotMeleeAttack( attacker );
|
||||
|
||||
if ( 0.1 >= Utility.RandomDouble() )
|
||||
SpawnPixies( attacker );
|
||||
}
|
||||
|
||||
public Twaulo(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();
|
||||
}
|
||||
}
|
||||
}
|
||||
307
Scripts/Mobiles/Monsters/ML/Twisted Weald/Changeling.cs
Normal file
307
Scripts/Mobiles/Monsters/ML/Twisted Weald/Changeling.cs
Normal file
|
|
@ -0,0 +1,307 @@
|
|||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using Server;
|
||||
using Server.Misc;
|
||||
using Server.Spells;
|
||||
using Server.Spells.Third;
|
||||
using Server.Spells.Sixth;
|
||||
using Server.Items;
|
||||
using Server.Targeting;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a changeling corpse" )]
|
||||
public class Changeling : BaseCreature
|
||||
{
|
||||
public virtual string DefaultName{ get{ return "a changeling"; } }
|
||||
public virtual int DefaultHue{ get{ return 0; } }
|
||||
|
||||
[Constructable]
|
||||
public Changeling()
|
||||
: base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
|
||||
{
|
||||
Name = DefaultName;
|
||||
Body = 264;
|
||||
Hue = DefaultHue;
|
||||
|
||||
SetStr( 36, 105 );
|
||||
SetDex( 212, 262 );
|
||||
SetInt( 317, 399 );
|
||||
|
||||
SetHits( 201, 211 );
|
||||
SetStam( 212, 262 );
|
||||
SetMana( 317, 399 );
|
||||
|
||||
SetDamage( 9, 15 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 100 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 81, 90 );
|
||||
SetResistance( ResistanceType.Fire, 40, 50 );
|
||||
SetResistance( ResistanceType.Cold, 40, 49 );
|
||||
SetResistance( ResistanceType.Poison, 40, 50 );
|
||||
SetResistance( ResistanceType.Energy, 43, 50 );
|
||||
|
||||
SetSkill( SkillName.Wrestling, 10.4, 12.5 );
|
||||
SetSkill( SkillName.Tactics, 101.1, 108.3 );
|
||||
SetSkill( SkillName.MagicResist, 121.6, 132.2 );
|
||||
SetSkill( SkillName.Magery, 91.6, 99.5 );
|
||||
SetSkill( SkillName.EvalInt, 91.5, 98.8 );
|
||||
SetSkill( SkillName.Meditation, 91.7, 98.5 );
|
||||
|
||||
Fame = 15000;
|
||||
Karma = -15000;
|
||||
|
||||
PackScroll( 1, 7 );
|
||||
PackItem( new Arrow( 35 ) );
|
||||
PackItem( new Bolt( 25 ) );
|
||||
PackGem( 2 );
|
||||
|
||||
PackArcaneScroll( 0, 1 );
|
||||
}
|
||||
|
||||
public override bool ShowFameTitle{ get{ return false; } }
|
||||
public override bool InitialInnocent{ get{ return ( m_MorphedInto != null ); } }
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.AosRich, 3 );
|
||||
}
|
||||
|
||||
public override int GetAngerSound() { return 0x46E; }
|
||||
public override int GetIdleSound() { return 0x470; }
|
||||
public override int GetAttackSound() { return 0x46D; }
|
||||
public override int GetHurtSound() { return 0x471; }
|
||||
public override int GetDeathSound() { return 0x46F; }
|
||||
|
||||
private Mobile m_MorphedInto;
|
||||
private DateTime m_LastMorph;
|
||||
private DateTime m_NextFireRing;
|
||||
|
||||
[CommandProperty( AccessLevel.GameMaster )]
|
||||
public Mobile MorphedInto
|
||||
{
|
||||
get { return m_MorphedInto; }
|
||||
set
|
||||
{
|
||||
if ( value == this )
|
||||
value = null;
|
||||
|
||||
if ( m_MorphedInto != value )
|
||||
{
|
||||
Revert();
|
||||
|
||||
if ( value != null )
|
||||
{
|
||||
Morph( value );
|
||||
m_LastMorph = DateTime.UtcNow;
|
||||
}
|
||||
|
||||
m_MorphedInto = value;
|
||||
Delta( MobileDelta.Noto );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public override void OnThink()
|
||||
{
|
||||
base.OnThink();
|
||||
|
||||
if ( Combatant != null )
|
||||
{
|
||||
if ( m_NextFireRing <= DateTime.UtcNow && Utility.RandomDouble() < 0.02 )
|
||||
{
|
||||
FireRing();
|
||||
m_NextFireRing = DateTime.UtcNow + TimeSpan.FromMinutes( 2 );
|
||||
}
|
||||
|
||||
if ( Combatant.Player && m_MorphedInto != Combatant && Utility.RandomDouble() < 0.05 )
|
||||
MorphedInto = Combatant;
|
||||
}
|
||||
}
|
||||
|
||||
public override bool CheckIdle()
|
||||
{
|
||||
bool idle = base.CheckIdle();
|
||||
|
||||
if ( idle && m_MorphedInto != null && DateTime.UtcNow - m_LastMorph > TimeSpan.FromSeconds( 30 ) )
|
||||
MorphedInto = null;
|
||||
|
||||
return idle;
|
||||
}
|
||||
|
||||
private void FireEffects( int itemID, int[] offsets )
|
||||
{
|
||||
for ( int i = 0; i < offsets.Length; i += 2 )
|
||||
{
|
||||
Point3D p = Location;
|
||||
|
||||
p.X += offsets[i];
|
||||
p.Y += offsets[i + 1];
|
||||
|
||||
if ( SpellHelper.AdjustField( ref p, Map, 12, false ) )
|
||||
Effects.SendLocationEffect( p, Map, itemID, 50 );
|
||||
}
|
||||
}
|
||||
|
||||
private static readonly int[] m_FireNorth = new int[]
|
||||
{
|
||||
-1, -1,
|
||||
1, -1,
|
||||
-1, 2,
|
||||
1, 2
|
||||
};
|
||||
|
||||
private static readonly int[] m_FireEast = new int[]
|
||||
{
|
||||
-1, 0,
|
||||
2, 0
|
||||
};
|
||||
|
||||
protected virtual void FireRing()
|
||||
{
|
||||
FireEffects( 0x3E27, m_FireNorth );
|
||||
FireEffects( 0x3E31, m_FireEast );
|
||||
}
|
||||
|
||||
protected virtual void Morph( Mobile m )
|
||||
{
|
||||
Body = m.Body;
|
||||
Hue = m.Hue;
|
||||
Female = m.Female;
|
||||
Name = m.Name;
|
||||
NameHue = m.NameHue;
|
||||
Title = m.Title;
|
||||
Kills = m.Kills;
|
||||
HairItemID = m.HairItemID;
|
||||
HairHue = m.HairHue;
|
||||
FacialHairItemID = m.FacialHairItemID;
|
||||
FacialHairHue = m.FacialHairHue;
|
||||
|
||||
// TODO: Skills?
|
||||
|
||||
foreach ( Item item in m.Items )
|
||||
{
|
||||
if ( item.Layer != Layer.Backpack && item.Layer != Layer.Mount && item.Layer != Layer.Bank )
|
||||
AddItem( new ClonedItem( item ) ); // TODO: Clone weapon/armor attributes
|
||||
}
|
||||
|
||||
PlaySound( 0x511 );
|
||||
FixedParticles( 0x376A, 1, 14, 5045, EffectLayer.Waist );
|
||||
}
|
||||
|
||||
protected virtual void Revert()
|
||||
{
|
||||
Body = 264;
|
||||
Hue = ( IsParagon && DefaultHue == 0 ) ? Paragon.Hue : DefaultHue;
|
||||
Female = false;
|
||||
Name = DefaultName;
|
||||
NameHue = -1;
|
||||
Title = null;
|
||||
Kills = 0;
|
||||
HairItemID = 0;
|
||||
HairHue = 0;
|
||||
FacialHairItemID = 0;
|
||||
FacialHairHue = 0;
|
||||
|
||||
DeleteClonedItems();
|
||||
|
||||
PlaySound( 0x511 );
|
||||
FixedParticles( 0x376A, 1, 14, 5045, EffectLayer.Waist );
|
||||
}
|
||||
|
||||
public void DeleteClonedItems()
|
||||
{
|
||||
for ( int i = Items.Count - 1; i >= 0; --i )
|
||||
{
|
||||
Item item = Items[i];
|
||||
|
||||
if ( item is ClonedItem )
|
||||
item.Delete();
|
||||
}
|
||||
|
||||
if ( Backpack != null )
|
||||
{
|
||||
for ( int i = Backpack.Items.Count - 1; i >= 0; --i )
|
||||
{
|
||||
Item item = Backpack.Items[i];
|
||||
|
||||
if ( item is ClonedItem )
|
||||
item.Delete();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public override void OnAfterDelete()
|
||||
{
|
||||
DeleteClonedItems();
|
||||
|
||||
base.OnAfterDelete();
|
||||
}
|
||||
|
||||
public override void ClearHands()
|
||||
{
|
||||
}
|
||||
|
||||
public Changeling( Serial serial )
|
||||
: base( serial )
|
||||
{
|
||||
}
|
||||
|
||||
public override void Serialize( GenericWriter writer )
|
||||
{
|
||||
base.Serialize( writer );
|
||||
|
||||
writer.Write( (int) 0 ); // version
|
||||
writer.Write( ( m_MorphedInto != null ) );
|
||||
}
|
||||
|
||||
public override void Deserialize( GenericReader reader )
|
||||
{
|
||||
base.Deserialize( reader );
|
||||
|
||||
int version = reader.ReadInt();
|
||||
|
||||
if ( reader.ReadBool() )
|
||||
ValidationQueue<Changeling>.Add( this );
|
||||
}
|
||||
|
||||
public void Validate()
|
||||
{
|
||||
Revert();
|
||||
}
|
||||
|
||||
private class ClonedItem : Item
|
||||
{
|
||||
public ClonedItem( Item item )
|
||||
: base( item.ItemID )
|
||||
{
|
||||
Name = item.Name;
|
||||
Weight = item.Weight;
|
||||
Hue = item.Hue;
|
||||
Layer = item.Layer;
|
||||
Movable = false;
|
||||
}
|
||||
|
||||
public ClonedItem( Serial serial )
|
||||
: base( serial )
|
||||
{
|
||||
}
|
||||
|
||||
public override void Serialize( GenericWriter writer )
|
||||
{
|
||||
base.Serialize( writer );
|
||||
|
||||
writer.Write( (int) 0 ); // version
|
||||
}
|
||||
|
||||
public override void Deserialize( GenericReader reader )
|
||||
{
|
||||
base.Deserialize( reader );
|
||||
|
||||
int version = reader.ReadInt();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
83
Scripts/Mobiles/Monsters/ML/Twisted Weald/Gnaw.cs
Normal file
83
Scripts/Mobiles/Monsters/ML/Twisted Weald/Gnaw.cs
Normal file
|
|
@ -0,0 +1,83 @@
|
|||
using System;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a Gnaw corpse" )]
|
||||
public class Gnaw : DireWolf
|
||||
{
|
||||
[Constructable]
|
||||
public Gnaw()
|
||||
{
|
||||
IsParagon = true;
|
||||
|
||||
Name = "Gnaw";
|
||||
Hue = 0x130;
|
||||
|
||||
SetStr( 151, 172 );
|
||||
SetDex( 124, 145 );
|
||||
SetInt( 60, 86 );
|
||||
|
||||
SetHits( 817, 857 );
|
||||
SetStam( 124, 145 );
|
||||
SetMana( 52, 86 );
|
||||
|
||||
SetDamage( 16, 22 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 100 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 64, 69 );
|
||||
SetResistance( ResistanceType.Fire, 53, 56 );
|
||||
SetResistance( ResistanceType.Cold, 22, 27 );
|
||||
SetResistance( ResistanceType.Poison, 27, 30 );
|
||||
SetResistance( ResistanceType.Energy, 21, 34 );
|
||||
|
||||
SetSkill( SkillName.Wrestling, 106.4, 116.5 );
|
||||
SetSkill( SkillName.Tactics, 84.1, 103.2 );
|
||||
SetSkill( SkillName.MagicResist, 96.8, 110.7 );
|
||||
|
||||
Fame = 17500;
|
||||
Karma = -17500;
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.FilthyRich, 2 );
|
||||
}
|
||||
|
||||
public override bool GivesMLMinorArtifact{ get{ return true; } }
|
||||
public override int Hides{ get{ return 28; } }
|
||||
public override int Meat{ get{ return 4; } }
|
||||
|
||||
/*
|
||||
// TODO: uncomment once added
|
||||
public override void OnDeath( Container c )
|
||||
{
|
||||
base.OnDeath( c );
|
||||
|
||||
if ( Utility.RandomDouble() < 0.3 )
|
||||
c.DropItem( new GnawsFang() );
|
||||
}
|
||||
*/
|
||||
|
||||
public Gnaw( Serial serial )
|
||||
: base( serial )
|
||||
{
|
||||
}
|
||||
|
||||
public override void Serialize( GenericWriter writer )
|
||||
{
|
||||
base.Serialize( writer );
|
||||
|
||||
writer.Write( (int) 0 ); // version
|
||||
}
|
||||
|
||||
public override void Deserialize( GenericReader reader )
|
||||
{
|
||||
base.Deserialize( reader );
|
||||
|
||||
int version = reader.ReadInt();
|
||||
}
|
||||
}
|
||||
}
|
||||
90
Scripts/Mobiles/Monsters/ML/Twisted Weald/Guile.cs
Normal file
90
Scripts/Mobiles/Monsters/ML/Twisted Weald/Guile.cs
Normal file
|
|
@ -0,0 +1,90 @@
|
|||
using System;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a Guile corpse" )]
|
||||
public class Guile : Changeling
|
||||
{
|
||||
public override string DefaultName{ get{ return "Guile"; } }
|
||||
public override int DefaultHue{ get{ return 0x3F; } }
|
||||
|
||||
[Constructable]
|
||||
public Guile()
|
||||
{
|
||||
IsParagon = true;
|
||||
|
||||
Hue = DefaultHue;
|
||||
|
||||
SetStr( 53, 214 );
|
||||
SetDex( 243, 367 );
|
||||
SetInt( 369, 586 );
|
||||
|
||||
SetHits( 1013, 1058 );
|
||||
SetStam( 243, 367 );
|
||||
SetMana( 369, 586 );
|
||||
|
||||
SetDamage( 14, 20 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 100 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 80, 90 );
|
||||
SetResistance( ResistanceType.Fire, 43, 46 );
|
||||
SetResistance( ResistanceType.Cold, 42, 44 );
|
||||
SetResistance( ResistanceType.Poison, 42, 50 );
|
||||
SetResistance( ResistanceType.Energy, 47, 50 );
|
||||
|
||||
SetSkill( SkillName.Wrestling, 12.8, 16.7 );
|
||||
SetSkill( SkillName.Tactics, 102.6, 131.0 );
|
||||
SetSkill( SkillName.MagicResist, 141.2, 161.6 );
|
||||
SetSkill( SkillName.Magery, 108.4, 120.0 );
|
||||
SetSkill( SkillName.EvalInt, 108.4, 120.0 );
|
||||
SetSkill( SkillName.Meditation, 109.2, 120.0 );
|
||||
|
||||
Fame = 21000;
|
||||
Karma = -21000;
|
||||
}
|
||||
|
||||
public override void OnGaveMeleeAttack( Mobile defender )
|
||||
{
|
||||
base.OnGaveMeleeAttack( defender );
|
||||
|
||||
if ( Utility.RandomBool() )
|
||||
{
|
||||
if ( !Kappa.IsBeingDrained( defender ) && Mana > 14 )
|
||||
{
|
||||
defender.SendLocalizedMessage( 1070848 ); // You feel your life force being stolen away.
|
||||
Kappa.BeginLifeDrain( defender, this );
|
||||
Mana -= 15;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public override bool GivesMLMinorArtifact{ get{ return true; } }
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.UltraRich, 2 );
|
||||
}
|
||||
|
||||
public Guile( Serial serial )
|
||||
: base( serial )
|
||||
{
|
||||
}
|
||||
|
||||
public override void Serialize( GenericWriter writer )
|
||||
{
|
||||
base.Serialize( writer );
|
||||
|
||||
writer.Write( (int) 0 ); // version
|
||||
}
|
||||
|
||||
public override void Deserialize( GenericReader reader )
|
||||
{
|
||||
base.Deserialize( reader );
|
||||
|
||||
int version = reader.ReadInt();
|
||||
}
|
||||
}
|
||||
}
|
||||
89
Scripts/Mobiles/Monsters/ML/Twisted Weald/Irk.cs
Normal file
89
Scripts/Mobiles/Monsters/ML/Twisted Weald/Irk.cs
Normal file
|
|
@ -0,0 +1,89 @@
|
|||
using System;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "an Irk corpse" )]
|
||||
public class Irk : Changeling
|
||||
{
|
||||
public override string DefaultName{ get{ return "Irk"; } }
|
||||
public override int DefaultHue{ get{ return 0x489; } }
|
||||
|
||||
[Constructable]
|
||||
public Irk()
|
||||
{
|
||||
IsParagon = true;
|
||||
|
||||
Hue = DefaultHue;
|
||||
|
||||
SetStr( 23, 183 );
|
||||
SetDex( 259, 360 );
|
||||
SetInt( 374, 600 );
|
||||
|
||||
SetHits( 1006, 1064 );
|
||||
SetStam( 259, 360 );
|
||||
SetMana( 374, 600 );
|
||||
|
||||
SetDamage( 14, 20 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 80, 90 );
|
||||
SetResistance( ResistanceType.Fire, 40, 50 );
|
||||
SetResistance( ResistanceType.Cold, 40, 50 );
|
||||
SetResistance( ResistanceType.Poison, 41, 50 );
|
||||
SetResistance( ResistanceType.Energy, 40, 49 );
|
||||
|
||||
SetSkill( SkillName.Wrestling, 120.3, 123.0 );
|
||||
SetSkill( SkillName.Tactics, 120.1, 131.8 );
|
||||
SetSkill( SkillName.MagicResist, 132.3, 165.8 );
|
||||
SetSkill( SkillName.Magery, 108.9, 119.7 );
|
||||
SetSkill( SkillName.EvalInt, 108.4, 120.0 );
|
||||
SetSkill( SkillName.Meditation, 108.9, 119.1 );
|
||||
|
||||
Fame = 21000;
|
||||
Karma = -21000;
|
||||
}
|
||||
|
||||
// TODO: Angry fire
|
||||
|
||||
public override bool GivesMLMinorArtifact{ get{ return true; } }
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.UltraRich, 2 );
|
||||
}
|
||||
|
||||
/*
|
||||
// TODO: uncomment once added
|
||||
public override void OnDeath( Container c )
|
||||
{
|
||||
base.OnDeath( c );
|
||||
|
||||
if ( Utility.RandomDouble() < 0.25 )
|
||||
c.DropItem( new IrksBrain() );
|
||||
|
||||
if ( Utility.RandomDouble() < 0.025 )
|
||||
c.DropItem( new PaladinGloves() );
|
||||
}
|
||||
*/
|
||||
|
||||
public Irk( Serial serial )
|
||||
: base( serial )
|
||||
{
|
||||
}
|
||||
|
||||
public override void Serialize( GenericWriter writer )
|
||||
{
|
||||
base.Serialize( writer );
|
||||
|
||||
writer.Write( (int) 0 ); // version
|
||||
}
|
||||
|
||||
public override void Deserialize( GenericReader reader )
|
||||
{
|
||||
base.Deserialize( reader );
|
||||
|
||||
int version = reader.ReadInt();
|
||||
}
|
||||
}
|
||||
}
|
||||
95
Scripts/Mobiles/Monsters/ML/Twisted Weald/LadyLissith.cs
Normal file
95
Scripts/Mobiles/Monsters/ML/Twisted Weald/LadyLissith.cs
Normal file
|
|
@ -0,0 +1,95 @@
|
|||
using System;
|
||||
using Server.Items;
|
||||
using Server.Targeting;
|
||||
using System.Collections;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a Lady Lissith corpse" )]
|
||||
public class LadyLissith : GiantBlackWidow
|
||||
{
|
||||
[Constructable]
|
||||
public LadyLissith()
|
||||
{
|
||||
IsParagon = true;
|
||||
|
||||
Name = "Lady Lissith";
|
||||
Hue = 0x452;
|
||||
|
||||
SetStr( 81, 130 );
|
||||
SetDex( 116, 152 );
|
||||
SetInt( 44, 100 );
|
||||
|
||||
SetHits( 245, 375 );
|
||||
SetStam( 116, 152 );
|
||||
SetMana( 44, 100 );
|
||||
|
||||
SetDamage( 15, 22 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 100 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 40, 50 );
|
||||
SetResistance( ResistanceType.Fire, 31, 39 );
|
||||
SetResistance( ResistanceType.Cold, 30, 40 );
|
||||
SetResistance( ResistanceType.Poison, 71, 80 );
|
||||
SetResistance( ResistanceType.Energy, 30, 40 );
|
||||
|
||||
SetSkill( SkillName.Wrestling, 108.6, 123.0 );
|
||||
SetSkill( SkillName.Tactics, 102.7, 119.0 );
|
||||
SetSkill( SkillName.MagicResist, 78.8, 95.6 );
|
||||
SetSkill( SkillName.Anatomy, 68.6, 106.8 );
|
||||
SetSkill( SkillName.Poisoning, 96.6, 112.9 );
|
||||
|
||||
Fame = 18900;
|
||||
Karma = -18900;
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.UltraRich, 2 );
|
||||
}
|
||||
|
||||
public override WeaponAbility GetWeaponAbility()
|
||||
{
|
||||
return WeaponAbility.BleedAttack;
|
||||
}
|
||||
|
||||
/*
|
||||
// TODO: uncomment once added
|
||||
public override void OnDeath( Container c )
|
||||
{
|
||||
base.OnDeath( c );
|
||||
|
||||
if ( Utility.RandomDouble() < 0.025 )
|
||||
c.DropItem( new GreymistChest() );
|
||||
|
||||
if ( Utility.RandomDouble() < 0.45 )
|
||||
c.DropItem( new LissithsSilk() );
|
||||
|
||||
if ( Utility.RandomDouble() < 0.1 )
|
||||
c.DropItem( new ParrotItem() );
|
||||
}
|
||||
*/
|
||||
|
||||
public override bool GivesMLMinorArtifact{ get{ return true; } }
|
||||
|
||||
public LadyLissith( Serial serial )
|
||||
: base( serial )
|
||||
{
|
||||
}
|
||||
|
||||
public override void Serialize( GenericWriter writer )
|
||||
{
|
||||
base.Serialize( writer );
|
||||
|
||||
writer.Write( (int) 0 ); // version
|
||||
}
|
||||
|
||||
public override void Deserialize( GenericReader reader )
|
||||
{
|
||||
base.Deserialize( reader );
|
||||
|
||||
int version = reader.ReadInt();
|
||||
}
|
||||
}
|
||||
}
|
||||
100
Scripts/Mobiles/Monsters/ML/Twisted Weald/LadySabrix.cs
Normal file
100
Scripts/Mobiles/Monsters/ML/Twisted Weald/LadySabrix.cs
Normal file
|
|
@ -0,0 +1,100 @@
|
|||
using System;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a Lady Sabrix corpse" )]
|
||||
public class LadySabrix : GiantBlackWidow
|
||||
{
|
||||
[Constructable]
|
||||
public LadySabrix()
|
||||
{
|
||||
IsParagon = true;
|
||||
|
||||
Name = "Lady Sabrix";
|
||||
Hue = 0x497;
|
||||
|
||||
SetStr( 82, 130 );
|
||||
SetDex( 117, 146 );
|
||||
SetInt( 50, 98 );
|
||||
|
||||
SetHits( 233, 361 );
|
||||
SetStam( 117, 146 );
|
||||
SetMana( 50, 98 );
|
||||
|
||||
SetDamage( 15, 22 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 100 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 40, 50 );
|
||||
SetResistance( ResistanceType.Fire, 30, 40 );
|
||||
SetResistance( ResistanceType.Cold, 30, 39 );
|
||||
SetResistance( ResistanceType.Poison, 70, 80 );
|
||||
SetResistance( ResistanceType.Energy, 35, 44 );
|
||||
|
||||
SetSkill( SkillName.Wrestling, 109.8, 122.8 );
|
||||
SetSkill( SkillName.Tactics, 102.8, 120.0 );
|
||||
SetSkill( SkillName.MagicResist, 79.4, 95.1 );
|
||||
SetSkill( SkillName.Anatomy, 68.8, 105.1 );
|
||||
SetSkill( SkillName.Poisoning, 97.8, 116.7 );
|
||||
|
||||
Fame = 18900;
|
||||
Karma = -18900;
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.UltraRich, 2 );
|
||||
}
|
||||
|
||||
public override WeaponAbility GetWeaponAbility()
|
||||
{
|
||||
return WeaponAbility.ArmorIgnore;
|
||||
}
|
||||
|
||||
/*
|
||||
// TODO: uncomment once added
|
||||
public override void OnDeath( Container c )
|
||||
{
|
||||
base.OnDeath( c );
|
||||
|
||||
if ( Utility.RandomDouble() < 0.2 )
|
||||
c.DropItem( new SabrixsEye() );
|
||||
|
||||
if ( Utility.RandomDouble() < 0.25 )
|
||||
{
|
||||
switch ( Utility.Random( 2 ) )
|
||||
{
|
||||
case 0: AddToBackpack( new PaladinArms() ); break;
|
||||
case 1: AddToBackpack( new HunterLegs() ); break;
|
||||
}
|
||||
}
|
||||
|
||||
if ( Utility.RandomDouble() < 0.1 )
|
||||
c.DropItem( new ParrotItem() );
|
||||
}
|
||||
*/
|
||||
|
||||
public override bool GivesMLMinorArtifact{ get{ return true; } }
|
||||
|
||||
public LadySabrix( Serial serial )
|
||||
: base( serial )
|
||||
{
|
||||
}
|
||||
|
||||
public override void Serialize( GenericWriter writer )
|
||||
{
|
||||
base.Serialize( writer );
|
||||
|
||||
writer.Write( (int) 0 ); // version
|
||||
}
|
||||
|
||||
public override void Deserialize( GenericReader reader )
|
||||
{
|
||||
base.Deserialize( reader );
|
||||
|
||||
int version = reader.ReadInt();
|
||||
}
|
||||
}
|
||||
}
|
||||
85
Scripts/Mobiles/Monsters/ML/Twisted Weald/Malefic.cs
Normal file
85
Scripts/Mobiles/Monsters/ML/Twisted Weald/Malefic.cs
Normal file
|
|
@ -0,0 +1,85 @@
|
|||
using System;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a Malefic corpse" )]
|
||||
public class Malefic : DreadSpider
|
||||
{
|
||||
[Constructable]
|
||||
public Malefic()
|
||||
{
|
||||
IsParagon = true;
|
||||
|
||||
Name = "Malefic";
|
||||
Hue = 0x455;
|
||||
|
||||
SetStr( 210, 284 );
|
||||
SetDex( 153, 197 );
|
||||
SetInt( 349, 390 );
|
||||
|
||||
SetHits( 600, 747 );
|
||||
SetStam( 153, 197 );
|
||||
SetMana( 349, 390 );
|
||||
|
||||
SetDamage( 15, 22 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 20 );
|
||||
SetDamageType( ResistanceType.Poison, 80 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 60, 70 );
|
||||
SetResistance( ResistanceType.Fire, 40, 50 );
|
||||
SetResistance( ResistanceType.Cold, 40, 49 );
|
||||
SetResistance( ResistanceType.Poison, 100 );
|
||||
SetResistance( ResistanceType.Energy, 41, 48 );
|
||||
|
||||
SetSkill( SkillName.Wrestling, 96.9, 112.4 );
|
||||
SetSkill( SkillName.Tactics, 91.3, 105.4 );
|
||||
SetSkill( SkillName.MagicResist, 79.8, 95.1 );
|
||||
SetSkill( SkillName.Magery, 103.0, 118.6 );
|
||||
SetSkill( SkillName.EvalInt, 105.7, 119.6 );
|
||||
SetSkill( SkillName.Meditation, 0 );
|
||||
|
||||
Fame = 21000;
|
||||
Karma = -21000;
|
||||
|
||||
/*
|
||||
// TODO: uncomment once added
|
||||
if ( Utility.RandomDouble() < 0.1 )
|
||||
PackItem( new ParrotItem() );
|
||||
*/
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.UltraRich, 3 );
|
||||
}
|
||||
|
||||
public override WeaponAbility GetWeaponAbility()
|
||||
{
|
||||
return WeaponAbility.Dismount;
|
||||
}
|
||||
|
||||
public override bool GivesMLMinorArtifact{ get{ return true; } }
|
||||
|
||||
public Malefic( Serial serial )
|
||||
: base( serial )
|
||||
{
|
||||
}
|
||||
|
||||
public override void Serialize( GenericWriter writer )
|
||||
{
|
||||
base.Serialize( writer );
|
||||
|
||||
writer.Write( (int) 0 ); // version
|
||||
}
|
||||
|
||||
public override void Deserialize( GenericReader reader )
|
||||
{
|
||||
base.Deserialize( reader );
|
||||
|
||||
int version = reader.ReadInt();
|
||||
}
|
||||
}
|
||||
}
|
||||
77
Scripts/Mobiles/Monsters/ML/Twisted Weald/Silk.cs
Normal file
77
Scripts/Mobiles/Monsters/ML/Twisted Weald/Silk.cs
Normal file
|
|
@ -0,0 +1,77 @@
|
|||
using System;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a Silk corpse" )]
|
||||
public class Silk : GiantBlackWidow
|
||||
{
|
||||
[Constructable]
|
||||
public Silk()
|
||||
{
|
||||
IsParagon = true;
|
||||
|
||||
Name = "Silk";
|
||||
Hue = 0x47E;
|
||||
|
||||
SetStr( 80, 131 );
|
||||
SetDex( 126, 156 );
|
||||
SetInt( 63, 102 );
|
||||
|
||||
SetHits( 279, 378 );
|
||||
SetStam( 126, 156 );
|
||||
SetMana( 63, 102 );
|
||||
|
||||
SetDamage( 15, 22 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 100 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 40, 50 );
|
||||
SetResistance( ResistanceType.Fire, 30, 39 );
|
||||
SetResistance( ResistanceType.Cold, 30, 40 );
|
||||
SetResistance( ResistanceType.Poison, 70, 76 );
|
||||
SetResistance( ResistanceType.Energy, 30, 40 );
|
||||
|
||||
SetSkill( SkillName.Wrestling, 114.1, 123.7 );
|
||||
SetSkill( SkillName.Tactics, 102.6, 118.3 );
|
||||
SetSkill( SkillName.MagicResist, 78.6, 94.8 );
|
||||
SetSkill( SkillName.Anatomy, 81.3, 105.7 );
|
||||
SetSkill( SkillName.Poisoning, 106.0, 119.2 );
|
||||
|
||||
Fame = 18900;
|
||||
Karma = -18900;
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.UltraRich, 2 );
|
||||
}
|
||||
|
||||
public override WeaponAbility GetWeaponAbility()
|
||||
{
|
||||
return WeaponAbility.ParalyzingBlow;
|
||||
}
|
||||
|
||||
public override bool GivesMLMinorArtifact{ get{ return true; } }
|
||||
|
||||
public Silk( Serial serial )
|
||||
: base( serial )
|
||||
{
|
||||
}
|
||||
|
||||
public override void Serialize( GenericWriter writer )
|
||||
{
|
||||
base.Serialize( writer );
|
||||
|
||||
writer.Write( (int) 0 ); // version
|
||||
}
|
||||
|
||||
public override void Deserialize( GenericReader reader )
|
||||
{
|
||||
base.Deserialize( reader );
|
||||
|
||||
int version = reader.ReadInt();
|
||||
}
|
||||
}
|
||||
}
|
||||
75
Scripts/Mobiles/Monsters/ML/Twisted Weald/Spite.cs
Normal file
75
Scripts/Mobiles/Monsters/ML/Twisted Weald/Spite.cs
Normal file
|
|
@ -0,0 +1,75 @@
|
|||
using System;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a Spite corpse" )]
|
||||
public class Spite : Changeling
|
||||
{
|
||||
public override string DefaultName{ get{ return "Spite"; } }
|
||||
public override int DefaultHue{ get{ return 0x21; } }
|
||||
|
||||
[Constructable]
|
||||
public Spite()
|
||||
{
|
||||
IsParagon = true;
|
||||
|
||||
Hue = DefaultHue;
|
||||
|
||||
SetStr( 53, 214 );
|
||||
SetDex( 243, 367 );
|
||||
SetInt( 369, 586 );
|
||||
|
||||
SetHits( 1013, 1052 );
|
||||
SetStam( 243, 367 );
|
||||
SetMana( 369, 586 );
|
||||
|
||||
SetDamage( 14, 20 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 100 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 85, 90 );
|
||||
SetResistance( ResistanceType.Fire, 41, 46 );
|
||||
SetResistance( ResistanceType.Cold, 40, 44 );
|
||||
SetResistance( ResistanceType.Poison, 42, 46 );
|
||||
SetResistance( ResistanceType.Energy, 45, 47 );
|
||||
|
||||
SetSkill( SkillName.Wrestling, 12.8, 16.7 );
|
||||
SetSkill( SkillName.Tactics, 102.6, 131.0 );
|
||||
SetSkill( SkillName.MagicResist, 141.2, 161.6 );
|
||||
SetSkill( SkillName.Magery, 108.4, 119.2 );
|
||||
SetSkill( SkillName.EvalInt, 108.4, 120.0 );
|
||||
SetSkill( SkillName.Meditation, 109.2, 120.0 );
|
||||
|
||||
Fame = 21000;
|
||||
Karma = -21000;
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.UltraRich, 2 );
|
||||
}
|
||||
|
||||
public override bool GivesMLMinorArtifact{ get{ return true; } }
|
||||
|
||||
public Spite( Serial serial )
|
||||
: base( serial )
|
||||
{
|
||||
}
|
||||
|
||||
public override void Serialize( GenericWriter writer )
|
||||
{
|
||||
base.Serialize( writer );
|
||||
|
||||
writer.Write( (int) 0 ); // version
|
||||
}
|
||||
|
||||
public override void Deserialize( GenericReader reader )
|
||||
{
|
||||
base.Deserialize( reader );
|
||||
|
||||
int version = reader.ReadInt();
|
||||
}
|
||||
}
|
||||
}
|
||||
171
Scripts/Mobiles/Monsters/ML/Twisted Weald/Swoop.cs
Normal file
171
Scripts/Mobiles/Monsters/ML/Twisted Weald/Swoop.cs
Normal file
|
|
@ -0,0 +1,171 @@
|
|||
using System;
|
||||
using System.Collections;
|
||||
using Server.Items;
|
||||
using Server.Mobiles;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a Swoop corpse" )]
|
||||
public class Swoop : Eagle
|
||||
{
|
||||
[Constructable]
|
||||
public Swoop()
|
||||
{
|
||||
IsParagon = true;
|
||||
|
||||
Name = "Swoop";
|
||||
Hue = 0xE0;
|
||||
|
||||
AI = AIType.AI_Melee;
|
||||
|
||||
SetStr( 100, 150 );
|
||||
SetDex( 400, 500 );
|
||||
SetInt( 80, 90 );
|
||||
|
||||
SetHits( 1500, 2000 );
|
||||
|
||||
SetDamage( 20, 30 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 100 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 75, 90 );
|
||||
SetResistance( ResistanceType.Fire, 60, 77 );
|
||||
SetResistance( ResistanceType.Cold, 70, 85 );
|
||||
SetResistance( ResistanceType.Poison, 55, 85 );
|
||||
SetResistance( ResistanceType.Energy, 50, 60 );
|
||||
|
||||
SetSkill( SkillName.Wrestling, 120.0, 140.0 );
|
||||
SetSkill( SkillName.Tactics, 120.0, 140.0 );
|
||||
SetSkill( SkillName.MagicResist, 95.0, 105.0 );
|
||||
|
||||
Fame = 18000;
|
||||
Karma = 0;
|
||||
|
||||
PackReg( 4 );
|
||||
PackArcaneScroll( 0, 1 );
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.UltraRich, 2 );
|
||||
}
|
||||
|
||||
// TODO: Put this attack shared with Hiryu and Lesser Hiryu in one place
|
||||
public override void OnGaveMeleeAttack( Mobile defender )
|
||||
{
|
||||
base.OnGaveMeleeAttack( defender );
|
||||
|
||||
if( 0.1 > Utility.RandomDouble() )
|
||||
{
|
||||
ExpireTimer timer = (ExpireTimer)m_Table[defender];
|
||||
|
||||
if( timer != null )
|
||||
{
|
||||
timer.DoExpire();
|
||||
defender.SendLocalizedMessage( 1070837 ); // The creature lands another blow in your weakened state.
|
||||
}
|
||||
else
|
||||
defender.SendLocalizedMessage( 1070836 ); // The blow from the creature's claws has made you more susceptible to physical attacks.
|
||||
|
||||
int effect = -(defender.PhysicalResistance * 15 / 100);
|
||||
|
||||
ResistanceMod mod = new ResistanceMod( ResistanceType.Physical, effect );
|
||||
|
||||
defender.FixedEffect( 0x37B9, 10, 5 );
|
||||
defender.AddResistanceMod( mod );
|
||||
|
||||
timer = new ExpireTimer( defender, mod, TimeSpan.FromSeconds( 5.0 ) );
|
||||
timer.Start();
|
||||
m_Table[defender] = timer;
|
||||
}
|
||||
}
|
||||
|
||||
private static Hashtable m_Table = new Hashtable();
|
||||
|
||||
private class ExpireTimer : Timer
|
||||
{
|
||||
private Mobile m_Mobile;
|
||||
private ResistanceMod m_Mod;
|
||||
|
||||
public ExpireTimer( Mobile m, ResistanceMod mod, TimeSpan delay )
|
||||
: base( delay )
|
||||
{
|
||||
m_Mobile = m;
|
||||
m_Mod = mod;
|
||||
Priority = TimerPriority.TwoFiftyMS;
|
||||
}
|
||||
|
||||
public void DoExpire()
|
||||
{
|
||||
m_Mobile.RemoveResistanceMod( m_Mod );
|
||||
Stop();
|
||||
m_Table.Remove( m_Mobile );
|
||||
}
|
||||
|
||||
protected override void OnTick()
|
||||
{
|
||||
m_Mobile.SendLocalizedMessage( 1070838 ); // Your resistance to physical attacks has returned.
|
||||
DoExpire();
|
||||
}
|
||||
}
|
||||
|
||||
public override bool CanFly { get { return true; } }
|
||||
public override bool GivesMLMinorArtifact{ get{ return true; } }
|
||||
public override int Feathers{ get{ return 72; } }
|
||||
|
||||
/*
|
||||
// TODO: uncomment once added
|
||||
public override void OnDeath( Container c )
|
||||
{
|
||||
base.OnDeath( c );
|
||||
|
||||
if ( Utility.RandomDouble() < 0.025 )
|
||||
{
|
||||
switch ( Utility.Random( 18 ) )
|
||||
{
|
||||
case 0: c.DropItem( new AssassinChest() ); break;
|
||||
case 1: c.DropItem( new AssassinArms() ); break;
|
||||
case 2: c.DropItem( new DeathChest() ); break;
|
||||
case 3: c.DropItem( new MyrmidonArms() ); break;
|
||||
case 4: c.DropItem( new MyrmidonLegs() ); break;
|
||||
case 5: c.DropItem( new MyrmidonGorget() ); break;
|
||||
case 6: c.DropItem( new LeafweaveGloves() ); break;
|
||||
case 7: c.DropItem( new LeafweaveLegs() ); break;
|
||||
case 8: c.DropItem( new LeafweavePauldrons() ); break;
|
||||
case 9: c.DropItem( new PaladinGloves() ); break;
|
||||
case 10: c.DropItem( new PaladinGorget() ); break;
|
||||
case 11: c.DropItem( new PaladinArms() ); break;
|
||||
case 12: c.DropItem( new HunterArms() ); break;
|
||||
case 13: c.DropItem( new HunterGloves() ); break;
|
||||
case 14: c.DropItem( new HunterLegs() ); break;
|
||||
case 15: c.DropItem( new HunterChest() ); break;
|
||||
case 16: c.DropItem( new GreymistArms() ); break;
|
||||
case 17: c.DropItem( new GreymistGloves() ); break;
|
||||
}
|
||||
}
|
||||
|
||||
if ( Utility.RandomDouble() < 0.1 )
|
||||
c.DropItem( new ParrotItem() );
|
||||
}
|
||||
*/
|
||||
|
||||
public Swoop( Serial serial )
|
||||
: base( serial )
|
||||
{
|
||||
}
|
||||
|
||||
public override void Serialize( GenericWriter writer )
|
||||
{
|
||||
base.Serialize( writer );
|
||||
|
||||
writer.Write( (int) 0 ); // version
|
||||
}
|
||||
|
||||
public override void Deserialize( GenericReader reader )
|
||||
{
|
||||
base.Deserialize( reader );
|
||||
|
||||
int version = reader.ReadInt();
|
||||
}
|
||||
}
|
||||
}
|
||||
99
Scripts/Mobiles/Monsters/ML/Twisted Weald/Virulent.cs
Normal file
99
Scripts/Mobiles/Monsters/ML/Twisted Weald/Virulent.cs
Normal file
|
|
@ -0,0 +1,99 @@
|
|||
using System;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
[CorpseName( "a Virulent corpse" )]
|
||||
public class Virulent : DreadSpider
|
||||
{
|
||||
[Constructable]
|
||||
public Virulent()
|
||||
{
|
||||
IsParagon = true;
|
||||
|
||||
Name = "Virulent";
|
||||
Hue = 0x8FD;
|
||||
|
||||
SetStr( 207, 252 );
|
||||
SetDex( 156, 194 );
|
||||
SetInt( 346, 398 );
|
||||
|
||||
SetHits( 616, 740 );
|
||||
SetStam( 156, 194 );
|
||||
SetMana( 346, 398 );
|
||||
|
||||
SetDamage( 15, 22 );
|
||||
|
||||
SetDamageType( ResistanceType.Physical, 20 );
|
||||
SetDamageType( ResistanceType.Poison, 80 );
|
||||
|
||||
SetResistance( ResistanceType.Physical, 60, 68 );
|
||||
SetResistance( ResistanceType.Fire, 40, 49 );
|
||||
SetResistance( ResistanceType.Cold, 41, 50 );
|
||||
SetResistance( ResistanceType.Poison, 100 );
|
||||
SetResistance( ResistanceType.Energy, 40, 49 );
|
||||
|
||||
SetSkill( SkillName.Wrestling, 92.8, 111.7 );
|
||||
SetSkill( SkillName.Tactics, 91.6, 107.4 );
|
||||
SetSkill( SkillName.MagicResist, 78.1, 93.3 );
|
||||
SetSkill( SkillName.Poisoning, 120.0 );
|
||||
SetSkill( SkillName.Magery, 104.2, 119.8 );
|
||||
SetSkill( SkillName.EvalInt, 102.8, 117.8 );
|
||||
|
||||
Fame = 21000;
|
||||
Karma = -21000;
|
||||
}
|
||||
|
||||
public override void GenerateLoot()
|
||||
{
|
||||
AddLoot( LootPack.UltraRich, 3 );
|
||||
}
|
||||
|
||||
public override WeaponAbility GetWeaponAbility()
|
||||
{
|
||||
return WeaponAbility.MortalStrike;
|
||||
}
|
||||
|
||||
/*
|
||||
// TODO: uncomment once added
|
||||
public override void OnDeath( Container c )
|
||||
{
|
||||
base.OnDeath( c );
|
||||
|
||||
if ( Utility.RandomDouble() < 0.025 )
|
||||
{
|
||||
switch ( Utility.Random( 2 ) )
|
||||
{
|
||||
case 0: c.DropItem( new HunterLegs() ); break;
|
||||
case 1: c.DropItem( new MalekisHonor() ); break;
|
||||
}
|
||||
}
|
||||
|
||||
if ( Utility.RandomDouble() < 0.1 )
|
||||
c.DropItem( new ParrotItem() );
|
||||
}
|
||||
*/
|
||||
|
||||
public override bool GivesMLMinorArtifact{ get{ return true; } }
|
||||
|
||||
public Virulent( Serial serial )
|
||||
: base( serial )
|
||||
{
|
||||
}
|
||||
|
||||
public override void Serialize( GenericWriter writer )
|
||||
{
|
||||
base.Serialize( writer );
|
||||
|
||||
writer.Write( (int) 0 ); // version
|
||||
}
|
||||
|
||||
public override void Deserialize( GenericReader reader )
|
||||
{
|
||||
base.Deserialize( reader );
|
||||
|
||||
int version = reader.ReadInt();
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue