#W# Source and Scripts added. Added Scripts/Settings.cs to expose some basic tweak able settings.

This commit is contained in:
WarrentyExpired 2026-08-06 11:06:05 -04:00
parent b51c58f514
commit 3045c83799
3512 changed files with 627673 additions and 0 deletions

View 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";
}
}
}

View 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;
}
}
}

View 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();
}
}
}

View 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();
}
}
}

View 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();
}
}
}

View 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();
}
}
}

View 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();
}
}
}

View 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();
}
}
}

View 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();
}
}
}

View 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();
}
}
}

View 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();
}
}
}

View 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();
}
}
}

View 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();
}
}
}

View 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();
}
}
}

View 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();
}
}
}

View 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();
}
}
}

View 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();
}
}
}

View 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();
}
}
}

View 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();
}
}
}

View 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;
}
}*/
}
}

View 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();
}
}
}

View 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();
}
}
}

View 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();
}
}
}

View 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();
}
}
}

View file

@ -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();
}
}
}

View 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();
}
}
}

View 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();
}
}
}

View 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();
}
}
}

View file

@ -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();
}
}
}

View file

@ -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();
}
}
}

View 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();
}
}
}

View 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();
}
}
}

View 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();
}
}
}

View 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();
}
}
}

View 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
}
}
}
}

View 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();
}
}
}

View 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();
}
}
}

View 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();
}
}
}

View 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();
}
}
}

View file

@ -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();
}
}
}

View 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();
}
}
}

View 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();
}
}
}

View file

@ -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();
}
}
}

View file

@ -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();
}
}
}

View 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();
}
}
}

View 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();
}
}
}

View file

@ -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();
}
}
}

View 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();
}
}
}

View 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();
}
}
}

View 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();
}
}
}

View 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();
}
}
}

View 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();
}
}
}

View 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;
}
}
}

View 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
}
}

View 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();
}
}
}

View 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();
}
}
}
}

View 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();
}
}
}

View 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();
}
}
}

View 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();
}
}
}

View 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();
}
}
}

View 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();
}
}
}

View 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();
}
}
}

View 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();
}
}
}

View 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();
}
}
}

View 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();
}
}
}

View 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();
}
}
}