#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,92 @@
using System;
using Server;
using Server.Items;
namespace Server.Mobiles
{
[CorpseName( "an abyssmal horror corpse" )]
public class AbysmalHorror : BaseCreature
{
public override WeaponAbility GetWeaponAbility()
{
return Utility.RandomBool() ? WeaponAbility.MortalStrike : WeaponAbility.WhirlwindAttack;
}
public override bool IgnoreYoungProtection { get { return Core.ML; } }
[Constructable]
public AbysmalHorror() : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "an abyssmal horror";
Body = 312;
BaseSoundID = 0x451;
SetStr( 401, 420 );
SetDex( 81, 90 );
SetInt( 401, 420 );
SetHits( 6000 );
SetDamage( 13, 17 );
SetDamageType( ResistanceType.Physical, 50 );
SetDamageType( ResistanceType.Poison, 50 );
SetResistance( ResistanceType.Physical, 30, 35 );
SetResistance( ResistanceType.Fire, 100 );
SetResistance( ResistanceType.Cold, 50, 55 );
SetResistance( ResistanceType.Poison, 60, 65 );
SetResistance( ResistanceType.Energy, 77, 80 );
SetSkill( SkillName.EvalInt, 200.0 );
SetSkill( SkillName.Magery, 112.6, 117.5 );
SetSkill( SkillName.Meditation, 200.0 );
SetSkill( SkillName.MagicResist, 117.6, 120.0 );
SetSkill( SkillName.Tactics, 100.0 );
SetSkill( SkillName.Wrestling, 84.1, 88.0 );
Fame = 26000;
Karma = -26000;
VirtualArmor = 54;
}
public override void GenerateLoot()
{
AddLoot( LootPack.UltraRich, 2 );
}
public override void OnDeath( Container c )
{
base.OnDeath( c );
if ( !Summoned && !NoKillAwards && DemonKnight.CheckArtifactChance( this ) )
DemonKnight.DistributeArtifact( this );
}
public override bool BardImmune{ get{ return !Core.SE; } }
public override bool Unprovokable{ get{ return Core.SE; } }
public override bool AreaPeaceImmune { get { return Core.SE; } }
public override Poison PoisonImmune{ get{ return Poison.Lethal; } }
public override int TreasureMapLevel{ get{ return 1; } }
public AbysmalHorror( 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();
if ( BaseSoundID == 357 )
BaseSoundID = 0x451;
}
}
}

View file

@ -0,0 +1,75 @@
using System;
using Server;
using Server.Items;
namespace Server.Mobiles
{
[CorpseName( "a bone demon corpse" )]
public class BoneDemon : BaseCreature
{
[Constructable]
public BoneDemon() : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "a bone demon";
Body = 308;
BaseSoundID = 0x48D;
SetStr( 1000 );
SetDex( 151, 175 );
SetInt( 171, 220 );
SetHits( 3600 );
SetDamage( 34, 36 );
SetDamageType( ResistanceType.Physical, 50 );
SetDamageType( ResistanceType.Cold, 50 );
SetResistance( ResistanceType.Physical, 75 );
SetResistance( ResistanceType.Fire, 60 );
SetResistance( ResistanceType.Cold, 90 );
SetResistance( ResistanceType.Poison, 100 );
SetResistance( ResistanceType.Energy, 60 );
SetSkill( SkillName.DetectHidden, 80.0 );
SetSkill( SkillName.EvalInt, 77.6, 87.5 );
SetSkill( SkillName.Magery, 77.6, 87.5 );
SetSkill( SkillName.Meditation, 100.0 );
SetSkill( SkillName.MagicResist, 50.1, 75.0 );
SetSkill( SkillName.Tactics, 100.0 );
SetSkill( SkillName.Wrestling, 100.0 );
Fame = 20000;
Karma = -20000;
VirtualArmor = 44;
}
public override void GenerateLoot()
{
AddLoot( LootPack.FilthyRich, 8 );
}
public override bool BardImmune { get { return !Core.SE; } }
public override bool Unprovokable { get { return Core.SE; } }
public override bool AreaPeaceImmune { get { return Core.SE; } }
public override Poison PoisonImmune{ get{ return Poison.Lethal; } }
public override int TreasureMapLevel{ get{ return 1; } }
public BoneDemon( 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;
using Server.Items;
namespace Server.Mobiles
{
[CorpseName( "a crystal elemental corpse" )]
public class CrystalElemental : BaseCreature
{
public override WeaponAbility GetWeaponAbility()
{
return WeaponAbility.BleedAttack;
}
[Constructable]
public CrystalElemental() : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "a crystal elemental";
Body = 300;
BaseSoundID = 278;
SetStr( 136, 160 );
SetDex( 51, 65 );
SetInt( 86, 110 );
SetHits( 150 );
SetDamage( 10, 15 );
SetDamageType( ResistanceType.Physical, 80 );
SetDamageType( ResistanceType.Energy, 20 );
SetResistance( ResistanceType.Physical, 50, 60 );
SetResistance( ResistanceType.Fire, 40, 50 );
SetResistance( ResistanceType.Cold, 40, 50 );
SetResistance( ResistanceType.Poison, 100 );
SetResistance( ResistanceType.Energy, 55, 70 );
SetSkill( SkillName.EvalInt, 70.1, 75.0 );
SetSkill( SkillName.Magery, 70.1, 75.0 );
SetSkill( SkillName.Meditation, 65.1, 75.0 );
SetSkill( SkillName.MagicResist, 80.1, 90.0 );
SetSkill( SkillName.Tactics, 75.1, 85.0 );
SetSkill( SkillName.Wrestling, 65.1, 75.0 );
Fame = 6500;
Karma = -6500;
VirtualArmor = 54;
}
public override void GenerateLoot()
{
AddLoot( LootPack.Rich );
AddLoot( LootPack.Average );
}
public override bool BleedImmune{ get{ return true; } }
public override Poison PoisonImmune{ get{ return Poison.Lethal; } }
public override int TreasureMapLevel{ get{ return 1; } }
public CrystalElemental( 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,94 @@
using System;
using Server;
using Server.Items;
namespace Server.Mobiles
{
[CorpseName( "a darknight creeper corpse" )]
public class DarknightCreeper : BaseCreature
{
public override bool IgnoreYoungProtection { get { return Core.ML; } }
[Constructable]
public DarknightCreeper() : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = NameList.RandomName( "darknight creeper" );
Body = 313;
BaseSoundID = 0xE0;
SetStr( 301, 330 );
SetDex( 101, 110 );
SetInt( 301, 330 );
SetHits( 4000 );
SetDamage( 22, 26 );
SetDamageType( ResistanceType.Physical, 85 );
SetDamageType( ResistanceType.Poison, 15 );
SetResistance( ResistanceType.Physical, 60 );
SetResistance( ResistanceType.Fire, 60 );
SetResistance( ResistanceType.Cold, 100 );
SetResistance( ResistanceType.Poison, 90 );
SetResistance( ResistanceType.Energy, 75 );
SetSkill( SkillName.DetectHidden, 80.0 );
SetSkill( SkillName.EvalInt, 118.1, 120.0 );
SetSkill( SkillName.Magery, 112.6, 120.0 );
SetSkill( SkillName.Meditation, 150.0 );
SetSkill( SkillName.Poisoning, 120.0 );
SetSkill( SkillName.MagicResist, 90.1, 90.9 );
SetSkill( SkillName.Tactics, 100.0 );
SetSkill( SkillName.Wrestling, 90.1, 90.9 );
SetSkill( SkillName.Necromancy, 120.1, 130.0 );
SetSkill( SkillName.SpiritSpeak, 120.1, 130.0 );
Fame = 22000;
Karma = -22000;
VirtualArmor = 34;
}
public override void GenerateLoot()
{
AddLoot( LootPack.UltraRich, 2 );
}
public override void OnDeath( Container c )
{
base.OnDeath( c );
if ( !Summoned && !NoKillAwards && DemonKnight.CheckArtifactChance( this ) )
DemonKnight.DistributeArtifact( this );
}
public override bool BardImmune{ get{ return !Core.SE; } }
public override bool Unprovokable{ get{ return Core.SE; } }
public override bool AreaPeaceImmune { get { return Core.SE; } }
public override bool BleedImmune{ get{ return true; } }
public override Poison PoisonImmune{ get{ return Poison.Lethal; } }
public override Poison HitPoison{ get{ return Poison.Lethal; } }
public override int TreasureMapLevel{ get{ return 1; } }
public DarknightCreeper( 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();
if ( BaseSoundID == 471 )
BaseSoundID = 0xE0;
}
}
}

View file

@ -0,0 +1,293 @@
using System;
using System.Collections;
using System.Collections.Generic;
using Server;
using Server.Items;
namespace Server.Mobiles
{
[CorpseName( "a demon knight corpse" )]
public class DemonKnight : BaseCreature
{
public override bool IgnoreYoungProtection { get { return Core.ML; } }
public static Type[] ArtifactRarity10 { get { return m_ArtifactRarity10; } }
public static Type[] ArtifactRarity11 { get { return m_ArtifactRarity11; } }
private static Type[] m_ArtifactRarity10 = new Type[]
{
typeof( LegacyOfTheDreadLord ),
typeof( TheTaskmaster )
};
private static Type[] m_ArtifactRarity11 = new Type[]
{
typeof( TheDragonSlayer ),
typeof( ArmorOfFortune ),
typeof( GauntletsOfNobility ),
typeof( HelmOfInsight ),
typeof( HolyKnightsBreastplate ),
typeof( JackalsCollar ),
typeof( LeggingsOfBane ),
typeof( MidnightBracers ),
typeof( OrnateCrownOfTheHarrower ),
typeof( ShadowDancerLeggings ),
typeof( TunicOfFire ),
typeof( VoiceOfTheFallenKing ),
typeof( BraceletOfHealth ),
typeof( OrnamentOfTheMagician ),
typeof( RingOfTheElements ),
typeof( RingOfTheVile ),
typeof( Aegis ),
typeof( ArcaneShield ),
typeof( AxeOfTheHeavens ),
typeof( BladeOfInsanity ),
typeof( BoneCrusher ),
typeof( BreathOfTheDead ),
typeof( Frostbringer ),
typeof( SerpentsFang ),
typeof( StaffOfTheMagi ),
typeof( TheBeserkersMaul ),
typeof( TheDryadBow ),
typeof( DivineCountenance ),
typeof( HatOfTheMagi ),
typeof( HuntersHeaddress ),
typeof( SpiritOfTheTotem )
};
public static Item CreateRandomArtifact()
{
if ( !Core.AOS )
return null;
int count = ( m_ArtifactRarity10.Length * 5 ) + ( m_ArtifactRarity11.Length * 4 );
int random = Utility.Random( count );
Type type;
if ( random < ( m_ArtifactRarity10.Length * 5 ) )
{
type = m_ArtifactRarity10[random / 5];
}
else
{
random -= m_ArtifactRarity10.Length * 5;
type = m_ArtifactRarity11[random / 4];
}
return Loot.Construct( type );
}
public static Mobile FindRandomPlayer( BaseCreature creature )
{
List<DamageStore> rights = BaseCreature.GetLootingRights( creature.DamageEntries, creature.HitsMax );
for ( int i = rights.Count - 1; i >= 0; --i )
{
DamageStore ds = rights[i];
if ( !ds.m_HasRight )
rights.RemoveAt( i );
}
if ( rights.Count > 0 )
return rights[Utility.Random( rights.Count )].m_Mobile;
return null;
}
public static void DistributeArtifact( BaseCreature creature )
{
DistributeArtifact( creature, CreateRandomArtifact() );
}
public static void DistributeArtifact( BaseCreature creature, Item artifact )
{
DistributeArtifact( FindRandomPlayer( creature ), artifact );
}
public static void DistributeArtifact( Mobile to )
{
DistributeArtifact( to, CreateRandomArtifact() );
}
public static void DistributeArtifact( Mobile to, Item artifact )
{
if ( to == null || artifact == null )
return;
Container pack = to.Backpack;
if ( pack == null || !pack.TryDropItem( to, artifact, false ) )
to.BankBox.DropItem( artifact );
to.SendLocalizedMessage( 1062317 ); // For your valor in combating the fallen beast, a special artifact has been bestowed on you.
}
public static int GetArtifactChance( Mobile boss )
{
if ( !Core.AOS )
return 0;
int luck = LootPack.GetLuckChanceForKiller( boss );
int chance;
if ( boss is DemonKnight )
chance = 1500 + (luck / 5);
else
chance = 750 + (luck / 10);
return chance;
}
public static bool CheckArtifactChance( Mobile boss )
{
return GetArtifactChance( boss ) > Utility.Random( 100000 );
}
public override WeaponAbility GetWeaponAbility()
{
switch ( Utility.Random( 3 ) )
{
default:
case 0: return WeaponAbility.DoubleStrike;
case 1: return WeaponAbility.WhirlwindAttack;
case 2: return WeaponAbility.CrushingBlow;
}
}
public override void OnDeath( Container c )
{
base.OnDeath( c );
if ( !Summoned && !NoKillAwards && DemonKnight.CheckArtifactChance( this ) )
DemonKnight.DistributeArtifact( this );
}
[Constructable]
public DemonKnight() : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = NameList.RandomName( "demon knight" );
Title = "the Dark Father";
Body = 318;
BaseSoundID = 0x165;
SetStr( 500 );
SetDex( 100 );
SetInt( 1000 );
SetHits( 30000 );
SetMana( 5000 );
SetDamage( 17, 21 );
SetDamageType( ResistanceType.Physical, 20 );
SetDamageType( ResistanceType.Fire, 20 );
SetDamageType( ResistanceType.Cold, 20 );
SetDamageType( ResistanceType.Poison, 20 );
SetDamageType( ResistanceType.Energy, 20 );
SetResistance( ResistanceType.Physical, 30 );
SetResistance( ResistanceType.Fire, 30 );
SetResistance( ResistanceType.Cold, 30 );
SetResistance( ResistanceType.Poison, 30 );
SetResistance( ResistanceType.Energy, 30 );
SetSkill( SkillName.Necromancy, 120, 120.0 );
SetSkill( SkillName.SpiritSpeak, 120.0, 120.0 );
SetSkill( SkillName.DetectHidden, 80.0 );
SetSkill( SkillName.EvalInt, 100.0 );
SetSkill( SkillName.Magery, 100.0 );
SetSkill( SkillName.Meditation, 120.0 );
SetSkill( SkillName.MagicResist, 150.0 );
SetSkill( SkillName.Tactics, 100.0 );
SetSkill( SkillName.Wrestling, 120.0 );
Fame = 28000;
Karma = -28000;
VirtualArmor = 64;
}
public override void GenerateLoot()
{
AddLoot( LootPack.SuperBoss, 2 );
AddLoot( LootPack.HighScrolls, Utility.RandomMinMax( 6, 60 ) );
}
public override bool BardImmune{ get{ return !Core.SE; } }
public override bool Unprovokable{ get{ return Core.SE; } }
public override bool AreaPeaceImmune { get { return Core.SE; } }
public override Poison PoisonImmune{ get{ return Poison.Lethal; } }
public override int TreasureMapLevel{ get{ return 1; } }
private static bool m_InHere;
public override void OnDamage( int amount, Mobile from, bool willKill )
{
if ( from != null && from != this && !m_InHere )
{
m_InHere = true;
AOS.Damage( from, this, Utility.RandomMinMax( 8, 20 ), 100, 0, 0, 0, 0 );
MovingEffect( from, 0xECA, 10, 0, false, false, 0, 0 );
PlaySound( 0x491 );
if ( 0.05 > Utility.RandomDouble() )
Timer.DelayCall( TimeSpan.FromSeconds( 1.0 ), new TimerStateCallback( CreateBones_Callback ), from );
m_InHere = false;
}
}
public virtual void CreateBones_Callback( object state )
{
Mobile from = (Mobile)state;
Map map = from.Map;
if ( map == null )
return;
int count = Utility.RandomMinMax( 1, 3 );
for ( int i = 0; i < count; ++i )
{
int x = from.X + Utility.RandomMinMax( -1, 1 );
int y = from.Y + Utility.RandomMinMax( -1, 1 );
int z = from.Z;
if ( !map.CanFit( x, y, z, 16, false, true ) )
{
z = map.GetAverageZ( x, y );
if ( z == from.Z || !map.CanFit( x, y, z, 16, false, true ) )
continue;
}
UnholyBone bone = new UnholyBone();
bone.Hue = 0;
bone.Name = "unholy bones";
bone.ItemID = Utility.Random( 0xECA, 9 );
bone.MoveToWorld( new Point3D( x, y, z ), map );
}
}
public DemonKnight( 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,75 @@
using System;
using Server;
using Server.Items;
namespace Server.Mobiles
{
[CorpseName( "a devourer of souls corpse" )]
public class Devourer : BaseCreature
{
[Constructable]
public Devourer() : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "a devourer of souls";
Body = 303;
BaseSoundID = 357;
SetStr( 801, 950 );
SetDex( 126, 175 );
SetInt( 201, 250 );
SetHits( 650 );
SetDamage( 22, 26 );
SetDamageType( ResistanceType.Physical, 60 );
SetDamageType( ResistanceType.Cold, 20 );
SetDamageType( ResistanceType.Energy, 20 );
SetResistance( ResistanceType.Physical, 45, 55 );
SetResistance( ResistanceType.Fire, 25, 35 );
SetResistance( ResistanceType.Cold, 15, 25 );
SetResistance( ResistanceType.Poison, 60, 70 );
SetResistance( ResistanceType.Energy, 40, 50 );
SetSkill( SkillName.EvalInt, 90.1, 100.0 );
SetSkill( SkillName.Magery, 90.1, 100.0 );
SetSkill( SkillName.Meditation, 90.1, 100.0 );
SetSkill( SkillName.MagicResist, 90.1, 105.0 );
SetSkill( SkillName.Tactics, 75.1, 85.0 );
SetSkill( SkillName.Wrestling, 80.1, 100.0 );
Fame = 9500;
Karma = -9500;
VirtualArmor = 44;
PackNecroReg( 24, 45 );
}
public override void GenerateLoot()
{
AddLoot( LootPack.FilthyRich, 2 );
}
public override Poison PoisonImmune{ get{ return Poison.Lethal; } }
public override int Meat{ get{ return 3; } }
public Devourer( 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,72 @@
using System;
using Server;
using Server.Items;
namespace Server.Mobiles
{
[CorpseName( "a flesh golem corpse" )]
public class FleshGolem : BaseCreature
{
public override WeaponAbility GetWeaponAbility()
{
return WeaponAbility.BleedAttack;
}
[Constructable]
public FleshGolem() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "a flesh golem";
Body = 304;
BaseSoundID = 684;
SetStr( 176, 200 );
SetDex( 51, 75 );
SetInt( 46, 70 );
SetHits( 106, 120 );
SetDamage( 18, 22 );
SetDamageType( ResistanceType.Physical, 100 );
SetResistance( ResistanceType.Physical, 50, 60 );
SetResistance( ResistanceType.Fire, 25, 35 );
SetResistance( ResistanceType.Cold, 15, 25 );
SetResistance( ResistanceType.Poison, 60, 70 );
SetResistance( ResistanceType.Energy, 30, 40 );
SetSkill( SkillName.MagicResist, 50.1, 75.0 );
SetSkill( SkillName.Tactics, 55.1, 80.0 );
SetSkill( SkillName.Wrestling, 60.1, 70.0 );
Fame = 1000;
Karma = -1800;
VirtualArmor = 34;
}
public override void GenerateLoot()
{
AddLoot( LootPack.Average );
}
public override bool BleedImmune{ get{ return true; } }
public override int TreasureMapLevel{ get{ return 1; } }
public FleshGolem( 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,117 @@
using System;
using Server;
using Server.Items;
namespace Server.Mobiles
{
[CorpseName( "a fleshrenderer corpse" )]
public class FleshRenderer : BaseCreature
{
public override WeaponAbility GetWeaponAbility()
{
return Utility.RandomBool() ? WeaponAbility.Dismount : WeaponAbility.ParalyzingBlow;
}
public override bool IgnoreYoungProtection { get { return Core.ML; } }
[Constructable]
public FleshRenderer() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "a fleshrenderer";
Body = 315;
SetStr( 401, 460 );
SetDex( 201, 210 );
SetInt( 221, 260 );
SetHits( 4500 );
SetDamage( 16, 20 );
SetDamageType( ResistanceType.Physical, 80 );
SetDamageType( ResistanceType.Poison, 20 );
SetResistance( ResistanceType.Physical, 80, 90 );
SetResistance( ResistanceType.Fire, 50, 60 );
SetResistance( ResistanceType.Cold, 50, 60 );
SetResistance( ResistanceType.Poison, 100 );
SetResistance( ResistanceType.Energy, 70, 80 );
SetSkill( SkillName.DetectHidden, 80.0 );
SetSkill( SkillName.MagicResist, 155.1, 160.0 );
SetSkill( SkillName.Meditation, 100.0 );
SetSkill( SkillName.Tactics, 100.0 );
SetSkill( SkillName.Wrestling, 90.1, 100.0 );
Fame = 23000;
Karma = -23000;
VirtualArmor = 24;
}
public override void GenerateLoot()
{
AddLoot( LootPack.UltraRich, 2 );
}
public override void OnDeath( Container c )
{
base.OnDeath( c );
if ( !Summoned && !NoKillAwards && DemonKnight.CheckArtifactChance( this ) )
DemonKnight.DistributeArtifact( this );
}
public override bool AutoDispel{ get{ return true; } }
public override bool BardImmune { get { return !Core.SE; } }
public override bool Unprovokable { get { return Core.SE; } }
public override bool AreaPeaceImmune { get { return Core.SE; } }
public override Poison PoisonImmune{ get{ return Poison.Lethal; } }
public override int TreasureMapLevel{ get{ return 1; } }
public override int GetAttackSound()
{
return 0x34C;
}
public override int GetHurtSound()
{
return 0x354;
}
public override int GetAngerSound()
{
return 0x34C;
}
public override int GetIdleSound()
{
return 0x34C;
}
public override int GetDeathSound()
{
return 0x354;
}
public FleshRenderer( 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();
if ( BaseSoundID == 660 )
BaseSoundID = -1;
}
}
}

View file

@ -0,0 +1,73 @@
using System;
using Server;
using Server.Items;
namespace Server.Mobiles
{
[CorpseName( "a gibberling corpse" )]
public class Gibberling : BaseCreature
{
public override WeaponAbility GetWeaponAbility()
{
return WeaponAbility.Dismount;
}
[Constructable]
public Gibberling() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "a gibberling";
Body = 307;
BaseSoundID = 422;
SetStr( 141, 165 );
SetDex( 101, 125 );
SetInt( 56, 80 );
SetHits( 85, 99 );
SetDamage( 12, 17 );
SetDamageType( ResistanceType.Physical, 0 );
SetDamageType( ResistanceType.Fire, 40 );
SetDamageType( ResistanceType.Energy, 60 );
SetResistance( ResistanceType.Physical, 45, 55 );
SetResistance( ResistanceType.Fire, 25, 35 );
SetResistance( ResistanceType.Cold, 25, 35 );
SetResistance( ResistanceType.Poison, 10, 20 );
SetResistance( ResistanceType.Energy, 30, 40 );
SetSkill( SkillName.MagicResist, 45.1, 70.0 );
SetSkill( SkillName.Tactics, 67.6, 92.5 );
SetSkill( SkillName.Wrestling, 60.1, 80.0 );
Fame = 1500;
Karma = -1500;
VirtualArmor = 27;
}
public override void GenerateLoot()
{
AddLoot( LootPack.Meager );
}
public override int TreasureMapLevel{ get{ return 1; } }
public Gibberling( 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,72 @@
using System;
using Server;
using Server.Items;
namespace Server.Mobiles
{
[CorpseName( "a gore fiend corpse" )]
public class GoreFiend : BaseCreature
{
[Constructable]
public GoreFiend() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "a gore fiend";
Body = 305;
BaseSoundID = 224;
SetStr( 161, 185 );
SetDex( 41, 65 );
SetInt( 46, 70 );
SetHits( 97, 111 );
SetDamage( 15, 21 );
SetDamageType( ResistanceType.Physical, 85 );
SetDamageType( ResistanceType.Poison, 15 );
SetResistance( ResistanceType.Physical, 35, 45 );
SetResistance( ResistanceType.Fire, 25, 35 );
SetResistance( ResistanceType.Cold, 15, 25 );
SetResistance( ResistanceType.Poison, 5, 15 );
SetResistance( ResistanceType.Energy, 30, 40 );
SetSkill( SkillName.MagicResist, 40.1, 55.0 );
SetSkill( SkillName.Tactics, 45.1, 70.0 );
SetSkill( SkillName.Wrestling, 50.1, 70.0 );
Fame = 1500;
Karma = -1500;
VirtualArmor = 24;
}
public override void GenerateLoot()
{
AddLoot( LootPack.Average );
}
public override int GetDeathSound()
{
return 1218;
}
public override bool BleedImmune{ get{ return true; } }
public GoreFiend( 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,94 @@
using System;
using Server;
using Server.Items;
namespace Server.Mobiles
{
[CorpseName( "an impaler corpse" )]
public class Impaler : BaseCreature
{
public override WeaponAbility GetWeaponAbility()
{
return Utility.RandomBool() ? WeaponAbility.MortalStrike : WeaponAbility.BleedAttack;
}
public override bool IgnoreYoungProtection { get { return Core.ML; } }
[Constructable]
public Impaler() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = NameList.RandomName( "impaler" );
Body = 306;
BaseSoundID = 0x2A7;
SetStr( 190 );
SetDex( 45 );
SetInt( 190 );
SetHits( 5000 );
SetDamage( 31, 35 );
SetDamageType( ResistanceType.Physical, 100 );
SetResistance( ResistanceType.Physical, 90 );
SetResistance( ResistanceType.Fire, 60 );
SetResistance( ResistanceType.Cold, 75 );
SetResistance( ResistanceType.Poison, 60 );
SetResistance( ResistanceType.Energy, 100 );
SetSkill( SkillName.DetectHidden, 80.0 );
SetSkill( SkillName.Meditation, 120.0 );
SetSkill( SkillName.Poisoning, 160.0 );
SetSkill( SkillName.MagicResist, 100.0 );
SetSkill( SkillName.Tactics, 100.0 );
SetSkill( SkillName.Wrestling, 80.0 );
Fame = 24000;
Karma = -24000;
VirtualArmor = 49;
}
public override void GenerateLoot()
{
AddLoot( LootPack.UltraRich, 2 );
}
public override void OnDeath( Container c )
{
base.OnDeath( c );
if ( !Summoned && !NoKillAwards && DemonKnight.CheckArtifactChance( this ) )
DemonKnight.DistributeArtifact( this );
}
public override bool AutoDispel{ get{ return true; } }
public override bool BardImmune{ get{ return !Core.SE; } }
public override bool Unprovokable{ get{ return Core.SE; } }
public override bool AreaPeaceImmune { get { return Core.SE; } }
public override Poison PoisonImmune{ get{ return Poison.Lethal; } }
public override Poison HitPoison{ get{ return (0.8 >= Utility.RandomDouble() ? Poison.Greater : Poison.Deadly); } }
public override int TreasureMapLevel{ get{ return 1; } }
public Impaler( 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();
if ( BaseSoundID == 1200 )
BaseSoundID = 0x2A7;
}
}
}

View file

@ -0,0 +1,66 @@
using System;
using Server;
using Server.Items;
namespace Server.Mobiles
{
[CorpseName( "a maggoty corpse" )] // TODO: Corpse name?
public class MoundOfMaggots : BaseCreature
{
[Constructable]
public MoundOfMaggots() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "a mound of maggots";
Body = 319;
BaseSoundID = 898;
SetStr( 61, 70 );
SetDex( 61, 70 );
SetInt( 10 );
SetMana( 0 );
SetDamage( 3, 9 );
SetDamageType( ResistanceType.Physical, 50 );
SetDamageType( ResistanceType.Poison, 50 );
SetResistance( ResistanceType.Physical, 90 );
SetResistance( ResistanceType.Poison, 100 );
SetSkill( SkillName.Tactics, 50.0 );
SetSkill( SkillName.Wrestling, 50.1, 60.0 );
Fame = 1000;
Karma = -1000;
VirtualArmor = 24;
}
public override void GenerateLoot()
{
AddLoot( LootPack.Meager );
AddLoot( LootPack.Gems );
}
public override Poison PoisonImmune{ get{ return Poison.Lethal; } }
public override int TreasureMapLevel{ get{ return 1; } }
public MoundOfMaggots( 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,75 @@
using System;
using Server;
using Server.Items;
namespace Server.Mobiles
{
[CorpseName( "a patchwork skeletal corpse" )]
public class PatchworkSkeleton : BaseCreature
{
public override WeaponAbility GetWeaponAbility()
{
return WeaponAbility.Dismount;
}
[Constructable]
public PatchworkSkeleton() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "a patchwork skeleton";
Body = 309;
BaseSoundID = 0x48D;
SetStr( 96, 120 );
SetDex( 71, 95 );
SetInt( 16, 40 );
SetHits( 58, 72 );
SetDamage( 18, 22 );
SetDamageType( ResistanceType.Physical, 85 );
SetDamageType( ResistanceType.Cold, 15 );
SetResistance( ResistanceType.Physical, 55, 65 );
SetResistance( ResistanceType.Fire, 50, 60 );
SetResistance( ResistanceType.Cold, 70, 80 );
SetResistance( ResistanceType.Poison, 100 );
SetResistance( ResistanceType.Energy, 40, 50 );
SetSkill( SkillName.MagicResist, 70.1, 95.0 );
SetSkill( SkillName.Tactics, 55.1, 80.0 );
SetSkill( SkillName.Wrestling, 50.1, 70.0 );
Fame = 500;
Karma = -500;
VirtualArmor = 54;
}
public override void GenerateLoot()
{
AddLoot( LootPack.Meager );
}
public override bool BleedImmune{ get{ return true; } }
public override Poison PoisonImmune{ get{ return Poison.Lethal; } }
public override int TreasureMapLevel{ get{ return 1; } }
public PatchworkSkeleton( 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,69 @@
using System;
using Server;
using Server.Items;
namespace Server.Mobiles
{
[CorpseName( "a ravager corpse" )]
public class Ravager : BaseCreature
{
public override WeaponAbility GetWeaponAbility()
{
return Utility.RandomBool() ? WeaponAbility.Dismount : WeaponAbility.CrushingBlow;
}
[Constructable]
public Ravager() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "a ravager";
Body = 314;
BaseSoundID = 357;
SetStr( 251, 275 );
SetDex( 101, 125 );
SetInt( 66, 90 );
SetHits( 161, 175 );
SetDamage( 15, 20 );
SetDamageType( ResistanceType.Physical, 100 );
SetResistance( ResistanceType.Physical, 50, 60 );
SetResistance( ResistanceType.Fire, 50, 60 );
SetResistance( ResistanceType.Cold, 60, 70 );
SetResistance( ResistanceType.Poison, 30, 40 );
SetResistance( ResistanceType.Energy, 20, 30 );
SetSkill( SkillName.MagicResist, 50.1, 75.0 );
SetSkill( SkillName.Tactics, 75.1, 100.0 );
SetSkill( SkillName.Wrestling, 70.1, 90.0 );
Fame = 3500;
Karma = -3500;
VirtualArmor = 54;
}
public override void GenerateLoot()
{
AddLoot( LootPack.Rich );
}
public Ravager( 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,183 @@
using System;
using Server;
using Server.Items;
using Server.Targeting;
namespace Server.Mobiles
{
public class Revenant : BaseCreature
{
private Mobile m_Target;
private DateTime m_ExpireTime;
public override void DisplayPaperdollTo( Mobile to )
{
// Do nothing
}
public override Mobile ConstantFocus{ get{ return m_Target; } }
public override bool NoHouseRestrictions{ get{ return true; } }
public override double DispelDifficulty{ get{ return 80.0; } }
public override double DispelFocus{ get{ return 20.0; } }
public Revenant( Mobile caster, Mobile target, TimeSpan duration ) : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.18, 0.36 )
{
Name = "a revenant";
Body = 400;
Hue = 1;
// TODO: Sound values?
double scalar = caster.Skills[SkillName.SpiritSpeak].Value * 0.01;
m_Target = target;
m_ExpireTime = DateTime.UtcNow + duration;
SetStr( 200 );
SetDex( 150 );
SetInt( 150 );
SetDamage( 16, 17 );
// Bestiary says 50 phys 50 cold, animal lore says differently
SetDamageType( ResistanceType.Physical, 100 );
SetSkill( SkillName.MagicResist, 100.0 * scalar ); // magic resist is absolute value of spiritspeak
SetSkill( SkillName.Tactics, 100.0 ); // always 100
SetSkill( SkillName.Swords, 100.0 * scalar ); // not displayed in animal lore but tests clearly show this is influenced
SetSkill( SkillName.DetectHidden, 75.0 * scalar );
scalar /= 1.2;
SetResistance( ResistanceType.Physical, 40 + (int)(20 * scalar), 50 + (int)(20 * scalar) );
SetResistance( ResistanceType.Cold, 40 + (int)(20 * scalar), 50 + (int)(20 * scalar) );
SetResistance( ResistanceType.Fire, (int)(20 * scalar) );
SetResistance( ResistanceType.Poison, 100 );
SetResistance( ResistanceType.Energy, 40 + (int)(20 * scalar), 50 + (int)(20 * scalar) );
Fame = 0;
Karma = 0;
ControlSlots = 3;
VirtualArmor = 32;
Item shroud = new DeathShroud();
shroud.Hue = 0x455;
shroud.Movable = false;
AddItem( shroud );
Halberd weapon = new Halberd();
weapon.Hue = 1;
weapon.Movable = false;
AddItem( weapon );
}
public override bool AlwaysMurderer{ get{ return true; } }
public override bool BleedImmune{ get{ return true; } }
public override bool BardImmune{ get{ return true; } }
public override Poison PoisonImmune{ get{ return Poison.Lethal; } }
public override void OnThink()
{
if ( !m_Target.Alive || DateTime.UtcNow > m_ExpireTime )
{
Kill();
return;
}
else if ( Map != m_Target.Map || !InRange( m_Target, 15 ) )
{
Map fromMap = Map;
Point3D from = Location;
Map toMap = m_Target.Map;
Point3D to = m_Target.Location;
if ( toMap != null )
{
for ( int i = 0; i < 5; ++i )
{
Point3D loc = new Point3D( to.X - 4 + Utility.Random( 9 ), to.Y - 4 + Utility.Random( 9 ), to.Z );
if ( toMap.CanSpawnMobile( loc ) )
{
to = loc;
break;
}
else
{
loc.Z = toMap.GetAverageZ( loc.X, loc.Y );
if ( toMap.CanSpawnMobile( loc ) )
{
to = loc;
break;
}
}
}
}
Map = toMap;
Location = to;
ProcessDelta();
Effects.SendLocationParticles( EffectItem.Create( from, fromMap, EffectItem.DefaultDuration ), 0x3728, 1, 13, 37, 7, 5023, 0 );
FixedParticles( 0x3728, 1, 13, 5023, 37, 7, EffectLayer.Waist );
PlaySound( 0x37D );
}
if (m_Target.Hidden && InRange(m_Target, 3) && Core.TickCount - this.NextSkillTime >= 0 && UseSkill(SkillName.DetectHidden))
{
Target targ = this.Target;
if ( targ != null )
targ.Invoke( this, this );
}
Combatant = m_Target;
FocusMob = m_Target;
if ( AIObject != null )
AIObject.Action = ActionType.Combat;
base.OnThink();
}
public override bool OnBeforeDeath()
{
Effects.PlaySound( Location, Map, 0x10B );
Effects.SendLocationParticles( EffectItem.Create( Location, Map, TimeSpan.FromSeconds( 10.0 ) ), 0x37CC, 1, 50, 2101, 7, 9909, 0 );
Delete();
return false;
}
public Revenant( 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();
Delete();
}
}
}

View file

@ -0,0 +1,196 @@
using System;
using Server;
using Server.Items;
namespace Server.Mobiles
{
[CorpseName( "a shadow knight corpse" )]
public class ShadowKnight : BaseCreature
{
public override WeaponAbility GetWeaponAbility()
{
return Utility.RandomBool() ? WeaponAbility.ConcussionBlow : WeaponAbility.CrushingBlow;
}
public override bool IgnoreYoungProtection { get { return Core.ML; } }
[Constructable]
public ShadowKnight() : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = NameList.RandomName( "shadow knight" );
Title = "the Shadow Knight";
Body = 311;
SetStr( 250 );
SetDex( 100 );
SetInt( 100 );
SetHits( 2000 );
SetDamage( 20, 30 );
SetDamageType( ResistanceType.Physical, 60 );
SetDamageType( ResistanceType.Cold, 40 );
SetResistance( ResistanceType.Physical, 90 );
SetResistance( ResistanceType.Fire, 65 );
SetResistance( ResistanceType.Cold, 75 );
SetResistance( ResistanceType.Poison, 75 );
SetResistance( ResistanceType.Energy, 55 );
SetSkill( SkillName.Chivalry, 120.0 );
SetSkill( SkillName.DetectHidden, 80.0 );
SetSkill( SkillName.EvalInt, 100.0 );
SetSkill( SkillName.Magery, 100.0 );
SetSkill( SkillName.Meditation, 100.0 );
SetSkill( SkillName.MagicResist, 120.0 );
SetSkill( SkillName.Tactics, 100.0 );
SetSkill( SkillName.Wrestling, 100.0 );
Fame = 25000;
Karma = -25000;
VirtualArmor = 54;
}
public override void GenerateLoot()
{
AddLoot( LootPack.UltraRich, 2 );
}
public override OppositionGroup OppositionGroup
{
get{ return OppositionGroup.FeyAndUndead; }
}
public override void OnDeath( Container c )
{
base.OnDeath( c );
if ( !Summoned && !NoKillAwards && DemonKnight.CheckArtifactChance( this ) )
DemonKnight.DistributeArtifact( this );
}
public override int GetIdleSound()
{
return 0x2CE;
}
public override int GetDeathSound()
{
return 0x2C1;
}
public override int GetHurtSound()
{
return 0x2D1;
}
public override int GetAttackSound()
{
return 0x2C8;
}
private Timer m_SoundTimer;
private bool m_HasTeleportedAway;
public override void OnCombatantChange()
{
base.OnCombatantChange();
if ( Hidden && Combatant != null )
Combatant = null;
}
public virtual void SendTrackingSound()
{
if ( Hidden )
{
Effects.PlaySound( this.Location, this.Map, 0x2C8 );
Combatant = null;
}
else
{
Frozen = false;
if ( m_SoundTimer != null )
m_SoundTimer.Stop();
m_SoundTimer = null;
}
}
public override void OnThink()
{
if ( !m_HasTeleportedAway && Hits < (HitsMax / 2) )
{
Map map = this.Map;
if ( map != null )
{
// try 10 times to find a teleport spot
for ( int i = 0; i < 10; ++i )
{
int x = X + (Utility.RandomMinMax( 5, 10 ) * (Utility.RandomBool() ? 1 : -1));
int y = Y + (Utility.RandomMinMax( 5, 10 ) * (Utility.RandomBool() ? 1 : -1));
int z = Z;
if ( !map.CanFit( x, y, z, 16, false, false ) )
continue;
Point3D from = this.Location;
Point3D to = new Point3D( x, y, z );
if ( !InLOS( to ) )
continue;
this.Location = to;
this.ProcessDelta();
this.Hidden = true;
this.Combatant = null;
Effects.SendLocationParticles( EffectItem.Create( from, map, EffectItem.DefaultDuration ), 0x3728, 10, 10, 2023 );
Effects.SendLocationParticles( EffectItem.Create( to, map, EffectItem.DefaultDuration ), 0x3728, 10, 10, 5023 );
Effects.PlaySound( to, map, 0x1FE );
m_HasTeleportedAway = true;
m_SoundTimer = Timer.DelayCall( TimeSpan.FromSeconds( 5.0 ), TimeSpan.FromSeconds( 2.5 ), new TimerCallback( SendTrackingSound ) );
Frozen = true;
break;
}
}
}
base.OnThink();
}
public override bool BardImmune{ get{ return !Core.SE; } }
public override bool Unprovokable{ get{ return Core.SE; } }
public override bool AreaPeaceImmune{ get{ return Core.SE; } }
public override Poison PoisonImmune{ get{ return Poison.Lethal; } }
public override int TreasureMapLevel{ get{ return 1; } }
public ShadowKnight( 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();
if ( BaseSoundID == 357 )
BaseSoundID = -1;
}
}
}

View file

@ -0,0 +1,68 @@
using System;
using Server;
using Server.Items;
namespace Server.Mobiles
{
[CorpseName( "a skittering hopper corpse" )]
public class SkitteringHopper : BaseCreature
{
[Constructable]
public SkitteringHopper() : base( AIType.AI_Melee, FightMode.Aggressor, 10, 1, 0.2, 0.4 )
{
Name = "a skittering hopper";
Body = 302;
BaseSoundID = 959;
SetStr( 41, 65 );
SetDex( 91, 115 );
SetInt( 26, 50 );
SetHits( 31, 45 );
SetDamage( 3, 5 );
SetDamageType( ResistanceType.Physical, 100 );
SetResistance( ResistanceType.Physical, 5, 10 );
SetResistance( ResistanceType.Cold, 10, 20 );
SetResistance( ResistanceType.Energy, 5, 10 );
SetSkill( SkillName.MagicResist, 30.1, 45.0 );
SetSkill( SkillName.Tactics, 45.1, 70.0 );
SetSkill( SkillName.Wrestling, 40.1, 60.0 );
Fame = 300;
Karma = 0;
Tamable = true;
ControlSlots = 1;
MinTameSkill = -12.9;
VirtualArmor = 12;
}
public override void GenerateLoot()
{
AddLoot( LootPack.Meager );
}
public override int TreasureMapLevel{ get{ return 1; } }
public SkitteringHopper( 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,93 @@
using System;
using Server;
using Server.Items;
namespace Server.Mobiles
{
[CorpseName( "a treefellow corpse" )]
public class Treefellow : BaseCreature
{
public override WeaponAbility GetWeaponAbility()
{
return WeaponAbility.Dismount;
}
[Constructable]
public Treefellow() : base( AIType.AI_Melee, FightMode.Evil, 10, 1, 0.2, 0.4 )
{
Name = "a treefellow";
Body = 301;
SetStr( 196, 220 );
SetDex( 31, 55 );
SetInt( 66, 90 );
SetHits( 118, 132 );
SetDamage( 12, 16 );
SetDamageType( ResistanceType.Physical, 100 );
SetResistance( ResistanceType.Physical, 20, 25 );
SetResistance( ResistanceType.Cold, 50, 60 );
SetResistance( ResistanceType.Poison, 30, 35 );
SetResistance( ResistanceType.Energy, 20, 30 );
SetSkill( SkillName.MagicResist, 40.1, 55.0 );
SetSkill( SkillName.Tactics, 65.1, 90.0 );
SetSkill( SkillName.Wrestling, 65.1, 85.0 );
Fame = 500;
Karma = 1500;
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 );
}
public Treefellow( 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();
if ( BaseSoundID == 442 )
BaseSoundID = -1;
}
}
}

View file

@ -0,0 +1,70 @@
using System;
using Server;
using Server.Items;
namespace Server.Mobiles
{
[CorpseName( "a vampire bat corpse" )]
public class VampireBat : BaseCreature
{
[Constructable]
public VampireBat() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "a vampire bat";
Body = 317;
BaseSoundID = 0x270;
SetStr( 91, 110 );
SetDex( 91, 115 );
SetInt( 26, 50 );
SetHits( 55, 66 );
SetDamage( 7, 9 );
SetDamageType( ResistanceType.Physical, 80 );
SetDamageType( ResistanceType.Poison, 20 );
SetResistance( ResistanceType.Physical, 35, 45 );
SetResistance( ResistanceType.Fire, 15, 25 );
SetResistance( ResistanceType.Cold, 15, 25 );
SetResistance( ResistanceType.Poison, 60, 70 );
SetResistance( ResistanceType.Energy, 40, 50 );
SetSkill( SkillName.MagicResist, 70.1, 95.0 );
SetSkill( SkillName.Tactics, 55.1, 80.0 );
SetSkill( SkillName.Wrestling, 30.1, 55.0 );
Fame = 1000;
Karma = -1000;
VirtualArmor = 14;
}
public override void GenerateLoot()
{
AddLoot( LootPack.Poor );
}
public override int GetIdleSound()
{
return 0x29B;
}
public VampireBat( 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,73 @@
using System;
using Server;
using Server.Items;
namespace Server.Mobiles
{
[CorpseName( "a wailing banshee corpse" )]
public class WailingBanshee : BaseCreature
{
public override WeaponAbility GetWeaponAbility()
{
return WeaponAbility.MortalStrike;
}
[Constructable]
public WailingBanshee() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "a wailing banshee";
Body = 310;
BaseSoundID = 0x482;
SetStr( 126, 150 );
SetDex( 76, 100 );
SetInt( 86, 110 );
SetHits( 76, 90 );
SetDamage( 10, 14 );
SetDamageType( ResistanceType.Physical, 20 );
SetDamageType( ResistanceType.Cold, 60 );
SetDamageType( ResistanceType.Poison, 20 );
SetResistance( ResistanceType.Physical, 50, 60 );
SetResistance( ResistanceType.Fire, 25, 30 );
SetResistance( ResistanceType.Cold, 70, 80 );
SetResistance( ResistanceType.Poison, 30, 40 );
SetResistance( ResistanceType.Energy, 40, 50 );
SetSkill( SkillName.MagicResist, 70.1, 95.0 );
SetSkill( SkillName.Tactics, 45.1, 70.0 );
SetSkill( SkillName.Wrestling, 50.1, 70.0 );
Fame = 1500;
Karma = -1500;
VirtualArmor = 19;
}
public override void GenerateLoot()
{
AddLoot( LootPack.Meager );
}
public override bool BleedImmune{ get{ return true; } }
public WailingBanshee( 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;
using Server.Items;
namespace Server.Mobiles
{
[CorpseName( "a wanderer of the void corpse" )]
public class WandererOfTheVoid : BaseCreature
{
[Constructable]
public WandererOfTheVoid() : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "a wanderer of the void";
Body = 316;
BaseSoundID = 377;
SetStr( 111, 200 );
SetDex( 101, 125 );
SetInt( 301, 390 );
SetHits( 351, 400 );
SetDamage( 11, 13 );
SetDamageType( ResistanceType.Physical, 0 );
SetDamageType( ResistanceType.Cold, 15 );
SetDamageType( ResistanceType.Energy, 85 );
SetResistance( ResistanceType.Physical, 40, 50 );
SetResistance( ResistanceType.Fire, 15, 25 );
SetResistance( ResistanceType.Cold, 40, 50 );
SetResistance( ResistanceType.Poison, 50, 75 );
SetResistance( ResistanceType.Energy, 40, 50 );
SetSkill( SkillName.EvalInt, 60.1, 70.0 );
SetSkill( SkillName.Magery, 60.1, 70.0 );
SetSkill( SkillName.Meditation, 60.1, 70.0 );
SetSkill( SkillName.MagicResist, 50.1, 75.0 );
SetSkill( SkillName.Tactics, 60.1, 70.0 );
SetSkill( SkillName.Wrestling, 60.1, 70.0 );
Fame = 20000;
Karma = -20000;
VirtualArmor = 44;
int count = Utility.RandomMinMax( 2, 3 );
for ( int i = 0; i < count; ++i )
PackItem( new TreasureMap( 3, Map.Trammel ) );
}
public override bool BleedImmune{ get{ return true; } }
public override Poison PoisonImmune{ get{ return Poison.Lethal; } }
public override int TreasureMapLevel{ get{ return Core.AOS ? 4 : 1; } }
public override void GenerateLoot()
{
AddLoot( LootPack.FilthyRich );
}
public WandererOfTheVoid( 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,113 @@
using System;
using System.Collections;
using Server.Items;
using Server.Targeting;
namespace Server.Mobiles
{
[CorpseName( "an ant lion corpse" )]
public class AntLion : BaseCreature
{
[Constructable]
public AntLion() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "an ant lion";
Body = 787;
BaseSoundID = 1006;
SetStr( 296, 320 );
SetDex( 81, 105 );
SetInt( 36, 60 );
SetHits( 151, 162 );
SetDamage( 7, 21 );
SetDamageType( ResistanceType.Physical, 70 );
SetDamageType( ResistanceType.Poison, 30 );
SetResistance( ResistanceType.Physical, 45, 60 );
SetResistance( ResistanceType.Fire, 25, 35 );
SetResistance( ResistanceType.Cold, 30, 40 );
SetResistance( ResistanceType.Poison, 40, 50 );
SetResistance( ResistanceType.Energy, 30, 35 );
SetSkill( SkillName.MagicResist, 70.0 );
SetSkill( SkillName.Tactics, 90.0 );
SetSkill( SkillName.Wrestling, 90.0 );
Fame = 4500;
Karma = -4500;
VirtualArmor = 45;
PackItem( new Bone( 3 ) );
PackItem( new FertileDirt( Utility.RandomMinMax( 1, 5 ) ) );
if ( Core.ML && Utility.RandomDouble() < .33 )
PackItem( Engines.Plants.Seed.RandomPeculiarSeed(2) );
Item orepile = null; /* no trust, no love :( */
switch (Utility.Random(4))
{
case 0: orepile = new DullCopperOre(); break;
case 1: orepile = new ShadowIronOre(); break;
case 2: orepile = new CopperOre(); break;
default: orepile = new BronzeOre(); break;
}
orepile.Amount = Utility.RandomMinMax(1, 10);
orepile.ItemID = 0x19B9;
PackItem(orepile);
// TODO: skeleton
}
public override int GetAngerSound()
{
return 0x5A;
}
public override int GetIdleSound()
{
return 0x5A;
}
public override int GetAttackSound()
{
return 0x164;
}
public override int GetHurtSound()
{
return 0x187;
}
public override int GetDeathSound()
{
return 0x1BA;
}
public override void GenerateLoot()
{
AddLoot( LootPack.Average, 2 );
}
public AntLion( 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,111 @@
using System;
using System.Collections;
using Server.Items;
using Server.Targeting;
namespace Server.Mobiles
{
[CorpseName( "a solen infiltrator corpse" )] // TODO: Corpse name?
public class BlackSolenInfiltratorQueen : BaseCreature
{
[Constructable]
public BlackSolenInfiltratorQueen() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "a black solen infiltrator";
Body = 807;
BaseSoundID = 959;
Hue = 0x453;
SetStr( 326, 350 );
SetDex( 141, 165 );
SetInt( 96, 120 );
SetHits( 151, 162 );
SetDamage( 10, 15 );
SetDamageType( ResistanceType.Physical, 70 );
SetDamageType( ResistanceType.Poison, 30 );
SetResistance( ResistanceType.Physical, 30, 40 );
SetResistance( ResistanceType.Fire, 30, 35 );
SetResistance( ResistanceType.Cold, 25, 35 );
SetResistance( ResistanceType.Poison, 35, 40 );
SetResistance( ResistanceType.Energy, 25, 30 );
SetSkill( SkillName.MagicResist, 90.0 );
SetSkill( SkillName.Tactics, 90.0 );
SetSkill( SkillName.Wrestling, 90.0 );
Fame = 6500;
Karma = -6500;
VirtualArmor = 50;
SolenHelper.PackPicnicBasket( this );
PackItem( new ZoogiFungus( ( 0.05 > Utility.RandomDouble() ) ? 16 : 4 ) );
}
public override int GetAngerSound()
{
return 0x259;
}
public override int GetIdleSound()
{
return 0x259;
}
public override int GetAttackSound()
{
return 0x195;
}
public override int GetHurtSound()
{
return 0x250;
}
public override int GetDeathSound()
{
return 0x25B;
}
public override void GenerateLoot()
{
AddLoot( LootPack.Rich );
}
public override bool IsEnemy( Mobile m )
{
if ( SolenHelper.CheckBlackFriendship( m ) )
return false;
else
return base.IsEnemy( m );
}
public override void OnDamage( int amount, Mobile from, bool willKill )
{
SolenHelper.OnBlackDamage( from );
base.OnDamage( amount, from, willKill );
}
public BlackSolenInfiltratorQueen( 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,112 @@
using System;
using System.Collections;
using Server.Items;
using Server.Targeting;
namespace Server.Mobiles
{
[CorpseName( "a solen infiltrator corpse" )]
public class BlackSolenInfiltratorWarrior : BaseCreature
{
[Constructable]
public BlackSolenInfiltratorWarrior() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "a black solen infiltrator";
Body = 806;
BaseSoundID = 959;
Hue = 0x453;
SetStr( 206, 230 );
SetDex( 121, 145 );
SetInt( 66, 90 );
SetHits( 96, 107 );
SetDamage( 5, 15 );
SetDamageType( ResistanceType.Physical, 80 );
SetDamageType( ResistanceType.Poison, 20 );
SetResistance( ResistanceType.Physical, 20, 35 );
SetResistance( ResistanceType.Fire, 20, 35 );
SetResistance( ResistanceType.Cold, 10, 25 );
SetResistance( ResistanceType.Poison, 20, 35 );
SetResistance( ResistanceType.Energy, 10, 25 );
SetSkill( SkillName.MagicResist, 80.0 );
SetSkill( SkillName.Tactics, 80.0 );
SetSkill( SkillName.Wrestling, 80.0 );
Fame = 3000;
Karma = -3000;
VirtualArmor = 40;
SolenHelper.PackPicnicBasket( this );
PackItem( new ZoogiFungus( ( 0.05 > Utility.RandomDouble() )? 13 : 3 ) );
}
public override int GetAngerSound()
{
return 0xB5;
}
public override int GetIdleSound()
{
return 0xB5;
}
public override int GetAttackSound()
{
return 0x289;
}
public override int GetHurtSound()
{
return 0xBC;
}
public override int GetDeathSound()
{
return 0xE4;
}
public override void GenerateLoot()
{
AddLoot( LootPack.Average, 2 );
AddLoot( LootPack.Gems, Utility.RandomMinMax( 1, 4 ) );
}
public override bool IsEnemy( Mobile m )
{
if ( SolenHelper.CheckBlackFriendship( m ) )
return false;
else
return base.IsEnemy( m );
}
public override void OnDamage( int amount, Mobile from, bool willKill )
{
SolenHelper.OnBlackDamage( from );
base.OnDamage( amount, from, willKill );
}
public BlackSolenInfiltratorWarrior( 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,150 @@
using System;
using System.Collections;
using Server.Items;
using Server.Network;
namespace Server.Mobiles
{
[CorpseName( "a solen queen corpse" )]
public class BlackSolenQueen : BaseCreature
{
private bool m_BurstSac;
public bool BurstSac{ get{ return m_BurstSac; } }
[Constructable]
public BlackSolenQueen() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "a black solen queen";
Body = 807;
BaseSoundID = 959;
Hue = 0x453;
SetStr( 296, 320 );
SetDex( 121, 145 );
SetInt( 76, 100 );
SetHits( 151, 162 );
SetDamage( 10, 15 );
SetDamageType( ResistanceType.Physical, 70 );
SetDamageType( ResistanceType.Poison, 30 );
SetResistance( ResistanceType.Physical, 30, 40 );
SetResistance( ResistanceType.Fire, 30, 35 );
SetResistance( ResistanceType.Cold, 25, 35 );
SetResistance( ResistanceType.Poison, 35, 40 );
SetResistance( ResistanceType.Energy, 25, 30 );
SetSkill( SkillName.MagicResist, 70.0 );
SetSkill( SkillName.Tactics, 90.0 );
SetSkill( SkillName.Wrestling, 90.0 );
Fame = 4500;
Karma = -4500;
VirtualArmor = 45;
SolenHelper.PackPicnicBasket( this );
PackItem( new ZoogiFungus( ( Utility.RandomDouble() > 0.05 )? 5 : 25 ) );
if ( Utility.RandomDouble() < 0.05 )
PackItem( new BallOfSummoning() );
}
public override int GetAngerSound()
{
return 0x259;
}
public override int GetIdleSound()
{
return 0x259;
}
public override int GetAttackSound()
{
return 0x195;
}
public override int GetHurtSound()
{
return 0x250;
}
public override int GetDeathSound()
{
return 0x25B;
}
public override void GenerateLoot()
{
AddLoot( LootPack.Rich );
}
public override bool IsEnemy( Mobile m )
{
if ( SolenHelper.CheckBlackFriendship( m ) )
return false;
else
return base.IsEnemy( m );
}
public override void OnDamage( int amount, Mobile from, bool willKill )
{
SolenHelper.OnBlackDamage( from );
if ( !willKill )
{
if ( !BurstSac )
{
if ( Hits < 50 )
{
PublicOverheadMessage( MessageType.Regular, 0x3B2, true, "* The solen's acid sac is burst open! *" );
m_BurstSac = true;
}
}
else if ( from != null && from != this && InRange( from, 1 ) )
{
SpillAcid( from, 1 );
}
}
base.OnDamage( amount, from, willKill );
}
public override bool OnBeforeDeath()
{
SpillAcid( 4 );
return base.OnBeforeDeath();
}
public BlackSolenQueen( Serial serial ) : base( serial )
{
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write( (int) 1 );
writer.Write( m_BurstSac );
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
switch( version )
{
case 1:
{
m_BurstSac = reader.ReadBool();
break;
}
}
}
}
}

View file

@ -0,0 +1,151 @@
using System;
using System.Collections;
using Server.Items;
using Server.Network;
namespace Server.Mobiles
{
[CorpseName( "a solen warrior corpse" )]
public class BlackSolenWarrior : BaseCreature
{
private bool m_BurstSac;
public bool BurstSac{ get{ return m_BurstSac; } }
[Constructable]
public BlackSolenWarrior() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "a black solen warrior";
Body = 806;
BaseSoundID = 959;
Hue = 0x453;
SetStr( 196, 220 );
SetDex( 101, 125 );
SetInt( 36, 60 );
SetHits( 96, 107 );
SetDamage( 5, 15 );
SetDamageType( ResistanceType.Physical, 80 );
SetDamageType( ResistanceType.Poison, 20 );
SetResistance( ResistanceType.Physical, 20, 35 );
SetResistance( ResistanceType.Fire, 20, 35 );
SetResistance( ResistanceType.Cold, 10, 25 );
SetResistance( ResistanceType.Poison, 20, 35 );
SetResistance( ResistanceType.Energy, 10, 25 );
SetSkill( SkillName.MagicResist, 60.0 );
SetSkill( SkillName.Tactics, 80.0 );
SetSkill( SkillName.Wrestling, 80.0 );
Fame = 3000;
Karma = -3000;
VirtualArmor = 35;
SolenHelper.PackPicnicBasket( this );
PackItem( new ZoogiFungus( ( 0.05 > Utility.RandomDouble() )? 13 : 3 ) );
if ( Utility.RandomDouble() < 0.05 )
PackItem( new BraceletOfBinding() );
}
public override int GetAngerSound()
{
return 0xB5;
}
public override int GetIdleSound()
{
return 0xB5;
}
public override int GetAttackSound()
{
return 0x289;
}
public override int GetHurtSound()
{
return 0xBC;
}
public override int GetDeathSound()
{
return 0xE4;
}
public override void GenerateLoot()
{
AddLoot( LootPack.Rich );
AddLoot( LootPack.Gems, Utility.RandomMinMax( 1, 4 ) );
}
public override bool IsEnemy( Mobile m )
{
if ( SolenHelper.CheckBlackFriendship( m ) )
return false;
else
return base.IsEnemy( m );
}
public override void OnDamage( int amount, Mobile from, bool willKill )
{
SolenHelper.OnBlackDamage( from );
if ( !willKill )
{
if ( !BurstSac )
{
if ( Hits < 50 )
{
PublicOverheadMessage( MessageType.Regular, 0x3B2, true, "* The solen's acid sac is burst open! *" );
m_BurstSac = true;
}
}
else if ( from != null && from != this && InRange( from, 1 ) )
{
SpillAcid( from, 1 );
}
}
base.OnDamage( amount, from, willKill );
}
public override bool OnBeforeDeath()
{
SpillAcid( 4 );
return base.OnBeforeDeath();
}
public BlackSolenWarrior( Serial serial ) : base( serial )
{
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write( (int) 1 );
writer.Write( m_BurstSac );
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
switch( version )
{
case 1:
{
m_BurstSac = reader.ReadBool();
break;
}
}
}
}
}

View file

@ -0,0 +1,112 @@
using System;
using System.Collections;
using Server.Items;
using Server.Targeting;
namespace Server.Mobiles
{
[CorpseName( "a solen worker corpse" )]
public class BlackSolenWorker : BaseCreature
{
[Constructable]
public BlackSolenWorker() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "a black solen worker";
Body = 805;
BaseSoundID = 959;
Hue = 0x453;
SetStr( 96, 120 );
SetDex( 81, 105 );
SetInt( 36, 60 );
SetHits( 58, 72 );
SetDamage( 5, 7 );
SetDamageType( ResistanceType.Physical, 100 );
SetResistance( ResistanceType.Physical, 25, 30 );
SetResistance( ResistanceType.Fire, 20, 30 );
SetResistance( ResistanceType.Cold, 10, 20 );
SetResistance( ResistanceType.Poison, 10, 20 );
SetResistance( ResistanceType.Energy, 20, 30 );
SetSkill( SkillName.MagicResist, 60.0 );
SetSkill( SkillName.Tactics, 65.0 );
SetSkill( SkillName.Wrestling, 60.0 );
Fame = 1500;
Karma = -1500;
VirtualArmor = 28;
PackGold( Utility.Random( 100, 180 ) );
SolenHelper.PackPicnicBasket( this );
PackItem( new ZoogiFungus() );
}
public override int GetAngerSound()
{
return 0x269;
}
public override int GetIdleSound()
{
return 0x269;
}
public override int GetAttackSound()
{
return 0x186;
}
public override int GetHurtSound()
{
return 0x1BE;
}
public override int GetDeathSound()
{
return 0x8E;
}
public override void GenerateLoot()
{
AddLoot( LootPack.Gems, Utility.RandomMinMax( 1, 2 ) );
}
public override bool IsEnemy( Mobile m )
{
if ( SolenHelper.CheckBlackFriendship( m ) )
return false;
else
return base.IsEnemy( m );
}
public override void OnDamage( int amount, Mobile from, bool willKill )
{
SolenHelper.OnBlackDamage( from );
base.OnDamage( amount, from, willKill );
}
public BlackSolenWorker( 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,110 @@
using System;
using System.Collections;
using Server.Items;
using Server.Targeting;
namespace Server.Mobiles
{
[CorpseName( "a solen infiltrator corpse" )] // TODO: Corpse name?
public class RedSolenInfiltratorQueen : BaseCreature
{
[Constructable]
public RedSolenInfiltratorQueen() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "a red solen infiltrator";
Body = 783;
BaseSoundID = 959;
SetStr( 326, 350 );
SetDex( 141, 165 );
SetInt( 96, 120 );
SetHits( 151, 162 );
SetDamage( 10, 15 );
SetDamageType( ResistanceType.Physical, 70 );
SetDamageType( ResistanceType.Poison, 30 );
SetResistance( ResistanceType.Physical, 30, 40 );
SetResistance( ResistanceType.Fire, 30, 35 );
SetResistance( ResistanceType.Cold, 25, 35 );
SetResistance( ResistanceType.Poison, 35, 40 );
SetResistance( ResistanceType.Energy, 25, 30 );
SetSkill( SkillName.MagicResist, 90.0 );
SetSkill( SkillName.Tactics, 90.0 );
SetSkill( SkillName.Wrestling, 90.0 );
Fame = 6500;
Karma = -6500;
VirtualArmor = 50;
SolenHelper.PackPicnicBasket( this );
PackItem( new ZoogiFungus( ( 0.05 < Utility.RandomDouble() )? 4 : 16 ) );
}
public override int GetAngerSound()
{
return 0x259;
}
public override int GetIdleSound()
{
return 0x259;
}
public override int GetAttackSound()
{
return 0x195;
}
public override int GetHurtSound()
{
return 0x250;
}
public override int GetDeathSound()
{
return 0x25B;
}
public override void GenerateLoot()
{
AddLoot( LootPack.Rich );
}
public override bool IsEnemy( Mobile m )
{
if ( SolenHelper.CheckRedFriendship( m ) )
return false;
else
return base.IsEnemy( m );
}
public override void OnDamage( int amount, Mobile from, bool willKill )
{
SolenHelper.OnRedDamage( from );
base.OnDamage( amount, from, willKill );
}
public RedSolenInfiltratorQueen( 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,112 @@
using System;
using System.Collections;
using Server.Items;
using Server.Targeting;
namespace Server.Mobiles
{
[CorpseName( "a solen infiltrator corpse" )]
public class RedSolenInfiltratorWarrior : BaseCreature
{
[Constructable]
public RedSolenInfiltratorWarrior() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "a red solen infiltrator";
Body = 782;
BaseSoundID = 959;
SetStr( 206, 230 );
SetDex( 121, 145 );
SetInt( 66, 90 );
SetHits( 96, 107 );
SetDamage( 5, 15 );
SetDamageType( ResistanceType.Physical, 80 );
SetDamageType( ResistanceType.Poison, 20 );
SetResistance( ResistanceType.Physical, 20, 35 );
SetResistance( ResistanceType.Fire, 20, 35 );
SetResistance( ResistanceType.Cold, 10, 25 );
SetResistance( ResistanceType.Poison, 20, 35 );
SetResistance( ResistanceType.Energy, 10, 25 );
SetSkill( SkillName.MagicResist, 80.0 );
SetSkill( SkillName.Tactics, 80.0 );
SetSkill( SkillName.Wrestling, 80.0 );
Fame = 3000;
Karma = -3000;
VirtualArmor = 40;
SolenHelper.PackPicnicBasket( this );
PackItem( new ZoogiFungus( ( 0.05 < Utility.RandomDouble() )? 3 : 13 ) );
}
public override int GetAngerSound()
{
return 0xB5;
}
public override int GetIdleSound()
{
return 0xB5;
}
public override int GetAttackSound()
{
return 0x289;
}
public override int GetHurtSound()
{
return 0xBC;
}
public override int GetDeathSound()
{
return 0xE4;
}
public override void GenerateLoot()
{
AddLoot( LootPack.Average, 2 );
AddLoot( LootPack.Gems, Utility.RandomMinMax( 1, 4 ) );
}
public override bool IsEnemy( Mobile m )
{
if ( SolenHelper.CheckRedFriendship( m ) )
return false;
else
return base.IsEnemy( m );
}
public override void OnDamage( int amount, Mobile from, bool willKill )
{
SolenHelper.OnRedDamage( from );
base.OnDamage( amount, from, willKill );
}
public RedSolenInfiltratorWarrior( 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,150 @@
using System;
using System.Collections;
using Server.Items;
using Server.Network;
namespace Server.Mobiles
{
[CorpseName( "a solen queen corpse" )]
public class RedSolenQueen : BaseCreature
{
private bool m_BurstSac;
public bool BurstSac{ get{ return m_BurstSac; } }
[Constructable]
public RedSolenQueen() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "a red solen queen";
Body = 783;
BaseSoundID = 959;
SetStr( 296, 320 );
SetDex( 121, 145 );
SetInt( 76, 100 );
SetHits( 151, 162 );
SetDamage( 10, 15 );
SetDamageType( ResistanceType.Physical, 70 );
SetDamageType( ResistanceType.Poison, 30 );
SetResistance( ResistanceType.Physical, 30, 40 );
SetResistance( ResistanceType.Fire, 30, 35 );
SetResistance( ResistanceType.Cold, 25, 35 );
SetResistance( ResistanceType.Poison, 35, 40 );
SetResistance( ResistanceType.Energy, 25, 30 );
SetSkill( SkillName.MagicResist, 70.0 );
SetSkill( SkillName.Tactics, 90.0 );
SetSkill( SkillName.Wrestling, 90.0 );
Fame = 4500;
Karma = -4500;
VirtualArmor = 45;
SolenHelper.PackPicnicBasket( this );
PackItem( new ZoogiFungus( ( Utility.RandomDouble() > 0.05 )? 5 : 25 ) );
if( Utility.RandomDouble() < 0.05 )
PackItem( new BallOfSummoning() );
}
public override int GetAngerSound()
{
return 0x259;
}
public override int GetIdleSound()
{
return 0x259;
}
public override int GetAttackSound()
{
return 0x195;
}
public override int GetHurtSound()
{
return 0x250;
}
public override int GetDeathSound()
{
return 0x25B;
}
public override void GenerateLoot()
{
AddLoot( LootPack.Rich );
}
public override bool IsEnemy( Mobile m )
{
if ( SolenHelper.CheckRedFriendship( m ) )
return false;
else
return base.IsEnemy( m );
}
public override void OnDamage( int amount, Mobile from, bool willKill )
{
SolenHelper.OnRedDamage( from );
if ( !willKill )
{
if ( !BurstSac )
{
if ( Hits < 50 )
{
PublicOverheadMessage( MessageType.Regular, 0x3B2, true, "* The solen's acid sac is burst open! *" );
m_BurstSac = true;
}
}
else if ( from != null && from != this && InRange( from, 1 ) )
{
SpillAcid( from, 1 );
}
}
base.OnDamage( amount, from, willKill );
}
public override bool OnBeforeDeath()
{
SpillAcid( 4 );
return base.OnBeforeDeath();
}
public RedSolenQueen( Serial serial ) : base( serial )
{
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write( (int) 1 );
writer.Write( m_BurstSac );
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
switch( version )
{
case 1:
{
m_BurstSac = reader.ReadBool();
break;
}
}
}
}
}

View file

@ -0,0 +1,150 @@
using System;
using System.Collections;
using Server.Items;
using Server.Network;
namespace Server.Mobiles
{
[CorpseName( "a solen warrior corpse" )]
public class RedSolenWarrior : BaseCreature
{
private bool m_BurstSac;
public bool BurstSac{ get{ return m_BurstSac; } }
[Constructable]
public RedSolenWarrior() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "a red solen warrior";
Body = 782;
BaseSoundID = 959;
SetStr( 196, 220 );
SetDex( 101, 125 );
SetInt( 36, 60 );
SetHits( 96, 107 );
SetDamage( 5, 15 );
SetDamageType( ResistanceType.Physical, 80 );
SetDamageType( ResistanceType.Poison, 20 );
SetResistance( ResistanceType.Physical, 20, 35 );
SetResistance( ResistanceType.Fire, 20, 35 );
SetResistance( ResistanceType.Cold, 10, 25 );
SetResistance( ResistanceType.Poison, 20, 35 );
SetResistance( ResistanceType.Energy, 10, 25 );
SetSkill( SkillName.MagicResist, 60.0 );
SetSkill( SkillName.Tactics, 80.0 );
SetSkill( SkillName.Wrestling, 80.0 );
Fame = 3000;
Karma = -3000;
VirtualArmor = 35;
SolenHelper.PackPicnicBasket( this );
PackItem( new ZoogiFungus( ( 0.05 < Utility.RandomDouble() )? 3 : 13 ) );
if ( Utility.RandomDouble() < 0.05 )
PackItem( new BraceletOfBinding() );
}
public override int GetAngerSound()
{
return 0xB5;
}
public override int GetIdleSound()
{
return 0xB5;
}
public override int GetAttackSound()
{
return 0x289;
}
public override int GetHurtSound()
{
return 0xBC;
}
public override int GetDeathSound()
{
return 0xE4;
}
public override void GenerateLoot()
{
AddLoot( LootPack.Rich );
AddLoot( LootPack.Gems, Utility.RandomMinMax( 1, 4 ) );
}
public override bool IsEnemy( Mobile m )
{
if ( SolenHelper.CheckRedFriendship( m ) )
return false;
else
return base.IsEnemy( m );
}
public override void OnDamage( int amount, Mobile from, bool willKill )
{
SolenHelper.OnRedDamage( from );
if ( !willKill )
{
if ( !BurstSac )
{
if ( Hits < 50 )
{
PublicOverheadMessage( MessageType.Regular, 0x3B2, true, "* The solen's acid sac is burst open! *" );
m_BurstSac = true;
}
}
else if ( from != null && from != this && InRange( from, 1 ) )
{
SpillAcid( from, 1 );
}
}
base.OnDamage( amount, from, willKill );
}
public override bool OnBeforeDeath()
{
SpillAcid( 4 );
return base.OnBeforeDeath();
}
public RedSolenWarrior( Serial serial ) : base( serial )
{
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write( (int) 1 );
writer.Write( m_BurstSac );
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
switch( version )
{
case 1:
{
m_BurstSac = reader.ReadBool();
break;
}
}
}
}
}

View file

@ -0,0 +1,111 @@
using System;
using System.Collections;
using Server.Items;
using Server.Targeting;
namespace Server.Mobiles
{
[CorpseName( "a solen worker corpse" )]
public class RedSolenWorker : BaseCreature
{
[Constructable]
public RedSolenWorker() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "a red solen worker";
Body = 781;
BaseSoundID = 959;
SetStr( 96, 120 );
SetDex( 81, 105 );
SetInt( 36, 60 );
SetHits( 58, 72 );
SetDamage( 5, 7 );
SetDamageType( ResistanceType.Physical, 100 );
SetResistance( ResistanceType.Physical, 25, 30 );
SetResistance( ResistanceType.Fire, 20, 30 );
SetResistance( ResistanceType.Cold, 10, 20 );
SetResistance( ResistanceType.Poison, 10, 20 );
SetResistance( ResistanceType.Energy, 20, 30 );
SetSkill( SkillName.MagicResist, 60.0 );
SetSkill( SkillName.Tactics, 65.0 );
SetSkill( SkillName.Wrestling, 60.0 );
Fame = 1500;
Karma = -1500;
VirtualArmor = 28;
PackGold( Utility.Random( 100, 180 ) );
SolenHelper.PackPicnicBasket( this );
PackItem( new ZoogiFungus() );
}
public override int GetAngerSound()
{
return 0x269;
}
public override int GetIdleSound()
{
return 0x269;
}
public override int GetAttackSound()
{
return 0x186;
}
public override int GetHurtSound()
{
return 0x1BE;
}
public override int GetDeathSound()
{
return 0x8E;
}
public override void GenerateLoot()
{
AddLoot( LootPack.Gems, Utility.RandomMinMax( 1, 2 ) );
}
public override bool IsEnemy( Mobile m )
{
if ( SolenHelper.CheckRedFriendship( m ) )
return false;
else
return base.IsEnemy( m );
}
public override void OnDamage( int amount, Mobile from, bool willKill )
{
SolenHelper.OnRedDamage( from );
base.OnDamage( amount, from, willKill );
}
public RedSolenWorker( 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 Server;
using Server.Items;
using Server.Network;
namespace Server.Mobiles
{
public class SolenHelper
{
public static void PackPicnicBasket( BaseCreature solen )
{
if ( 1 > Utility.Random( 100 ) )
{
PicnicBasket basket = new PicnicBasket();
basket.DropItem( new BeverageBottle( BeverageType.Wine ) );
basket.DropItem( new CheeseWedge() );
solen.PackItem( basket );
}
}
public static bool CheckRedFriendship( Mobile m )
{
if ( m is BaseCreature )
{
BaseCreature bc = (BaseCreature)m;
if ( bc.Controlled && bc.ControlMaster is PlayerMobile )
return CheckRedFriendship( bc.ControlMaster );
else if ( bc.Summoned && bc.SummonMaster is PlayerMobile )
return CheckRedFriendship( bc.SummonMaster );
}
PlayerMobile player = m as PlayerMobile;
return player != null && player.SolenFriendship == SolenFriendship.Red;
}
public static bool CheckBlackFriendship( Mobile m )
{
if ( m is BaseCreature )
{
BaseCreature bc = (BaseCreature)m;
if ( bc.Controlled && bc.ControlMaster is PlayerMobile )
return CheckBlackFriendship( bc.ControlMaster );
else if ( bc.Summoned && bc.SummonMaster is PlayerMobile )
return CheckBlackFriendship( bc.SummonMaster );
}
PlayerMobile player = m as PlayerMobile;
return player != null && player.SolenFriendship == SolenFriendship.Black;
}
public static void OnRedDamage( Mobile from )
{
if ( from is BaseCreature )
{
BaseCreature bc = (BaseCreature)from;
if ( bc.Controlled && bc.ControlMaster is PlayerMobile )
OnRedDamage( bc.ControlMaster );
else if ( bc.Summoned && bc.SummonMaster is PlayerMobile )
OnRedDamage( bc.SummonMaster );
}
PlayerMobile player = from as PlayerMobile;
if ( player != null && player.SolenFriendship == SolenFriendship.Red )
{
player.LocalOverheadMessage( MessageType.Regular, 0x3B2, 1054103 ); // The solen revoke their friendship. You will now be considered an intruder.
player.SolenFriendship = SolenFriendship.None;
}
}
public static void OnBlackDamage( Mobile from )
{
if ( from is BaseCreature )
{
BaseCreature bc = (BaseCreature)from;
if ( bc.Controlled && bc.ControlMaster is PlayerMobile )
OnBlackDamage( bc.ControlMaster );
else if ( bc.Summoned && bc.SummonMaster is PlayerMobile )
OnBlackDamage( bc.SummonMaster );
}
PlayerMobile player = from as PlayerMobile;
if ( player != null && player.SolenFriendship == SolenFriendship.Black )
{
player.LocalOverheadMessage( MessageType.Regular, 0x3B2, 1054103 ); // The solen revoke their friendship. You will now be considered an intruder.
player.SolenFriendship = SolenFriendship.None;
}
}
}
}

View file

@ -0,0 +1,77 @@
using System;
using Server;
using Server.Items;
namespace Server.Mobiles
{
[CorpseName( "a dread spider corpse" )]
public class DreadSpider : BaseCreature
{
[Constructable]
public DreadSpider () : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "a dread spider";
Body = 11;
BaseSoundID = 1170;
SetStr( 196, 220 );
SetDex( 126, 145 );
SetInt( 286, 310 );
SetHits( 118, 132 );
SetDamage( 5, 17 );
SetDamageType( ResistanceType.Physical, 20 );
SetDamageType( ResistanceType.Poison, 80 );
SetResistance( ResistanceType.Physical, 40, 50 );
SetResistance( ResistanceType.Fire, 20, 30 );
SetResistance( ResistanceType.Cold, 20, 30 );
SetResistance( ResistanceType.Poison, 90, 100 );
SetResistance( ResistanceType.Energy, 20, 30 );
SetSkill( SkillName.EvalInt, 65.1, 80.0 );
SetSkill( SkillName.Magery, 65.1, 80.0 );
SetSkill( SkillName.Meditation, 65.1, 80.0 );
SetSkill( SkillName.MagicResist, 45.1, 60.0 );
SetSkill( SkillName.Tactics, 55.1, 70.0 );
SetSkill( SkillName.Wrestling, 60.1, 75.0 );
Fame = 5000;
Karma = -5000;
VirtualArmor = 36;
PackItem( new SpidersSilk( 8 ) );
}
public override void GenerateLoot()
{
AddLoot( LootPack.FilthyRich );
}
public override Poison PoisonImmune{ get{ return Poison.Lethal; } }
public override Poison HitPoison{ get{ return Poison.Lethal; } }
public override int TreasureMapLevel{ get{ return 3; } }
public DreadSpider( 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();
if ( BaseSoundID == 263 )
BaseSoundID = 1170;
}
}
}

View file

@ -0,0 +1,82 @@
using System;
using Server;
using Server.Items;
namespace Server.Mobiles
{
[CorpseName( "a terathan avenger corpse" )]
public class TerathanAvenger : BaseCreature
{
[Constructable]
public TerathanAvenger() : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "a terathan avenger";
Body = 152;
BaseSoundID = 0x24D;
SetStr( 467, 645 );
SetDex( 77, 95 );
SetInt( 126, 150 );
SetHits( 296, 372 );
SetMana( 46, 70 );
SetDamage( 18, 22 );
SetDamageType( ResistanceType.Physical, 50 );
SetDamageType( ResistanceType.Poison, 50 );
SetResistance( ResistanceType.Physical, 40, 50 );
SetResistance( ResistanceType.Fire, 30, 40 );
SetResistance( ResistanceType.Cold, 35, 45 );
SetResistance( ResistanceType.Poison, 90, 100 );
SetResistance( ResistanceType.Energy, 35, 45 );
SetSkill( SkillName.EvalInt, 70.3, 100.0 );
SetSkill( SkillName.Magery, 70.3, 100.0 );
SetSkill( SkillName.Poisoning, 60.1, 80.0 );
SetSkill( SkillName.MagicResist, 65.1, 80.0 );
SetSkill( SkillName.Tactics, 90.1, 100.0 );
SetSkill( SkillName.Wrestling, 90.1, 100.0 );
Fame = 15000;
Karma = -15000;
VirtualArmor = 50;
}
public override void GenerateLoot()
{
AddLoot( LootPack.Rich, 2 );
}
public override Poison PoisonImmune{ get{ return Poison.Deadly; } }
public override Poison HitPoison{ get{ return Poison.Deadly; } }
public override int TreasureMapLevel{ get{ return 3; } }
public override int Meat{ get{ return 2; } }
public override OppositionGroup OppositionGroup
{
get{ return OppositionGroup.TerathansAndOphidians; }
}
public TerathanAvenger( 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();
if ( BaseSoundID == 263 )
BaseSoundID = 0x24D;
}
}
}

View file

@ -0,0 +1,77 @@
using System;
using Server;
using Server.Items;
namespace Server.Mobiles
{
[CorpseName( "a terathan matriarch corpse" )]
public class TerathanMatriarch : BaseCreature
{
[Constructable]
public TerathanMatriarch() : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "a terathan matriarch";
Body = 72;
BaseSoundID = 599;
SetStr( 316, 405 );
SetDex( 96, 115 );
SetInt( 366, 455 );
SetHits( 190, 243 );
SetDamage( 11, 14 );
SetDamageType( ResistanceType.Physical, 100 );
SetResistance( ResistanceType.Physical, 45, 55 );
SetResistance( ResistanceType.Fire, 30, 40 );
SetResistance( ResistanceType.Cold, 35, 45 );
SetResistance( ResistanceType.Poison, 40, 50 );
SetResistance( ResistanceType.Energy, 35, 45 );
SetSkill( SkillName.EvalInt, 90.1, 100.0 );
SetSkill( SkillName.Magery, 90.1, 100.0 );
SetSkill( SkillName.MagicResist, 90.1, 100.0 );
SetSkill( SkillName.Tactics, 50.1, 70.0 );
SetSkill( SkillName.Wrestling, 60.1, 80.0 );
Fame = 10000;
Karma = -10000;
PackItem( new SpidersSilk( 5 ) );
PackNecroReg( Utility.RandomMinMax( 4, 10 ) );
}
public override void GenerateLoot()
{
AddLoot( LootPack.Rich );
AddLoot( LootPack.Average, 2 );
AddLoot( LootPack.MedScrolls, 2 );
AddLoot( LootPack.Potions );
}
public override int TreasureMapLevel{ get{ return 4; } }
public override OppositionGroup OppositionGroup
{
get{ return OppositionGroup.TerathansAndOphidians; }
}
public TerathanMatriarch( 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 frost spider corpse" )]
public class FrostSpider : BaseCreature
{
[Constructable]
public FrostSpider() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "a frost spider";
Body = 20;
BaseSoundID = 0x388;
SetStr( 76, 100 );
SetDex( 126, 145 );
SetInt( 36, 60 );
SetHits( 46, 60 );
SetMana( 0 );
SetDamage( 6, 16 );
SetDamageType( ResistanceType.Physical, 20 );
SetDamageType( ResistanceType.Cold, 80 );
SetResistance( ResistanceType.Physical, 25, 30 );
SetResistance( ResistanceType.Fire, 5, 10 );
SetResistance( ResistanceType.Cold, 40, 50 );
SetResistance( ResistanceType.Poison, 20, 30 );
SetResistance( ResistanceType.Energy, 10, 20 );
SetSkill( SkillName.MagicResist, 25.1, 40.0 );
SetSkill( SkillName.Tactics, 35.1, 50.0 );
SetSkill( SkillName.Wrestling, 50.1, 65.0 );
Fame = 775;
Karma = -775;
VirtualArmor = 28;
Tamable = true;
ControlSlots = 1;
MinTameSkill = 74.7;
PackItem( new SpidersSilk( 7 ) );
}
public override void GenerateLoot()
{
AddLoot( LootPack.Meager );
AddLoot( LootPack.Poor );
}
public override FoodType FavoriteFood{ get{ return FoodType.Meat; } }
public override PackInstinct PackInstinct{ get{ return PackInstinct.Arachnid; } }
public FrostSpider( 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();
if ( BaseSoundID == 387 )
BaseSoundID = 0x388;
}
}
}

View file

@ -0,0 +1,75 @@
using System;
using Server.Items;
using Server.Targeting;
using System.Collections;
namespace Server.Mobiles
{
[CorpseName( "a giant black widow spider corpse" )] // stupid corpse name
public class GiantBlackWidow : BaseCreature
{
[Constructable]
public GiantBlackWidow() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "a giant black widow";
Body = 0x9D;
BaseSoundID = 0x388; // TODO: validate
SetStr( 76, 100 );
SetDex( 96, 115 );
SetInt( 36, 60 );
SetHits( 46, 60 );
SetDamage( 5, 17 );
SetDamageType( ResistanceType.Physical, 100 );
SetResistance( ResistanceType.Physical, 20, 30 );
SetResistance( ResistanceType.Fire, 10, 20 );
SetResistance( ResistanceType.Cold, 10, 20 );
SetResistance( ResistanceType.Poison, 50, 60 );
SetResistance( ResistanceType.Energy, 10, 20 );
SetSkill( SkillName.Anatomy, 30.3, 75.0 );
SetSkill( SkillName.Poisoning, 60.1, 80.0 );
SetSkill( SkillName.MagicResist, 45.1, 60.0 );
SetSkill( SkillName.Tactics, 65.1, 80.0 );
SetSkill( SkillName.Wrestling, 70.1, 85.0 );
Fame = 3500;
Karma = -3500;
VirtualArmor = 24;
PackItem( new SpidersSilk( 5 ) );
PackItem( new LesserPoisonPotion() );
PackItem( new LesserPoisonPotion() );
}
public override void GenerateLoot()
{
AddLoot( LootPack.Average );
}
public override FoodType FavoriteFood{ get{ return FoodType.Meat; } }
public override Poison PoisonImmune{ get{ return Poison.Deadly; } }
public override Poison HitPoison{ get{ return Poison.Deadly; } }
public GiantBlackWidow( 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,75 @@
using System;
using Server.Items;
using Server.Targeting;
using System.Collections;
namespace Server.Mobiles
{
[CorpseName( "a giant spider corpse" )]
public class GiantSpider : BaseCreature
{
[Constructable]
public GiantSpider() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "a giant spider";
Body = 28;
BaseSoundID = 0x388;
SetStr( 76, 100 );
SetDex( 76, 95 );
SetInt( 36, 60 );
SetHits( 46, 60 );
SetMana( 0 );
SetDamage( 5, 13 );
SetDamageType( ResistanceType.Physical, 100 );
SetResistance( ResistanceType.Physical, 15, 20 );
SetResistance( ResistanceType.Poison, 25, 35 );
SetSkill( SkillName.Poisoning, 60.1, 80.0 );
SetSkill( SkillName.MagicResist, 25.1, 40.0 );
SetSkill( SkillName.Tactics, 35.1, 50.0 );
SetSkill( SkillName.Wrestling, 50.1, 65.0 );
Fame = 600;
Karma = -600;
VirtualArmor = 16;
Tamable = true;
ControlSlots = 1;
MinTameSkill = 59.1;
PackItem( new SpidersSilk( 5 ) );
}
public override void GenerateLoot()
{
AddLoot( LootPack.Poor );
}
public override FoodType FavoriteFood{ get{ return FoodType.Meat; } }
public override PackInstinct PackInstinct{ get{ return PackInstinct.Arachnid; } }
public override Poison PoisonImmune{ get{ return Poison.Regular; } }
public override Poison HitPoison{ get{ return Poison.Regular; } }
public GiantSpider( 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.Items;
using Server.Targeting;
using System.Collections;
namespace Server.Mobiles
{
[CorpseName( "a terathan drone corpse" )]
public class TerathanDrone : BaseCreature
{
[Constructable]
public TerathanDrone() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "a terathan drone";
Body = 71;
BaseSoundID = 594;
SetStr( 36, 65 );
SetDex( 96, 145 );
SetInt( 21, 45 );
SetHits( 22, 39 );
SetMana( 0 );
SetDamage( 6, 12 );
SetDamageType( ResistanceType.Physical, 100 );
SetResistance( ResistanceType.Physical, 20, 25 );
SetResistance( ResistanceType.Fire, 10, 20 );
SetResistance( ResistanceType.Cold, 15, 25 );
SetResistance( ResistanceType.Poison, 30, 40 );
SetResistance( ResistanceType.Energy, 15, 25 );
SetSkill( SkillName.Poisoning, 40.1, 60.0 );
SetSkill( SkillName.MagicResist, 30.1, 45.0 );
SetSkill( SkillName.Tactics, 30.1, 50.0 );
SetSkill( SkillName.Wrestling, 40.1, 50.0 );
Fame = 2000;
Karma = -2000;
VirtualArmor = 24;
PackItem( new SpidersSilk( 2 ) );
}
public override void GenerateLoot()
{
AddLoot( LootPack.Meager );
// TODO: weapon?
}
public override int Meat{ get{ return 4; } }
public override OppositionGroup OppositionGroup
{
get{ return OppositionGroup.TerathansAndOphidians; }
}
public TerathanDrone( 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();
if ( BaseSoundID == 589 )
BaseSoundID = 594;
}
}
}

View file

@ -0,0 +1,78 @@
using System;
using Server.Items;
using Server.Targeting;
using System.Collections;
namespace Server.Mobiles
{
[CorpseName( "a terathan warrior corpse" )]
public class TerathanWarrior : BaseCreature
{
[Constructable]
public TerathanWarrior() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "a terathan warrior";
Body = 70;
BaseSoundID = 589;
SetStr( 166, 215 );
SetDex( 96, 145 );
SetInt( 41, 65 );
SetHits( 100, 129 );
SetMana( 0 );
SetDamage( 7, 17 );
SetDamageType( ResistanceType.Physical, 100 );
SetResistance( ResistanceType.Physical, 30, 35 );
SetResistance( ResistanceType.Fire, 20, 30 );
SetResistance( ResistanceType.Cold, 25, 35 );
SetResistance( ResistanceType.Poison, 30, 40 );
SetResistance( ResistanceType.Energy, 25, 35 );
SetSkill( SkillName.Poisoning, 60.1, 80.0 );
SetSkill( SkillName.MagicResist, 60.1, 75.0 );
SetSkill( SkillName.Tactics, 80.1, 100.0 );
SetSkill( SkillName.Wrestling, 80.1, 90.0 );
Fame = 4000;
Karma = -4000;
VirtualArmor = 30;
if ( Core.ML && Utility.RandomDouble() < .33 )
PackItem( Engines.Plants.Seed.RandomPeculiarSeed(3) );
}
public override void GenerateLoot()
{
AddLoot( LootPack.Average );
}
public override int TreasureMapLevel{ get{ return 1; } }
public override int Meat{ get{ return 4; } }
public override OppositionGroup OppositionGroup
{
get{ return OppositionGroup.TerathansAndOphidians; }
}
public TerathanWarrior( 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,87 @@
using System;
using Server;
using Server.Items;
namespace Server.Mobiles
{
[TypeAlias( "Server.Mobiles.ToxicElemental" )]
[CorpseName( "an acid elemental corpse" )]
public class AcidElemental : BaseCreature
{
[Constructable]
public AcidElemental () : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "an acid elemental";
Body = 0x9E;
BaseSoundID = 278;
SetStr( 326, 355 );
SetDex( 66, 85 );
SetInt( 271, 295 );
SetHits( 196, 213 );
SetDamage( 9, 15 );
SetDamageType( ResistanceType.Physical, 25 );
SetDamageType( ResistanceType.Fire, 50 );
SetDamageType( ResistanceType.Energy, 25 );
SetResistance( ResistanceType.Physical, 45, 55 );
SetResistance( ResistanceType.Fire, 40, 50 );
SetResistance( ResistanceType.Cold, 20, 30 );
SetResistance( ResistanceType.Poison, 10, 20 );
SetResistance( ResistanceType.Energy, 30, 40 );
SetSkill( SkillName.Anatomy, 30.3, 60.0 );
SetSkill( SkillName.EvalInt, 70.1, 85.0 );
SetSkill( SkillName.Magery, 70.1, 85.0 );
SetSkill( SkillName.MagicResist, 60.1, 75.0 );
SetSkill( SkillName.Tactics, 80.1, 90.0 );
SetSkill( SkillName.Wrestling, 70.1, 90.0 );
Fame = 10000;
Karma = -10000;
VirtualArmor = 40;
}
public override void GenerateLoot()
{
AddLoot( LootPack.Rich );
AddLoot( LootPack.Average );
}
public override bool BleedImmune{ get{ return true; } }
public override Poison HitPoison{ get{ return Poison.Lethal; } }
public override double HitPoisonChance{ get{ return 0.6; } }
public override int TreasureMapLevel{ get{ return Core.AOS ? 2 : 3; } }
public AcidElemental( 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();
if ( BaseSoundID == 263 )
BaseSoundID = 278;
if ( Body == 13 )
Body = 0x9E;
if ( Hue == 0x4001 )
Hue = 0;
}
}
}

View file

@ -0,0 +1,82 @@
using System;
using Server;
using Server.Items;
namespace Server.Mobiles
{
[CorpseName( "an air elemental corpse" )]
public class AirElemental : BaseCreature
{
public override double DispelDifficulty{ get{ return 117.5; } }
public override double DispelFocus{ get{ return 45.0; } }
[Constructable]
public AirElemental () : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "an air elemental";
Body = 13;
Hue = 0x4001;
BaseSoundID = 655;
SetStr( 126, 155 );
SetDex( 166, 185 );
SetInt( 101, 125 );
SetHits( 76, 93 );
SetDamage( 8, 10 );
SetDamageType( ResistanceType.Physical, 20 );
SetDamageType( ResistanceType.Cold, 40 );
SetDamageType( ResistanceType.Energy, 40 );
SetResistance( ResistanceType.Physical, 35, 45 );
SetResistance( ResistanceType.Fire, 15, 25 );
SetResistance( ResistanceType.Cold, 10, 20 );
SetResistance( ResistanceType.Poison, 10, 20 );
SetResistance( ResistanceType.Energy, 25, 35 );
SetSkill( SkillName.EvalInt, 60.1, 75.0 );
SetSkill( SkillName.Magery, 60.1, 75.0 );
SetSkill( SkillName.MagicResist, 60.1, 75.0 );
SetSkill( SkillName.Tactics, 60.1, 80.0 );
SetSkill( SkillName.Wrestling, 60.1, 80.0 );
Fame = 4500;
Karma = -4500;
VirtualArmor = 40;
ControlSlots = 2;
}
public override void GenerateLoot()
{
AddLoot( LootPack.Average );
AddLoot( LootPack.Meager );
AddLoot( LootPack.LowScrolls );
AddLoot( LootPack.MedScrolls );
}
public override bool BleedImmune{ get{ return true; } }
public override int TreasureMapLevel{ get{ return 2; } }
public AirElemental( 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();
if ( BaseSoundID == 263 )
BaseSoundID = 655;
}
}
}

View file

@ -0,0 +1,72 @@
using System;
using Server;
using Server.Items;
namespace Server.Mobiles
{
[CorpseName( "a blood elemental corpse" )]
public class BloodElemental : BaseCreature
{
[Constructable]
public BloodElemental () : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "a blood elemental";
Body = 159;
BaseSoundID = 278;
SetStr( 526, 615 );
SetDex( 66, 85 );
SetInt( 226, 350 );
SetHits( 316, 369 );
SetDamage( 17, 27 );
SetDamageType( ResistanceType.Physical, 0 );
SetDamageType( ResistanceType.Poison, 50 );
SetDamageType( ResistanceType.Energy, 50 );
SetResistance( ResistanceType.Physical, 55, 65 );
SetResistance( ResistanceType.Fire, 20, 30 );
SetResistance( ResistanceType.Cold, 40, 50 );
SetResistance( ResistanceType.Poison, 50, 60 );
SetResistance( ResistanceType.Energy, 30, 40 );
SetSkill( SkillName.EvalInt, 85.1, 100.0 );
SetSkill( SkillName.Magery, 85.1, 100.0 );
SetSkill( SkillName.Meditation, 10.4, 50.0 );
SetSkill( SkillName.MagicResist, 80.1, 95.0 );
SetSkill( SkillName.Tactics, 80.1, 100.0 );
SetSkill( SkillName.Wrestling, 80.1, 100.0 );
Fame = 12500;
Karma = -12500;
VirtualArmor = 60;
}
public override void GenerateLoot()
{
AddLoot( LootPack.FilthyRich );
AddLoot( LootPack.Rich );
}
public override int TreasureMapLevel{ get{ return 5; } }
public BloodElemental( 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,83 @@
using System;
using Server;
using Server.Items;
namespace Server.Mobiles
{
[CorpseName( "an efreet corpse" )]
public class Efreet : BaseCreature
{
[Constructable]
public Efreet () : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "an efreet";
Body = 131;
BaseSoundID = 768;
SetStr( 326, 355 );
SetDex( 266, 285 );
SetInt( 171, 195 );
SetHits( 196, 213 );
SetDamage( 11, 13 );
SetDamageType( ResistanceType.Physical, 0 );
SetDamageType( ResistanceType.Fire, 50 );
SetDamageType( ResistanceType.Energy, 50 );
SetResistance( ResistanceType.Physical, 50, 60 );
SetResistance( ResistanceType.Fire, 60, 70 );
SetResistance( ResistanceType.Poison, 30, 40 );
SetResistance( ResistanceType.Energy, 40, 50 );
SetSkill( SkillName.EvalInt, 60.1, 75.0 );
SetSkill( SkillName.Magery, 60.1, 75.0 );
SetSkill( SkillName.MagicResist, 60.1, 75.0 );
SetSkill( SkillName.Tactics, 60.1, 80.0 );
SetSkill( SkillName.Wrestling, 60.1, 80.0 );
Fame = 10000;
Karma = -10000;
VirtualArmor = 56;
}
public override void GenerateLoot()
{
AddLoot( LootPack.Rich );
AddLoot( LootPack.Average );
AddLoot( LootPack.Gems );
if ( 0.02 > Utility.RandomDouble() )
{
switch ( Utility.Random( 5 ) )
{
case 0: PackItem( new DaemonArms() ); break;
case 1: PackItem( new DaemonChest() ); break;
case 2: PackItem( new DaemonGloves() ); break;
case 3: PackItem( new DaemonLegs() ); break;
case 4: PackItem( new DaemonHelm() ); break;
}
}
}
public override int TreasureMapLevel{ get{ return Core.AOS ? 4 : 5; } }
public Efreet( 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,83 @@
using System;
using Server;
using Server.Items;
namespace Server.Mobiles
{
[CorpseName( "a fire elemental corpse" )]
public class FireElemental : BaseCreature
{
public override double DispelDifficulty{ get{ return 117.5; } }
public override double DispelFocus{ get{ return 45.0; } }
[Constructable]
public FireElemental () : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "a fire elemental";
Body = 15;
BaseSoundID = 838;
SetStr( 126, 155 );
SetDex( 166, 185 );
SetInt( 101, 125 );
SetHits( 76, 93 );
SetDamage( 7, 9 );
SetDamageType( ResistanceType.Physical, 25 );
SetDamageType( ResistanceType.Fire, 75 );
SetResistance( ResistanceType.Physical, 35, 45 );
SetResistance( ResistanceType.Fire, 60, 80 );
SetResistance( ResistanceType.Cold, 5, 10 );
SetResistance( ResistanceType.Poison, 30, 40 );
SetResistance( ResistanceType.Energy, 30, 40 );
SetSkill( SkillName.EvalInt, 60.1, 75.0 );
SetSkill( SkillName.Magery, 60.1, 75.0 );
SetSkill( SkillName.MagicResist, 75.2, 105.0 );
SetSkill( SkillName.Tactics, 80.1, 100.0 );
SetSkill( SkillName.Wrestling, 70.1, 100.0 );
Fame = 4500;
Karma = -4500;
VirtualArmor = 40;
ControlSlots = 4;
PackItem( new SulfurousAsh( 3 ) );
AddItem( new LightSource() );
}
public override void GenerateLoot()
{
AddLoot( LootPack.Average );
AddLoot( LootPack.Meager );
AddLoot( LootPack.Gems );
}
public override bool BleedImmune{ get{ return true; } }
public override int TreasureMapLevel{ get{ return 2; } }
public FireElemental( 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();
if ( BaseSoundID == 274 )
BaseSoundID = 838;
}
}
}

View file

@ -0,0 +1,72 @@
using System;
using Server;
using Server.Items;
namespace Server.Mobiles
{
[CorpseName( "an ice elemental corpse" )]
public class IceElemental : BaseCreature
{
[Constructable]
public IceElemental () : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "an ice elemental";
Body = 161;
BaseSoundID = 268;
SetStr( 156, 185 );
SetDex( 96, 115 );
SetInt( 171, 192 );
SetHits( 94, 111 );
SetDamage( 10, 21 );
SetDamageType( ResistanceType.Physical, 25 );
SetDamageType( ResistanceType.Cold, 75 );
SetResistance( ResistanceType.Physical, 35, 45 );
SetResistance( ResistanceType.Fire, 5, 10 );
SetResistance( ResistanceType.Cold, 50, 60 );
SetResistance( ResistanceType.Poison, 20, 30 );
SetResistance( ResistanceType.Energy, 20, 30 );
SetSkill( SkillName.EvalInt, 10.5, 60.0 );
SetSkill( SkillName.Magery, 10.5, 60.0 );
SetSkill( SkillName.MagicResist, 30.1, 80.0 );
SetSkill( SkillName.Tactics, 70.1, 100.0 );
SetSkill( SkillName.Wrestling, 60.1, 100.0 );
Fame = 4000;
Karma = -4000;
VirtualArmor = 40;
PackItem( new BlackPearl() );
PackReg( 3 );
}
public override void GenerateLoot()
{
AddLoot( LootPack.Average, 2 );
AddLoot( LootPack.Gems, 2 );
}
public override bool BleedImmune{ get{ return true; } }
public IceElemental( 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 Server;
using Server.Items;
namespace Server.Mobiles
{
[CorpseName( "a poison elementals corpse" )]
public class PoisonElemental : BaseCreature
{
[Constructable]
public PoisonElemental () : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "a poison elemental";
Body = 162;
BaseSoundID = 263;
SetStr( 426, 515 );
SetDex( 166, 185 );
SetInt( 361, 435 );
SetHits( 256, 309 );
SetDamage( 12, 18 );
SetDamageType( ResistanceType.Physical, 10 );
SetDamageType( ResistanceType.Poison, 90 );
SetResistance( ResistanceType.Physical, 60, 70 );
SetResistance( ResistanceType.Fire, 20, 30 );
SetResistance( ResistanceType.Cold, 20, 30 );
SetResistance( ResistanceType.Poison, 100 );
SetResistance( ResistanceType.Energy, 40, 50 );
SetSkill( SkillName.EvalInt, 80.1, 95.0 );
SetSkill( SkillName.Magery, 80.1, 95.0 );
SetSkill( SkillName.Meditation, 80.2, 120.0 );
SetSkill( SkillName.Poisoning, 90.1, 100.0 );
SetSkill( SkillName.MagicResist, 85.2, 115.0 );
SetSkill( SkillName.Tactics, 80.1, 100.0 );
SetSkill( SkillName.Wrestling, 70.1, 90.0 );
Fame = 12500;
Karma = -12500;
VirtualArmor = 70;
PackItem( new Nightshade( 4 ) );
PackItem( new LesserPoisonPotion() );
}
public override void GenerateLoot()
{
AddLoot( LootPack.FilthyRich );
AddLoot( LootPack.Rich );
AddLoot( LootPack.MedScrolls );
}
public override bool BleedImmune{ get{ return true; } }
public override Poison PoisonImmune{ get{ return Poison.Lethal; } }
public override Poison HitPoison{ get{ return Poison.Lethal; } }
public override double HitPoisonChance{ get{ return 0.75; } }
public override int TreasureMapLevel{ get{ return 5; } }
public PoisonElemental( 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;
using Server.Items;
namespace Server.Mobiles
{
[CorpseName( "a water elemental corpse" )]
public class WaterElemental : BaseCreature
{
public override double DispelDifficulty{ get{ return 117.5; } }
public override double DispelFocus{ get{ return 45.0; } }
[Constructable]
public WaterElemental () : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "a water elemental";
Body = 16;
BaseSoundID = 278;
SetStr( 126, 155 );
SetDex( 66, 85 );
SetInt( 101, 125 );
SetHits( 76, 93 );
SetDamage( 7, 9 );
SetDamageType( ResistanceType.Physical, 100 );
SetResistance( ResistanceType.Physical, 35, 45 );
SetResistance( ResistanceType.Fire, 10, 25 );
SetResistance( ResistanceType.Cold, 10, 25 );
SetResistance( ResistanceType.Poison, 60, 70 );
SetResistance( ResistanceType.Energy, 5, 10 );
SetSkill( SkillName.EvalInt, 60.1, 75.0 );
SetSkill( SkillName.Magery, 60.1, 75.0 );
SetSkill( SkillName.MagicResist, 100.1, 115.0 );
SetSkill( SkillName.Tactics, 50.1, 70.0 );
SetSkill( SkillName.Wrestling, 50.1, 70.0 );
Fame = 4500;
Karma = -4500;
VirtualArmor = 40;
ControlSlots = 3;
CanSwim = true;
PackItem( new BlackPearl( 3 ) );
}
public override void GenerateLoot()
{
AddLoot( LootPack.Average );
AddLoot( LootPack.Meager );
AddLoot( LootPack.Potions );
}
public override bool BleedImmune{ get{ return true; } }
public override int TreasureMapLevel{ get{ return 2; } }
public WaterElemental( 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,81 @@
using System;
using System.Collections;
using Server.Items;
using Server.Targeting;
namespace Server.Mobiles
{
[CorpseName( "an earth elemental corpse" )]
public class EarthElemental : BaseCreature
{
public override double DispelDifficulty{ get{ return 117.5; } }
public override double DispelFocus{ get{ return 45.0; } }
[Constructable]
public EarthElemental() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "an earth elemental";
Body = 14;
BaseSoundID = 268;
SetStr( 126, 155 );
SetDex( 66, 85 );
SetInt( 71, 92 );
SetHits( 76, 93 );
SetDamage( 9, 16 );
SetDamageType( ResistanceType.Physical, 100 );
SetResistance( ResistanceType.Physical, 30, 35 );
SetResistance( ResistanceType.Fire, 10, 20 );
SetResistance( ResistanceType.Cold, 10, 20 );
SetResistance( ResistanceType.Poison, 15, 25 );
SetResistance( ResistanceType.Energy, 15, 25 );
SetSkill( SkillName.MagicResist, 50.1, 95.0 );
SetSkill( SkillName.Tactics, 60.1, 100.0 );
SetSkill( SkillName.Wrestling, 60.1, 100.0 );
Fame = 3500;
Karma = -3500;
VirtualArmor = 34;
ControlSlots = 2;
PackItem( new FertileDirt( Utility.RandomMinMax( 1, 4 ) ) );
PackItem( new MandrakeRoot() );
Item ore = new IronOre( 5 );
ore.ItemID = 0x19B7;
PackItem( ore );
}
public override void GenerateLoot()
{
AddLoot( LootPack.Average );
AddLoot( LootPack.Meager );
AddLoot( LootPack.Gems );
}
public override bool BleedImmune{ get{ return true; } }
public override int TreasureMapLevel{ get{ return 1; } }
public EarthElemental( 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,73 @@
using System;
using Server.Items;
namespace Server.Mobiles
{
[CorpseName( "a snow elemental corpse" )]
public class SnowElemental : BaseCreature
{
[Constructable]
public SnowElemental() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "a snow elemental";
Body = 163;
BaseSoundID = 263;
SetStr( 326, 355 );
SetDex( 166, 185 );
SetInt( 71, 95 );
SetHits( 196, 213 );
SetDamage( 11, 17 );
SetDamageType( ResistanceType.Physical, 20 );
SetDamageType( ResistanceType.Cold, 80 );
SetResistance( ResistanceType.Physical, 45, 55 );
SetResistance( ResistanceType.Fire, 10, 15 );
SetResistance( ResistanceType.Cold, 60, 70 );
SetResistance( ResistanceType.Poison, 25, 35 );
SetResistance( ResistanceType.Energy, 25, 35 );
SetSkill( SkillName.MagicResist, 50.1, 65.0 );
SetSkill( SkillName.Tactics, 80.1, 100.0 );
SetSkill( SkillName.Wrestling, 80.1, 100.0 );
Fame = 5000;
Karma = -5000;
VirtualArmor = 50;
PackItem( new BlackPearl( 3 ) );
Item ore = new IronOre( 3 );
ore.ItemID = 0x19B8;
PackItem( ore );
}
public override void GenerateLoot()
{
AddLoot( LootPack.Rich );
}
public override bool BleedImmune{ get{ return true; } }
public override int TreasureMapLevel{ get{ return Utility.RandomList( 2, 3 ); } }
public SnowElemental( 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,110 @@
using System;
using Server;
using Server.Items;
namespace Server.Mobiles
{
[CorpseName( "an ancient liche's corpse" )]
public class AncientLich : BaseCreature
{
[Constructable]
public AncientLich() : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = NameList.RandomName( "ancient lich" );
Body = 78;
BaseSoundID = 412;
SetStr( 216, 305 );
SetDex( 96, 115 );
SetInt( 966, 1045 );
SetHits( 560, 595 );
SetDamage( 15, 27 );
SetDamageType( ResistanceType.Physical, 20 );
SetDamageType( ResistanceType.Cold, 40 );
SetDamageType( ResistanceType.Energy, 40 );
SetResistance( ResistanceType.Physical, 55, 65 );
SetResistance( ResistanceType.Fire, 25, 30 );
SetResistance( ResistanceType.Cold, 50, 60 );
SetResistance( ResistanceType.Poison, 50, 60 );
SetResistance( ResistanceType.Energy, 25, 30 );
SetSkill( SkillName.EvalInt, 120.1, 130.0 );
SetSkill( SkillName.Magery, 120.1, 130.0 );
SetSkill( SkillName.Meditation, 100.1, 101.0 );
SetSkill( SkillName.Poisoning, 100.1, 101.0 );
SetSkill( SkillName.MagicResist, 175.2, 200.0 );
SetSkill( SkillName.Tactics, 90.1, 100.0 );
SetSkill( SkillName.Wrestling, 75.1, 100.0 );
SetSkill( SkillName.Necromancy, 120.1, 130.0 );
SetSkill( SkillName.SpiritSpeak, 120.1, 130.0 );
Fame = 23000;
Karma = -23000;
VirtualArmor = 60;
PackNecroReg( 30, 275 );
}
public override OppositionGroup OppositionGroup
{
get{ return OppositionGroup.FeyAndUndead; }
}
public override int GetIdleSound()
{
return 0x19D;
}
public override int GetAngerSound()
{
return 0x175;
}
public override int GetDeathSound()
{
return 0x108;
}
public override int GetAttackSound()
{
return 0xE2;
}
public override int GetHurtSound()
{
return 0x28B;
}
public override void GenerateLoot()
{
AddLoot( LootPack.FilthyRich, 3 );
AddLoot( LootPack.MedScrolls, 2 );
}
public override bool Unprovokable{ get{ return true; } }
public override bool BleedImmune{ get{ return true; } }
public override Poison PoisonImmune{ get{ return Poison.Lethal; } }
public override int TreasureMapLevel{ get{ return 5; } }
public AncientLich( 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,74 @@
using System;
using Server.Items;
namespace Server.Mobiles
{
[CorpseName( "an arcane daemon corpse" )]
public class ArcaneDaemon : BaseCreature
{
public override WeaponAbility GetWeaponAbility()
{
return WeaponAbility.ConcussionBlow;
}
[Constructable]
public ArcaneDaemon() : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "an arcane daemon";
Body = 0x310;
BaseSoundID = 0x47D;
SetStr( 131, 150 );
SetDex( 126, 145 );
SetInt( 301, 350 );
SetHits( 101, 115 );
SetDamage( 12, 16 );
SetDamageType( ResistanceType.Physical, 80 );
SetDamageType( ResistanceType.Fire, 20 );
SetResistance( ResistanceType.Physical, 50, 60 );
SetResistance( ResistanceType.Fire, 70, 80 );
SetResistance( ResistanceType.Cold, 10, 20 );
SetResistance( ResistanceType.Poison, 50, 60 );
SetResistance( ResistanceType.Energy, 30, 40 );
SetSkill( SkillName.MagicResist, 85.1, 95.0 );
SetSkill( SkillName.Tactics, 70.1, 80.0 );
SetSkill( SkillName.Wrestling, 60.1, 80.0 );
SetSkill( SkillName.Magery, 80.1, 90.0 );
SetSkill( SkillName.EvalInt, 70.1, 80.0 );
SetSkill( SkillName.Meditation, 70.1, 80.0 );
Fame = 7000;
Karma = -10000;
VirtualArmor = 55;
}
public override void GenerateLoot()
{
AddLoot( LootPack.Average, 2 );
}
public override Poison PoisonImmune{ get{ return Poison.Deadly; } }
public ArcaneDaemon( 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,79 @@
using System;
using Server;
using Server.Items;
namespace Server.Mobiles
{
[CorpseName( "a balron corpse" )]
public class Balron : BaseCreature
{
[Constructable]
public Balron () : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = NameList.RandomName( "balron" );
Body = 40;
BaseSoundID = 357;
SetStr( 986, 1185 );
SetDex( 177, 255 );
SetInt( 151, 250 );
SetHits( 592, 711 );
SetDamage( 22, 29 );
SetDamageType( ResistanceType.Physical, 50 );
SetDamageType( ResistanceType.Fire, 25 );
SetDamageType( ResistanceType.Energy, 25 );
SetResistance( ResistanceType.Physical, 65, 80 );
SetResistance( ResistanceType.Fire, 60, 80 );
SetResistance( ResistanceType.Cold, 50, 60 );
SetResistance( ResistanceType.Poison, 100 );
SetResistance( ResistanceType.Energy, 40, 50 );
SetSkill( SkillName.Anatomy, 25.1, 50.0 );
SetSkill( SkillName.EvalInt, 90.1, 100.0 );
SetSkill( SkillName.Magery, 95.5, 100.0 );
SetSkill( SkillName.Meditation, 25.1, 50.0 );
SetSkill( SkillName.MagicResist, 100.5, 150.0 );
SetSkill( SkillName.Tactics, 90.1, 100.0 );
SetSkill( SkillName.Wrestling, 90.1, 100.0 );
Fame = 24000;
Karma = -24000;
VirtualArmor = 90;
PackItem( new Longsword() );
}
public override void GenerateLoot()
{
AddLoot( LootPack.FilthyRich, 2 );
AddLoot( LootPack.Rich );
AddLoot( LootPack.MedScrolls, 2 );
}
public override bool CanRummageCorpses{ get{ return true; } }
public override Poison PoisonImmune{ get{ return Poison.Deadly; } }
public override int TreasureMapLevel{ get{ return 5; } }
public override int Meat{ get{ return 1; } }
public Balron( 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,188 @@
using System;
using Server;
using Server.Misc;
using Server.Items;
using Server.Network;
namespace Server.Mobiles
{
[CorpseName( "a betrayer corpse" )]
public class Betrayer : BaseCreature
{
private bool m_Stunning;
[Constructable]
public Betrayer() : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "a betrayer";
Body = 767;
SetStr( 401, 500 );
SetDex( 81, 100 );
SetInt( 151, 200 );
SetHits( 241, 300 );
SetDamage( 16, 22 );
SetDamageType( ResistanceType.Physical, 100 );
SetResistance( ResistanceType.Physical, 60, 70 );
SetResistance( ResistanceType.Fire, 60, 70 );
SetResistance( ResistanceType.Cold, 60, 70 );
SetResistance( ResistanceType.Poison, 30, 40 );
SetResistance( ResistanceType.Energy, 20, 30 );
SetSkill( SkillName.Anatomy, 90.1, 100.0 );
SetSkill( SkillName.EvalInt, 90.1, 100.0 );
SetSkill( SkillName.Magery, 50.1, 100.0 );
SetSkill( SkillName.Meditation, 90.1, 100.0 );
SetSkill( SkillName.MagicResist, 120.1, 130.0 );
SetSkill( SkillName.Tactics, 90.1, 100.0 );
SetSkill( SkillName.Wrestling, 90.1, 100.0 );
Fame = 15000;
Karma = -15000;
VirtualArmor = 65;
SpeechHue = Utility.RandomDyedHue();
PackItem( new PowerCrystal() );
if ( 0.02 > Utility.RandomDouble() )
PackItem( new BlackthornWelcomeBook() );
m_NextAbilityTime = DateTime.UtcNow + TimeSpan.FromSeconds( Utility.RandomMinMax( 5, 30 ) );
}
public override void OnDeath( Container c )
{
base.OnDeath( c );
if ( 0.05 > Utility.RandomDouble() )
{
if ( !IsParagon )
{
if ( 0.75 > Utility.RandomDouble() )
c.DropItem( DawnsMusicGear.RandomCommon );
else
c.DropItem( DawnsMusicGear.RandomUncommon );
}
else
c.DropItem( DawnsMusicGear.RandomRare );
}
}
public override int GetDeathSound()
{
return 0x423;
}
public override int GetAttackSound()
{
return 0x23B;
}
public override int GetHurtSound()
{
return 0x140;
}
public override void GenerateLoot()
{
AddLoot( LootPack.FilthyRich );
AddLoot( LootPack.Rich );
AddLoot( LootPack.Gems, 1 );
}
public override bool AlwaysMurderer{ get{ return true; } }
public override bool BardImmune{ get{ return !Core.AOS; } }
public override Poison PoisonImmune{ get{ return Poison.Lethal; } }
public override int Meat{ get{ return 1; } }
public override int TreasureMapLevel{ get{ return 5; } }
public override void OnGaveMeleeAttack( Mobile defender )
{
base.OnGaveMeleeAttack( defender );
if ( !m_Stunning && 0.3 > Utility.RandomDouble() )
{
m_Stunning = true;
defender.Animate( 21, 6, 1, true, false, 0 );
this.PlaySound( 0xEE );
defender.LocalOverheadMessage( MessageType.Regular, 0x3B2, false, "You have been stunned by a colossal blow!" );
BaseWeapon weapon = this.Weapon as BaseWeapon;
if ( weapon != null )
weapon.OnHit( this, defender );
if ( defender.Alive )
{
defender.Frozen = true;
Timer.DelayCall( TimeSpan.FromSeconds( 5.0 ), new TimerStateCallback( Recover_Callback ), defender );
}
}
}
private void Recover_Callback( object state )
{
Mobile defender = state as Mobile;
if ( defender != null )
{
defender.Frozen = false;
defender.Combatant = null;
defender.LocalOverheadMessage( MessageType.Regular, 0x3B2, false, "You recover your senses." );
}
m_Stunning = false;
}
private DateTime m_NextAbilityTime;
public override void OnActionCombat()
{
Mobile combatant = Combatant;
if ( DateTime.UtcNow < m_NextAbilityTime || combatant == null || combatant.Deleted || combatant.Map != Map || !InRange( combatant, 3 ) || !CanBeHarmful( combatant ) || !InLOS( combatant ) )
return;
m_NextAbilityTime = DateTime.UtcNow + TimeSpan.FromSeconds( Utility.RandomMinMax( 5, 30 ) );
if ( Utility.RandomBool() )
{
this.FixedParticles( 0x376A, 9, 32, 0x2539, EffectLayer.LeftHand );
this.PlaySound( 0x1DE );
foreach ( Mobile m in this.GetMobilesInRange( 2 ) )
{
if ( m != this && IsEnemy( m ) )
{
m.ApplyPoison( this, Poison.Deadly );
}
}
}
}
public Betrayer( 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,68 @@
using System;
using Server;
using Server.Items;
namespace Server.Mobiles
{
[CorpseName( "a ghostly corpse" )]
public class Bogle : BaseCreature
{
[Constructable]
public Bogle() : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "a bogle";
Body = 153;
BaseSoundID = 0x482;
SetStr( 76, 100 );
SetDex( 76, 95 );
SetInt( 36, 60 );
SetHits( 46, 60 );
SetDamage( 7, 11 );
SetSkill( SkillName.EvalInt, 55.1, 70.0 );
SetSkill( SkillName.Magery, 55.1, 70.0 );
SetSkill( SkillName.MagicResist, 55.1, 70.0 );
SetSkill( SkillName.Tactics, 45.1, 60.0 );
SetSkill( SkillName.Wrestling, 45.1, 55.0 );
Fame = 4000;
Karma = -4000;
VirtualArmor = 28;
PackItem( Loot.RandomWeapon() );
PackItem( new Bone() );
}
public override void GenerateLoot()
{
AddLoot( LootPack.Meager );
}
public override bool BleedImmune{ get{ return true; } }
public override Poison PoisonImmune{ get{ return Poison.Lethal; } }
public Bogle( Serial serial ) : base( serial )
{
}
public override OppositionGroup OppositionGroup
{
get{ return OppositionGroup.FeyAndUndead; }
}
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,83 @@
using System;
using Server;
using Server.Items;
namespace Server.Mobiles
{
[CorpseName( "a skeletal corpse" )]
public class BoneMagi : BaseCreature
{
[Constructable]
public BoneMagi() : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "a bone mage";
Body = 148;
BaseSoundID = 451;
SetStr( 76, 100 );
SetDex( 56, 75 );
SetInt( 186, 210 );
SetHits( 46, 60 );
SetDamage( 3, 7 );
SetDamageType( ResistanceType.Physical, 100 );
SetResistance( ResistanceType.Physical, 35, 40 );
SetResistance( ResistanceType.Fire, 20, 30 );
SetResistance( ResistanceType.Cold, 50, 60 );
SetResistance( ResistanceType.Poison, 20, 30 );
SetResistance( ResistanceType.Energy, 30, 40 );
SetSkill( SkillName.EvalInt, 60.1, 70.0 );
SetSkill( SkillName.Magery, 60.1, 70.0 );
SetSkill( SkillName.MagicResist, 55.1, 70.0 );
SetSkill( SkillName.Tactics, 45.1, 60.0 );
SetSkill( SkillName.Wrestling, 45.1, 55.0 );
SetSkill( SkillName.Necromancy, 89, 99.1 );
SetSkill( SkillName.SpiritSpeak, 90.0, 99.0 );
Fame = 3000;
Karma = -3000;
VirtualArmor = 38;
PackReg( 3 );
PackNecroReg( 3, 10 );
PackItem( new Bone() );
}
public override void GenerateLoot()
{
AddLoot( LootPack.Average );
AddLoot( LootPack.LowScrolls );
AddLoot( LootPack.Potions );
}
public override bool BleedImmune{ get{ return true; } }
public override OppositionGroup OppositionGroup
{
get{ return OppositionGroup.FeyAndUndead; }
}
public override Poison PoisonImmune{ get{ return Poison.Regular; } }
public BoneMagi( 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 Server;
using Server.Items;
using Server.Factions;
namespace Server.Mobiles
{
[CorpseName( "a daemon corpse" )]
public class Daemon : BaseCreature
{
public override double DispelDifficulty{ get{ return 125.0; } }
public override double DispelFocus{ get{ return 45.0; } }
public override Faction FactionAllegiance { get { return Shadowlords.Instance; } }
public override Ethics.Ethic EthicAllegiance { get { return Ethics.Ethic.Evil; } }
[Constructable]
public Daemon () : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = NameList.RandomName( "daemon" );
Body = 9;
BaseSoundID = 357;
SetStr( 476, 505 );
SetDex( 76, 95 );
SetInt( 301, 325 );
SetHits( 286, 303 );
SetDamage( 7, 14 );
SetDamageType( ResistanceType.Physical, 100 );
SetResistance( ResistanceType.Physical, 45, 60 );
SetResistance( ResistanceType.Fire, 50, 60 );
SetResistance( ResistanceType.Cold, 30, 40 );
SetResistance( ResistanceType.Poison, 20, 30 );
SetResistance( ResistanceType.Energy, 30, 40 );
SetSkill( SkillName.EvalInt, 70.1, 80.0 );
SetSkill( SkillName.Magery, 70.1, 80.0 );
SetSkill( SkillName.MagicResist, 85.1, 95.0 );
SetSkill( SkillName.Tactics, 70.1, 80.0 );
SetSkill( SkillName.Wrestling, 60.1, 80.0 );
Fame = 15000;
Karma = -15000;
VirtualArmor = 58;
ControlSlots = Core.SE ? 4 : 5;
}
public override void GenerateLoot()
{
AddLoot( LootPack.Rich );
AddLoot( LootPack.Average, 2 );
AddLoot( LootPack.MedScrolls, 2 );
}
public override bool CanRummageCorpses{ get{ return true; } }
public override Poison PoisonImmune{ get{ return Poison.Regular; } }
public override int TreasureMapLevel{ get{ return 4; } }
public override int Meat{ get{ return 1; } }
public override bool CanFly { get { return true; } }
public Daemon( 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,70 @@
using System;
using Server;
using Server.Items;
namespace Server.Mobiles
{
[CorpseName( "an elder gazer corpse" )]
public class ElderGazer : BaseCreature
{
[Constructable]
public ElderGazer () : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "an elder gazer";
Body = 22;
BaseSoundID = 377;
SetStr( 296, 325 );
SetDex( 86, 105 );
SetInt( 291, 385 );
SetHits( 178, 195 );
SetDamage( 8, 19 );
SetDamageType( ResistanceType.Physical, 50 );
SetDamageType( ResistanceType.Energy, 50 );
SetResistance( ResistanceType.Physical, 45, 55 );
SetResistance( ResistanceType.Fire, 60, 70 );
SetResistance( ResistanceType.Cold, 40, 50 );
SetResistance( ResistanceType.Poison, 40, 50 );
SetResistance( ResistanceType.Energy, 40, 50 );
SetSkill( SkillName.Anatomy, 62.0, 100.0 );
SetSkill( SkillName.EvalInt, 90.1, 100.0 );
SetSkill( SkillName.Magery, 90.1, 100.0 );
SetSkill( SkillName.MagicResist, 115.1, 130.0 );
SetSkill( SkillName.Tactics, 80.1, 100.0 );
SetSkill( SkillName.Wrestling, 80.1, 100.0 );
Fame = 12500;
Karma = -12500;
VirtualArmor = 50;
}
public override int TreasureMapLevel{ get{ return Core.AOS ? 4 : 0; } }
public override void GenerateLoot()
{
AddLoot( LootPack.FilthyRich );
}
public ElderGazer( 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,75 @@
using System;
using Server;
using Server.Misc;
using Server.Items;
namespace Server.Mobiles
{
[CorpseName( "an evil mage corpse" )]
public class EvilMage : BaseCreature
{
[Constructable]
public EvilMage() : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = NameList.RandomName( "evil mage" );
Title = "the evil mage";
Body = 124;
SetStr( 81, 105 );
SetDex( 91, 115 );
SetInt( 96, 120 );
SetHits( 49, 63 );
SetDamage( 5, 10 );
SetDamageType( ResistanceType.Physical, 100 );
SetResistance( ResistanceType.Physical, 15, 20 );
SetResistance( ResistanceType.Fire, 5, 10 );
SetResistance( ResistanceType.Poison, 5, 10 );
SetResistance( ResistanceType.Energy, 5, 10 );
SetSkill( SkillName.EvalInt, 75.1, 100.0 );
SetSkill( SkillName.Magery, 75.1, 100.0 );
SetSkill( SkillName.MagicResist, 75.0, 97.5 );
SetSkill( SkillName.Tactics, 65.0, 87.5 );
SetSkill( SkillName.Wrestling, 20.2, 60.0 );
Fame = 2500;
Karma = -2500;
VirtualArmor = 16;
PackReg( 6 );
PackItem( new Robe( Utility.RandomNeutralHue() ) ); // TODO: Proper hue
PackItem( new Sandals() );
}
public override void GenerateLoot()
{
AddLoot( LootPack.Average );
AddLoot( LootPack.MedScrolls );
}
public override bool CanRummageCorpses{ get{ return true; } }
public override bool AlwaysMurderer{ get{ return true; } }
public override int Meat{ get{ return 1; } }
public override int TreasureMapLevel{ get{ return Core.AOS ? 1 : 0; } }
public EvilMage( 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,81 @@
using System;
using Server;
using Server.Items;
namespace Server.Mobiles
{
[CorpseName( "an evil mage lord corpse" )]
public class EvilMageLord : BaseCreature
{
[Constructable]
public EvilMageLord() : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = NameList.RandomName( "evil mage lord" );
Body = Utility.RandomList( 125, 126 );
PackItem( new Robe( Utility.RandomMetalHue() ) );
PackItem( new WizardsHat( Utility.RandomMetalHue() ) );
SetStr( 81, 105 );
SetDex( 191, 215 );
SetInt( 126, 150 );
SetHits( 49, 63 );
SetDamage( 5, 10 );
SetDamageType( ResistanceType.Physical, 100 );
SetResistance( ResistanceType.Physical, 35, 40 );
SetResistance( ResistanceType.Fire, 30, 40 );
SetResistance( ResistanceType.Cold, 30, 40 );
SetResistance( ResistanceType.Poison, 30, 40 );
SetResistance( ResistanceType.Energy, 30, 40 );
SetSkill( SkillName.EvalInt, 80.2, 100.0 );
SetSkill( SkillName.Magery, 95.1, 100.0 );
SetSkill( SkillName.Meditation, 27.5, 50.0 );
SetSkill( SkillName.MagicResist, 77.5, 100.0 );
SetSkill( SkillName.Tactics, 65.0, 87.5 );
SetSkill( SkillName.Wrestling, 20.3, 80.0 );
Fame = 10500;
Karma = -10500;
VirtualArmor = 16;
PackReg( 23 );
if ( Utility.RandomBool() )
PackItem( new Shoes() );
else
PackItem( new Sandals() );
}
public override void GenerateLoot()
{
AddLoot( LootPack.Average );
AddLoot( LootPack.Meager );
AddLoot( LootPack.MedScrolls, 2 );
}
public override bool CanRummageCorpses{ get{ return true; } }
public override bool AlwaysMurderer{ get{ return true; } }
public override int Meat{ get{ return 1; } }
public override int TreasureMapLevel{ get{ return Core.AOS ? 2 : 0; } }
public EvilMageLord( 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,74 @@
using System;
using Server;
using Server.Items;
namespace Server.Mobiles
{
[CorpseName( "a charred corpse" )]
public class FireGargoyle : BaseCreature
{
[Constructable]
public FireGargoyle() : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = NameList.RandomName( "fire gargoyle" );
Body = 130;
BaseSoundID = 0x174;
SetStr( 351, 400 );
SetDex( 126, 145 );
SetInt( 226, 250 );
SetHits( 211, 240 );
SetDamage( 7, 14 );
SetDamageType( ResistanceType.Physical, 20 );
SetDamageType( ResistanceType.Fire, 80 );
SetResistance( ResistanceType.Physical, 30, 35 );
SetResistance( ResistanceType.Fire, 50, 60 );
SetResistance( ResistanceType.Poison, 20, 30 );
SetResistance( ResistanceType.Energy, 20, 30 );
SetSkill( SkillName.Anatomy, 75.1, 85.0 );
SetSkill( SkillName.EvalInt, 90.1, 105.0 );
SetSkill( SkillName.Magery, 90.1, 105.0 );
SetSkill( SkillName.Meditation, 90.1, 105.0 );
SetSkill( SkillName.MagicResist, 90.1, 105.0 );
SetSkill( SkillName.Tactics, 80.1, 100.0 );
SetSkill( SkillName.Wrestling, 40.1, 80.0 );
Fame = 3500;
Karma = -3500;
VirtualArmor = 32;
}
public override void GenerateLoot()
{
AddLoot( LootPack.Rich );
AddLoot( LootPack.Gems );
}
public override bool HasBreath{ get{ return true; } } // fire breath enabled
public override int TreasureMapLevel{ get{ return 1; } }
public override int Meat{ get{ return 1; } }
public override bool CanFly { get { return true; } }
public FireGargoyle( 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,75 @@
using System;
using Server;
using Server.Items;
namespace Server.Mobiles
{
[CorpseName( "a gargoyle corpse" )]
public class Gargoyle : BaseCreature
{
[Constructable]
public Gargoyle() : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "a gargoyle";
Body = 4;
BaseSoundID = 372;
SetStr( 146, 175 );
SetDex( 76, 95 );
SetInt( 81, 105 );
SetHits( 88, 105 );
SetDamage( 7, 14 );
SetDamageType( ResistanceType.Physical, 100 );
SetResistance( ResistanceType.Physical, 30, 35 );
SetResistance( ResistanceType.Fire, 25, 35 );
SetResistance( ResistanceType.Cold, 5, 10 );
SetResistance( ResistanceType.Poison, 15, 25 );
SetSkill( SkillName.EvalInt, 70.1, 85.0 );
SetSkill( SkillName.Magery, 70.1, 85.0 );
SetSkill( SkillName.MagicResist, 70.1, 85.0 );
SetSkill( SkillName.Tactics, 50.1, 70.0 );
SetSkill( SkillName.Wrestling, 40.1, 80.0 );
Fame = 3500;
Karma = -3500;
VirtualArmor = 32;
if ( 0.025 > Utility.RandomDouble() )
PackItem( new GargoylesPickaxe() );
}
public override bool CanFly { get { return true; } }
public override void GenerateLoot()
{
AddLoot( LootPack.Average );
AddLoot( LootPack.MedScrolls );
AddLoot( LootPack.Gems, Utility.RandomMinMax( 1, 4 ) );
}
public override int TreasureMapLevel{ get{ return 1; } }
public override int Meat{ get{ return 1; } }
public Gargoyle( 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,104 @@
using System;
using Server.Items;
namespace Server.Mobiles
{
[CorpseName( "a gargoyle corpse" )]
public class GargoyleDestroyer : BaseCreature
{
[Constructable]
public GargoyleDestroyer() : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "Gargoyle Destroyer";
Body = 0x2F3;
BaseSoundID = 0x174;
SetStr( 760, 850 );
SetDex( 102, 150 );
SetInt( 152, 200 );
SetHits( 482, 485 );
SetDamage( 7, 14 );
SetResistance( ResistanceType.Physical, 40, 60 );
SetResistance( ResistanceType.Fire, 60, 70 );
SetResistance( ResistanceType.Cold, 15, 25 );
SetResistance( ResistanceType.Poison, 15, 25 );
SetResistance( ResistanceType.Energy, 15, 25 );
SetSkill( SkillName.Wrestling, 90.1, 100.0 );
SetSkill( SkillName.Tactics, 90.1, 100.0 );
SetSkill( SkillName.MagicResist, 120.4, 160.0 );
SetSkill( SkillName.Anatomy, 50.5, 100.0 );
SetSkill( SkillName.Swords, 90.1, 100.0 );
SetSkill( SkillName.Macing, 90.1, 100.0 );
SetSkill( SkillName.Fencing, 90.1, 100.0 );
SetSkill( SkillName.Magery, 90.1, 100.0 );
SetSkill( SkillName.EvalInt, 90.1, 100.0 );
SetSkill( SkillName.Meditation, 90.1, 100.0 );
Fame = 10000;
Karma = -10000;
VirtualArmor = 50;
if ( 0.2 > Utility.RandomDouble() )
PackItem( new GargoylesPickaxe() );
}
public override void GenerateLoot()
{
AddLoot( LootPack.FilthyRich );
AddLoot( LootPack.Rich );
AddLoot( LootPack.MedScrolls );
AddLoot( LootPack.Gems, 2 );
}
public override bool BardImmune{ get{ return !Core.AOS; } }
public override int Meat{ get{ return 1; } }
public override bool CanFly { get { return true; } }
public override void OnDamagedBySpell( Mobile from )
{
if( from != null && from.Alive && 0.4 > Utility.RandomDouble() )
{
ThrowHatchet( from );
}
}
public override void OnGotMeleeAttack( Mobile attacker )
{
base.OnGotMeleeAttack( attacker );
if( attacker != null && attacker.Alive && attacker.Weapon is BaseRanged && 0.4 > Utility.RandomDouble() )
{
ThrowHatchet( attacker );
}
}
public void ThrowHatchet( Mobile to )
{
int damage = 50;
this.MovingEffect( to, 0xF43, 10, 0, false, false );
this.DoHarmful( to );
AOS.Damage( to, this, damage, 100, 0, 0, 0, 0 );
}
public GargoyleDestroyer( 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,79 @@
using System;
using Server.Items;
namespace Server.Mobiles
{
[CorpseName( "a gargoyle corpse" )]
public class GargoyleEnforcer : BaseCreature
{
public override WeaponAbility GetWeaponAbility()
{
return WeaponAbility.WhirlwindAttack;
}
[Constructable]
public GargoyleEnforcer() : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "Gargoyle Enforcer";
Body = 0x2F2;
BaseSoundID = 0x174;
SetStr( 760, 850 );
SetDex( 102, 150 );
SetInt( 152, 200 );
SetHits( 482, 485 );
SetDamage( 7, 14 );
SetResistance( ResistanceType.Physical, 40, 60 );
SetResistance( ResistanceType.Fire, 50, 60 );
SetResistance( ResistanceType.Cold, 20, 30 );
SetResistance( ResistanceType.Poison, 25, 35 );
SetResistance( ResistanceType.Energy, 15, 25 );
SetSkill( SkillName.MagicResist, 120.1, 130.0 );
SetSkill( SkillName.Tactics, 70.1, 80.0 );
SetSkill( SkillName.Wrestling, 80.1, 90.0 );
SetSkill( SkillName.Swords, 80.1, 90.0 );
SetSkill( SkillName.Anatomy, 70.1, 80.0 );
SetSkill( SkillName.Magery, 80.1, 90.0 );
SetSkill( SkillName.EvalInt, 70.3, 100.0 );
SetSkill( SkillName.Meditation, 70.3, 100.0 );
Fame = 5000;
Karma = -5000;
VirtualArmor = 50;
if ( 0.2 > Utility.RandomDouble() )
PackItem( new GargoylesPickaxe() );
}
public override bool CanFly { get { return true; } }
public override void GenerateLoot()
{
AddLoot( LootPack.Rich );
AddLoot( LootPack.MedScrolls );
}
public override int Meat{ get{ return 1; } }
public GargoyleEnforcer( 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,72 @@
using System;
using Server;
using Server.Items;
namespace Server.Mobiles
{
[CorpseName( "a gazer corpse" )]
public class Gazer : BaseCreature
{
[Constructable]
public Gazer () : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "a gazer";
Body = 22;
BaseSoundID = 377;
SetStr( 96, 125 );
SetDex( 86, 105 );
SetInt( 141, 165 );
SetHits( 58, 75 );
SetDamage( 5, 10 );
SetDamageType( ResistanceType.Physical, 100 );
SetResistance( ResistanceType.Physical, 35, 40 );
SetResistance( ResistanceType.Fire, 40, 50 );
SetResistance( ResistanceType.Cold, 20, 30 );
SetResistance( ResistanceType.Poison, 10, 20 );
SetResistance( ResistanceType.Energy, 20, 30 );
SetSkill( SkillName.EvalInt, 50.1, 65.0 );
SetSkill( SkillName.Magery, 50.1, 65.0 );
SetSkill( SkillName.MagicResist, 60.1, 75.0 );
SetSkill( SkillName.Tactics, 50.1, 70.0 );
SetSkill( SkillName.Wrestling, 50.1, 70.0 );
Fame = 3500;
Karma = -3500;
VirtualArmor = 36;
PackItem( new Nightshade( 4 ) );
}
public override void GenerateLoot()
{
AddLoot( LootPack.Average );
AddLoot( LootPack.Potions );
}
public override int TreasureMapLevel{ get{ return 1; } }
public override int Meat{ get{ return 1; } }
public Gazer( 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,95 @@
using System;
using Server;
using Server.Items;
namespace Server.Mobiles
{
[CorpseName( "a golem controller corpse" )]
public class GolemController : BaseCreature
{
[Constructable]
public GolemController() : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = NameList.RandomName( "golem controller" );
Title = "the controller";
Body = 400;
Hue = 0x455;
AddArcane( new Robe() );
AddArcane( new ThighBoots() );
AddArcane( new LeatherGloves() );
AddArcane( new Cloak() );
SetStr( 126, 150 );
SetDex( 96, 120 );
SetInt( 151, 175 );
SetHits( 76, 90 );
SetDamage( 6, 12 );
SetDamageType( ResistanceType.Physical, 100 );
SetResistance( ResistanceType.Physical, 30, 40 );
SetResistance( ResistanceType.Fire, 25, 35 );
SetResistance( ResistanceType.Cold, 35, 45 );
SetResistance( ResistanceType.Poison, 5, 15 );
SetResistance( ResistanceType.Energy, 15, 25 );
SetSkill( SkillName.EvalInt, 95.1, 100.0 );
SetSkill( SkillName.Magery, 95.1, 100.0 );
SetSkill( SkillName.Meditation, 95.1, 100.0 );
SetSkill( SkillName.MagicResist, 102.5, 125.0 );
SetSkill( SkillName.Tactics, 65.0, 87.5 );
SetSkill( SkillName.Wrestling, 65.0, 87.5 );
Fame = 4000;
Karma = -4000;
VirtualArmor = 16;
if ( 0.7 > Utility.RandomDouble() )
PackItem( new ArcaneGem() );
}
public override void GenerateLoot()
{
AddLoot( LootPack.Rich );
}
public void AddArcane( Item item )
{
if ( item is IArcaneEquip )
{
IArcaneEquip eq = (IArcaneEquip)item;
eq.CurArcaneCharges = eq.MaxArcaneCharges = 20;
}
item.Hue = ArcaneGem.DefaultArcaneHue;
item.LootType = LootType.Newbied;
AddItem( item );
}
public override bool ClickTitle{ get{ return false; } }
public override bool ShowFameTitle{ get{ return false; } }
public override bool AlwaysMurderer{ get{ return true; } }
public GolemController( 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,70 @@
using System;
using Server;
using Server.Items;
namespace Server.Mobiles
{
[CorpseName( "an ice fiend corpse" )]
public class IceFiend : BaseCreature
{
[Constructable]
public IceFiend () : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "an ice fiend";
Body = 43;
BaseSoundID = 357;
SetStr( 376, 405 );
SetDex( 176, 195 );
SetInt( 201, 225 );
SetHits( 226, 243 );
SetDamage( 8, 19 );
SetSkill( SkillName.EvalInt, 80.1, 90.0 );
SetSkill( SkillName.Magery, 80.1, 90.0 );
SetSkill( SkillName.MagicResist, 75.1, 85.0 );
SetSkill( SkillName.Tactics, 80.1, 90.0 );
SetSkill( SkillName.Wrestling, 80.1, 100.0 );
SetResistance( ResistanceType.Physical, 55, 65 );
SetResistance( ResistanceType.Fire, 10, 20 );
SetResistance( ResistanceType.Cold, 60, 70 );
SetResistance( ResistanceType.Poison, 20, 30 );
SetResistance( ResistanceType.Energy, 30, 40 );
Fame = 18000;
Karma = -18000;
VirtualArmor = 60;
}
public override void GenerateLoot()
{
AddLoot( LootPack.FilthyRich );
AddLoot( LootPack.Average );
AddLoot( LootPack.MedScrolls, 2 );
}
public override int TreasureMapLevel{ get{ return 4; } }
public override int Meat{ get{ return 1; } }
public override bool CanFly { get { return true; } }
public IceFiend( 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( "an imp corpse" )]
public class Imp : BaseCreature
{
[Constructable]
public Imp() : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "an imp";
Body = 74;
BaseSoundID = 422;
SetStr( 91, 115 );
SetDex( 61, 80 );
SetInt( 86, 105 );
SetHits( 55, 70 );
SetDamage( 10, 14 );
SetDamageType( ResistanceType.Physical, 0 );
SetDamageType( ResistanceType.Fire, 50 );
SetDamageType( ResistanceType.Poison, 50 );
SetResistance( ResistanceType.Physical, 25, 35 );
SetResistance( ResistanceType.Fire, 40, 50 );
SetResistance( ResistanceType.Cold, 20, 30 );
SetResistance( ResistanceType.Poison, 30, 40 );
SetResistance( ResistanceType.Energy, 30, 40 );
SetSkill( SkillName.EvalInt, 20.1, 30.0 );
SetSkill( SkillName.Magery, 90.1, 100.0 );
SetSkill( SkillName.MagicResist, 30.1, 50.0 );
SetSkill( SkillName.Tactics, 42.1, 50.0 );
SetSkill( SkillName.Wrestling, 40.1, 44.0 );
Fame = 2500;
Karma = -2500;
VirtualArmor = 30;
Tamable = true;
ControlSlots = 2;
MinTameSkill = 83.1;
}
public override void GenerateLoot()
{
AddLoot( LootPack.Meager );
AddLoot( LootPack.MedScrolls, 2 );
}
public override int Meat{ get{ return 1; } }
public override int Hides{ get{ return 6; } }
public override HideType HideType{ get{ return HideType.Spined; } }
public override FoodType FavoriteFood{ get{ return FoodType.Meat; } }
public override PackInstinct PackInstinct{ get{ return PackInstinct.Daemon; } }
public override bool CanFly { get { return true; } }
public Imp( 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,85 @@
using System;
using Server;
using Server.Items;
namespace Server.Mobiles
{
[CorpseName( "a liche's corpse" )]
public class Lich : BaseCreature
{
[Constructable]
public Lich() : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "a lich";
Body = 24;
BaseSoundID = 0x3E9;
SetStr( 171, 200 );
SetDex( 126, 145 );
SetInt( 276, 305 );
SetHits( 103, 120 );
SetDamage( 24, 26 );
SetDamageType( ResistanceType.Physical, 10 );
SetDamageType( ResistanceType.Cold, 40 );
SetDamageType( ResistanceType.Energy, 50 );
SetResistance( ResistanceType.Physical, 40, 60 );
SetResistance( ResistanceType.Fire, 20, 30 );
SetResistance( ResistanceType.Cold, 50, 60 );
SetResistance( ResistanceType.Poison, 55, 65 );
SetResistance( ResistanceType.Energy, 40, 50 );
SetSkill( SkillName.Necromancy, 89, 99.1 );
SetSkill( SkillName.SpiritSpeak, 90.0, 99.0 );
SetSkill( SkillName.EvalInt, 100.0 );
SetSkill( SkillName.Magery, 70.1, 80.0 );
SetSkill( SkillName.Meditation, 85.1, 95.0 );
SetSkill( SkillName.MagicResist, 80.1, 100.0 );
SetSkill( SkillName.Tactics, 70.1, 90.0 );
Fame = 8000;
Karma = -8000;
VirtualArmor = 50;
PackItem( new GnarledStaff() );
PackNecroReg( 17, 24 );
}
public override void GenerateLoot()
{
AddLoot( LootPack.Rich );
AddLoot( LootPack.MedScrolls, 2 );
}
public override OppositionGroup OppositionGroup
{
get{ return OppositionGroup.FeyAndUndead; }
}
public override bool CanRummageCorpses{ get{ return true; } }
public override bool BleedImmune{ get{ return true; } }
public override Poison PoisonImmune{ get{ return Poison.Lethal; } }
public override int TreasureMapLevel{ get{ return 3; } }
public Lich( 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,84 @@
using System;
using Server;
using Server.Items;
namespace Server.Mobiles
{
[CorpseName( "a liche's corpse" )]
public class LichLord : BaseCreature
{
[Constructable]
public LichLord() : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "a lich lord";
Body = 79;
BaseSoundID = 412;
SetStr( 416, 505 );
SetDex( 146, 165 );
SetInt( 566, 655 );
SetHits( 250, 303 );
SetDamage( 11, 13 );
SetDamageType( ResistanceType.Physical, 0 );
SetDamageType( ResistanceType.Cold, 60 );
SetDamageType( ResistanceType.Energy, 40 );
SetResistance( ResistanceType.Physical, 40, 50 );
SetResistance( ResistanceType.Fire, 30, 40 );
SetResistance( ResistanceType.Cold, 50, 60 );
SetResistance( ResistanceType.Poison, 50, 60 );
SetResistance( ResistanceType.Energy, 40, 50 );
SetSkill( SkillName.Necromancy, 90, 110.0 );
SetSkill( SkillName.SpiritSpeak, 90.0, 110.0 );
SetSkill( SkillName.EvalInt, 90.1, 100.0 );
SetSkill( SkillName.Magery, 90.1, 100.0 );
SetSkill( SkillName.MagicResist, 150.5, 200.0 );
SetSkill( SkillName.Tactics, 50.1, 70.0 );
SetSkill( SkillName.Wrestling, 60.1, 80.0 );
Fame = 18000;
Karma = -18000;
VirtualArmor = 50;
PackItem( new GnarledStaff() );
PackNecroReg( 12, 40 );
}
public override OppositionGroup OppositionGroup
{
get{ return OppositionGroup.FeyAndUndead; }
}
public override void GenerateLoot()
{
AddLoot( LootPack.FilthyRich );
AddLoot( LootPack.MedScrolls, 2 );
}
public override bool CanRummageCorpses{ get{ return true; } }
public override bool BleedImmune{ get{ return true; } }
public override Poison PoisonImmune{ get{ return Poison.Lethal; } }
public override int TreasureMapLevel{ get{ return 4; } }
public LichLord( 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,108 @@
using System;
using Server;
using Server.Misc;
using Server.Items;
namespace Server.Mobiles
{
[CorpseName( "a glowing orc corpse" )]
public class OrcishMage : BaseCreature
{
public override InhumanSpeech SpeechType{ get{ return InhumanSpeech.Orc; } }
[Constructable]
public OrcishMage () : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "an orcish mage";
Body = 140;
BaseSoundID = 0x45A;
SetStr( 116, 150 );
SetDex( 91, 115 );
SetInt( 161, 185 );
SetHits( 70, 90 );
SetDamage( 4, 14 );
SetDamageType( ResistanceType.Physical, 100 );
SetResistance( ResistanceType.Physical, 25, 35 );
SetResistance( ResistanceType.Fire, 30, 40 );
SetResistance( ResistanceType.Cold, 20, 30 );
SetResistance( ResistanceType.Poison, 30, 40 );
SetResistance( ResistanceType.Energy, 30, 40 );
SetSkill( SkillName.EvalInt, 60.1, 72.5 );
SetSkill( SkillName.Magery, 60.1, 72.5 );
SetSkill( SkillName.MagicResist, 60.1, 75.0 );
SetSkill( SkillName.Tactics, 50.1, 65.0 );
SetSkill( SkillName.Wrestling, 40.1, 50.0 );
Fame = 3000;
Karma = -3000;
VirtualArmor = 30;
PackReg( 6 );
if ( 0.05 > Utility.RandomDouble() )
PackItem( new OrcishKinMask() );
}
public override void GenerateLoot()
{
AddLoot( LootPack.Average );
AddLoot( LootPack.LowScrolls );
}
public override bool CanRummageCorpses{ get{ return true; } }
public override int TreasureMapLevel{ get{ return 1; } }
public override int Meat{ get{ return 1; } }
public override OppositionGroup OppositionGroup
{
get{ return OppositionGroup.SavagesAndOrcs; }
}
public override bool IsEnemy( Mobile m )
{
if ( m.Player && m.FindItemOnLayer( Layer.Helm ) is OrcishKinMask )
return false;
return base.IsEnemy( m );
}
public override void AggressiveAction( Mobile aggressor, bool criminal )
{
base.AggressiveAction( aggressor, criminal );
Item item = aggressor.FindItemOnLayer( Layer.Helm );
if ( item is OrcishKinMask )
{
AOS.Damage( aggressor, 50, 0, 100, 0, 0, 0 );
item.Delete();
aggressor.FixedParticles( 0x36BD, 20, 10, 5044, EffectLayer.Head );
aggressor.PlaySound( 0x307 );
}
}
public OrcishMage( 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,87 @@
using System;
using System.Collections;
using Server.Misc;
using Server.Items;
using Server.Targeting;
namespace Server.Mobiles
{
[CorpseName( "a glowing ratman corpse" )]
public class RatmanMage : BaseCreature
{
public override InhumanSpeech SpeechType{ get{ return InhumanSpeech.Ratman; } }
[Constructable]
public RatmanMage() : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = NameList.RandomName( "ratman" );
Body = 0x8F;
BaseSoundID = 437;
SetStr( 146, 180 );
SetDex( 101, 130 );
SetInt( 186, 210 );
SetHits( 88, 108 );
SetDamage( 7, 14 );
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, 10, 20 );
SetSkill( SkillName.EvalInt, 70.1, 80.0 );
SetSkill( SkillName.Magery, 70.1, 80.0 );
SetSkill( SkillName.MagicResist, 65.1, 90.0 );
SetSkill( SkillName.Tactics, 50.1, 75.0 );
SetSkill( SkillName.Wrestling, 50.1, 75.0 );
Fame = 7500;
Karma = -7500;
VirtualArmor = 44;
PackReg( 6 );
if ( 0.02 > Utility.RandomDouble() )
PackStatue();
}
public override void GenerateLoot()
{
AddLoot( LootPack.Rich );
AddLoot( LootPack.LowScrolls );
}
public override bool CanRummageCorpses{ get{ return true; } }
public override int Meat{ get{ return 1; } }
public override int Hides{ get{ return 8; } }
public override HideType HideType{ get{ return HideType.Spined; } }
public RatmanMage( 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();
if ( Body == 42 )
{
Body = 0x8F;
Hue = 0;
}
}
}
}

View file

@ -0,0 +1,290 @@
using System;
using System.Collections;
using Server;
using Server.Misc;
using Server.Items;
using Server.Spells;
namespace Server.Mobiles
{
[CorpseName( "a savage corpse" )]
public class SavageShaman : BaseCreature
{
[Constructable]
public SavageShaman() : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = NameList.RandomName( "savage shaman" );
if ( Utility.RandomBool() )
Body = 184;
else
Body = 183;
SetStr( 126, 145 );
SetDex( 91, 110 );
SetInt( 161, 185 );
SetDamage( 4, 10 );
SetDamageType( ResistanceType.Physical, 100 );
SetResistance( ResistanceType.Physical, 30, 40 );
SetResistance( ResistanceType.Fire, 20, 30 );
SetResistance( ResistanceType.Cold, 20, 30 );
SetResistance( ResistanceType.Poison, 20, 30 );
SetResistance( ResistanceType.Energy, 40, 50 );
SetSkill( SkillName.EvalInt, 77.5, 100.0 );
SetSkill( SkillName.Fencing, 62.5, 85.0 );
SetSkill( SkillName.Macing, 62.5, 85.0 );
SetSkill( SkillName.Magery, 72.5, 95.0 );
SetSkill( SkillName.Meditation, 77.5, 100.0 );
SetSkill( SkillName.MagicResist, 77.5, 100.0 );
SetSkill( SkillName.Swords, 62.5, 85.0 );
SetSkill( SkillName.Tactics, 62.5, 85.0 );
SetSkill( SkillName.Wrestling, 62.5, 85.0 );
Fame = 1000;
Karma = -1000;
PackReg( 10, 15 );
PackItem( new Bandage( Utility.RandomMinMax( 1, 15 ) ) );
if ( 0.1 > Utility.RandomDouble() )
PackItem( new TribalBerry() );
AddItem( new BoneArms() );
AddItem( new BoneLegs() );
AddItem( new DeerMask() );
}
public override void GenerateLoot()
{
AddLoot( LootPack.Average );
}
public override int Meat{ get{ return 1; } }
public override bool AlwaysMurderer{ get{ return true; } }
public override bool ShowFameTitle{ get{ return false; } }
public override OppositionGroup OppositionGroup
{
get{ return OppositionGroup.SavagesAndOrcs; }
}
public override bool IsEnemy( Mobile m )
{
if ( m.BodyMod == 183 || m.BodyMod == 184 )
return false;
return base.IsEnemy( m );
}
public override void AggressiveAction( Mobile aggressor, bool criminal )
{
base.AggressiveAction( aggressor, criminal );
if ( aggressor.BodyMod == 183 || aggressor.BodyMod == 184 )
{
AOS.Damage( aggressor, 50, 0, 100, 0, 0, 0 );
aggressor.BodyMod = 0;
aggressor.HueMod = -1;
aggressor.FixedParticles( 0x36BD, 20, 10, 5044, EffectLayer.Head );
aggressor.PlaySound( 0x307 );
aggressor.SendLocalizedMessage( 1040008 ); // Your skin is scorched as the tribal paint burns away!
if ( aggressor is PlayerMobile )
((PlayerMobile)aggressor).SavagePaintExpiration = TimeSpan.Zero;
}
}
public override void AlterMeleeDamageTo( Mobile to, ref int damage )
{
if ( to is Dragon || to is WhiteWyrm || to is SwampDragon || to is Drake || to is Nightmare || to is Hiryu || to is LesserHiryu || to is Daemon )
damage *= 3;
}
public override void OnGotMeleeAttack( Mobile attacker )
{
base.OnGotMeleeAttack( attacker );
if ( 0.1 > Utility.RandomDouble() )
BeginSavageDance();
}
public void BeginSavageDance()
{
if( this.Map == null )
return;
ArrayList list = new ArrayList();
foreach ( Mobile m in this.GetMobilesInRange( 8 ) )
{
if ( m != this && m is SavageShaman )
list.Add( m );
}
Animate( 111, 5, 1, true, false, 0 ); // Do a little dance...
if ( AIObject != null )
AIObject.NextMove = Core.TickCount + 1000;
if ( list.Count >= 3 )
{
for ( int i = 0; i < list.Count; ++i )
{
SavageShaman dancer = (SavageShaman)list[i];
dancer.Animate( 111, 5, 1, true, false, 0 ); // Get down tonight...
if ( dancer.AIObject != null )
dancer.AIObject.NextMove = Core.TickCount + 1000;
}
Timer.DelayCall( TimeSpan.FromSeconds( 1.0 ), new TimerCallback( EndSavageDance ) );
}
}
public void EndSavageDance()
{
if ( Deleted )
return;
ArrayList list = new ArrayList();
foreach ( Mobile m in this.GetMobilesInRange( 8 ) )
list.Add( m );
if ( list.Count > 0 )
{
switch ( Utility.Random( 3 ) )
{
case 0: /* greater heal */
{
foreach ( Mobile m in list )
{
bool isFriendly = ( m is Savage || m is SavageRider || m is SavageShaman || m is SavageRidgeback );
if ( !isFriendly )
continue;
if ( m.Poisoned || MortalStrike.IsWounded( m ) || !CanBeBeneficial( m ) )
continue;
DoBeneficial( m );
// Algorithm: (40% of magery) + (1-10)
int toHeal = (int)(Skills[SkillName.Magery].Value * 0.4);
toHeal += Utility.Random( 1, 10 );
m.Heal( toHeal, this );
m.FixedParticles( 0x376A, 9, 32, 5030, EffectLayer.Waist );
m.PlaySound( 0x202 );
}
break;
}
case 1: /* lightning */
{
foreach ( Mobile m in list )
{
bool isFriendly = ( m is Savage || m is SavageRider || m is SavageShaman || m is SavageRidgeback );
if ( isFriendly )
continue;
if ( !CanBeHarmful( m ) )
continue;
DoHarmful( m );
double damage;
if ( Core.AOS )
{
int baseDamage = 6 + (int)(Skills[SkillName.EvalInt].Value / 5.0);
damage = Utility.RandomMinMax( baseDamage, baseDamage + 3 );
}
else
{
damage = Utility.Random( 12, 9 );
}
m.BoltEffect( 0 );
SpellHelper.Damage( TimeSpan.FromSeconds( 0.25 ), m, this, damage, 0, 0, 0, 0, 100 );
}
break;
}
case 2: /* poison */
{
foreach ( Mobile m in list )
{
bool isFriendly = ( m is Savage || m is SavageRider || m is SavageShaman || m is SavageRidgeback );
if ( isFriendly )
continue;
if ( !CanBeHarmful( m ) )
continue;
DoHarmful( m );
if ( m.Spell != null )
m.Spell.OnCasterHurt();
m.Paralyzed = false;
double total = Skills[SkillName.Magery].Value + Skills[SkillName.Poisoning].Value;
double dist = GetDistanceToSqrt( m );
if ( dist >= 3.0 )
total -= (dist - 3.0) * 10.0;
int level;
if ( total >= 200.0 && Utility.Random( 1, 100 ) <= 10 )
level = 3;
else if ( total > 170.0 )
level = 2;
else if ( total > 130.0 )
level = 1;
else
level = 0;
m.ApplyPoison( this, Poison.GetPoison( level ) );
m.FixedParticles( 0x374A, 10, 15, 5021, EffectLayer.Waist );
m.PlaySound( 0x474 );
}
break;
}
}
}
}
public SavageShaman( 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,77 @@
using System;
using Server;
using Server.Items;
namespace Server.Mobiles
{
[CorpseName( "a ghostly corpse" )]
public class Shade : BaseCreature
{
[Constructable]
public Shade() : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "a shade";
Body = 26;
Hue = 0x4001;
BaseSoundID = 0x482;
SetStr( 76, 100 );
SetDex( 76, 95 );
SetInt( 36, 60 );
SetHits( 46, 60 );
SetDamage( 7, 11 );
SetDamageType( ResistanceType.Physical, 50 );
SetDamageType( ResistanceType.Cold, 50 );
SetResistance( ResistanceType.Physical, 25, 30 );
SetResistance( ResistanceType.Cold, 15, 25 );
SetResistance( ResistanceType.Poison, 10, 20 );
SetSkill( SkillName.EvalInt, 55.1, 70.0 );
SetSkill( SkillName.Magery, 55.1, 70.0 );
SetSkill( SkillName.MagicResist, 55.1, 70.0 );
SetSkill( SkillName.Tactics, 45.1, 60.0 );
SetSkill( SkillName.Wrestling, 45.1, 55.0 );
Fame = 4000;
Karma = -4000;
VirtualArmor = 28;
PackReg( 10 );
}
public override void GenerateLoot()
{
AddLoot( LootPack.Meager );
}
public override bool BleedImmune{ get{ return true; } }
public override OppositionGroup OppositionGroup
{
get{ return OppositionGroup.FeyAndUndead; }
}
public override Poison PoisonImmune{ get{ return Poison.Lethal; } }
public Shade( 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 Server;
using Server.Items;
namespace Server.Mobiles
{
[CorpseName( "a skeletal corpse" )]
public class SkeletalMage : BaseCreature
{
[Constructable]
public SkeletalMage() : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "a skeletal mage";
Body = 148;
BaseSoundID = 451;
SetStr( 76, 100 );
SetDex( 56, 75 );
SetInt( 186, 210 );
SetHits( 46, 60 );
SetDamage( 3, 7 );
SetDamageType( ResistanceType.Physical, 100 );
SetResistance( ResistanceType.Physical, 35, 40 );
SetResistance( ResistanceType.Fire, 20, 30 );
SetResistance( ResistanceType.Cold, 50, 60 );
SetResistance( ResistanceType.Poison, 20, 30 );
SetResistance( ResistanceType.Energy, 30, 40 );
SetSkill( SkillName.EvalInt, 60.1, 70.0 );
SetSkill( SkillName.Magery, 60.1, 70.0 );
SetSkill( SkillName.MagicResist, 55.1, 70.0 );
SetSkill( SkillName.Tactics, 45.1, 60.0 );
SetSkill( SkillName.Wrestling, 45.1, 55.0 );
SetSkill( SkillName.Necromancy, 89, 99.1 );
SetSkill( SkillName.SpiritSpeak, 90.0, 99.0 );
Fame = 3000;
Karma = -3000;
VirtualArmor = 38;
PackReg( 3 );
PackNecroReg( 3, 10 );
PackItem( new Bone() );
}
public override void GenerateLoot()
{
AddLoot( LootPack.Average );
AddLoot( LootPack.LowScrolls );
AddLoot( LootPack.Potions );
}
public override bool BleedImmune{ get{ return true; } }
public override OppositionGroup OppositionGroup
{
get{ return OppositionGroup.FeyAndUndead; }
}
public override Poison PoisonImmune{ get{ return Poison.Regular; } }
public SkeletalMage( 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,77 @@
using System;
using Server;
using Server.Items;
namespace Server.Mobiles
{
[CorpseName( "a ghostly corpse" )]
public class Spectre : BaseCreature
{
[Constructable]
public Spectre() : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "a spectre";
Body = 26;
Hue = 0x4001;
BaseSoundID = 0x482;
SetStr( 76, 100 );
SetDex( 76, 95 );
SetInt( 36, 60 );
SetHits( 46, 60 );
SetDamage( 7, 11 );
SetDamageType( ResistanceType.Physical, 50 );
SetDamageType( ResistanceType.Cold, 50 );
SetResistance( ResistanceType.Physical, 25, 30 );
SetResistance( ResistanceType.Cold, 15, 25 );
SetResistance( ResistanceType.Poison, 10, 20 );
SetSkill( SkillName.EvalInt, 55.1, 70.0 );
SetSkill( SkillName.Magery, 55.1, 70.0 );
SetSkill( SkillName.MagicResist, 55.1, 70.0 );
SetSkill( SkillName.Tactics, 45.1, 60.0 );
SetSkill( SkillName.Wrestling, 45.1, 55.0 );
Fame = 4000;
Karma = -4000;
VirtualArmor = 28;
PackReg( 10 );
}
public override void GenerateLoot()
{
AddLoot( LootPack.Meager );
}
public override bool BleedImmune{ get{ return true; } }
public override OppositionGroup OppositionGroup
{
get{ return OppositionGroup.FeyAndUndead; }
}
public override Poison PoisonImmune{ get{ return Poison.Lethal; } }
public Spectre( 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,120 @@
using System;
using System.Collections;
using Server;
using Server.Items;
namespace Server.Mobiles
{
[CorpseName( "a succubus corpse" )]
public class Succubus : BaseCreature
{
[Constructable]
public Succubus () : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "a succubus";
Body = 149;
BaseSoundID = 0x4B0;
SetStr( 488, 620 );
SetDex( 121, 170 );
SetInt( 498, 657 );
SetHits( 312, 353 );
SetDamage( 18, 28 );
SetDamageType( ResistanceType.Physical, 75 );
SetDamageType( ResistanceType.Energy, 25 );
SetResistance( ResistanceType.Physical, 80, 90 );
SetResistance( ResistanceType.Fire, 70, 80 );
SetResistance( ResistanceType.Cold, 40, 50 );
SetResistance( ResistanceType.Poison, 50, 60 );
SetResistance( ResistanceType.Energy, 50, 60 );
SetSkill( SkillName.EvalInt, 90.1, 100.0 );
SetSkill( SkillName.Magery, 99.1, 100.0 );
SetSkill( SkillName.Meditation, 90.1, 100.0 );
SetSkill( SkillName.MagicResist, 100.5, 150.0 );
SetSkill( SkillName.Tactics, 80.1, 90.0 );
SetSkill( SkillName.Wrestling, 80.1, 90.0 );
Fame = 24000;
Karma = -24000;
VirtualArmor = 80;
}
public override void GenerateLoot()
{
AddLoot( LootPack.FilthyRich, 2 );
AddLoot( LootPack.MedScrolls, 2 );
}
public override int Meat{ get{ return 1; } }
public override int TreasureMapLevel{ get{ return 5; } }
public void DrainLife()
{
ArrayList list = new ArrayList();
foreach ( Mobile m in this.GetMobilesInRange( 2 ) )
{
if ( m == this || !CanBeHarmful( m ) )
continue;
if ( m is BaseCreature && (((BaseCreature)m).Controlled || ((BaseCreature)m).Summoned || ((BaseCreature)m).Team != this.Team) )
list.Add( m );
else if ( m.Player )
list.Add( m );
}
foreach ( Mobile m in list )
{
DoHarmful( m );
m.FixedParticles( 0x374A, 10, 15, 5013, 0x496, 0, EffectLayer.Waist );
m.PlaySound( 0x231 );
//m.SendMessage( "You feel the life drain out of you!" );
int toDrain = Utility.RandomMinMax( 10, 40 );
Hits += toDrain;
m.Damage( toDrain, this );
}
}
public override void OnGaveMeleeAttack( Mobile defender )
{
base.OnGaveMeleeAttack( defender );
if ( 0.1 >= Utility.RandomDouble() )
DrainLife();
}
public override void OnGotMeleeAttack( Mobile attacker )
{
base.OnGotMeleeAttack( attacker );
if ( 0.1 >= Utility.RandomDouble() )
DrainLife();
}
public Succubus( 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,75 @@
using System;
using Server;
using Server.Items;
namespace Server.Mobiles
{
[CorpseName( "a titans corpse" )]
public class Titan : BaseCreature
{
[Constructable]
public Titan() : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "a titan";
Body = 76;
BaseSoundID = 609;
SetStr( 536, 585 );
SetDex( 126, 145 );
SetInt( 281, 305 );
SetHits( 322, 351 );
SetDamage( 13, 16 );
SetDamageType( ResistanceType.Physical, 100 );
SetResistance( ResistanceType.Physical, 35, 45 );
SetResistance( ResistanceType.Fire, 30, 40 );
SetResistance( ResistanceType.Cold, 25, 35 );
SetResistance( ResistanceType.Poison, 30, 40 );
SetResistance( ResistanceType.Energy, 30, 40 );
SetSkill( SkillName.EvalInt, 85.1, 100.0 );
SetSkill( SkillName.Magery, 85.1, 100.0 );
SetSkill( SkillName.MagicResist, 80.2, 110.0 );
SetSkill( SkillName.Tactics, 60.1, 80.0 );
SetSkill( SkillName.Wrestling, 40.1, 50.0 );
Fame = 11500;
Karma = -11500;
VirtualArmor = 40;
if ( Core.ML && Utility.RandomDouble() < .33 )
PackItem( Engines.Plants.Seed.RandomPeculiarSeed(1) );
}
public override void GenerateLoot()
{
AddLoot( LootPack.FilthyRich );
AddLoot( LootPack.Average );
AddLoot( LootPack.MedScrolls );
}
public override int Meat{ get{ return 4; } }
public override Poison PoisonImmune{ get{ return Poison.Regular; } }
public override int TreasureMapLevel{ get{ return 5; } }
public Titan( 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,77 @@
using System;
using Server;
using Server.Items;
namespace Server.Mobiles
{
[CorpseName( "a ghostly corpse" )]
public class Wraith : BaseCreature
{
[Constructable]
public Wraith() : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "a wraith";
Body = 26;
Hue = 0x4001;
BaseSoundID = 0x482;
SetStr( 76, 100 );
SetDex( 76, 95 );
SetInt( 36, 60 );
SetHits( 46, 60 );
SetDamage( 7, 11 );
SetDamageType( ResistanceType.Physical, 50 );
SetDamageType( ResistanceType.Cold, 50 );
SetResistance( ResistanceType.Physical, 25, 30 );
SetResistance( ResistanceType.Cold, 15, 25 );
SetResistance( ResistanceType.Poison, 10, 20 );
SetSkill( SkillName.EvalInt, 55.1, 70.0 );
SetSkill( SkillName.Magery, 55.1, 70.0 );
SetSkill( SkillName.MagicResist, 55.1, 70.0 );
SetSkill( SkillName.Tactics, 45.1, 60.0 );
SetSkill( SkillName.Wrestling, 45.1, 55.0 );
Fame = 4000;
Karma = -4000;
VirtualArmor = 28;
PackReg( 10 );
}
public override void GenerateLoot()
{
AddLoot( LootPack.Meager );
}
public override bool BleedImmune{ get{ return true; } }
public override OppositionGroup OppositionGroup
{
get{ return OppositionGroup.FeyAndUndead; }
}
public override Poison PoisonImmune{ get{ return Poison.Lethal; } }
public Wraith( 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,72 @@
using System;
using System.Collections;
using Server.Items;
using Server.Targeting;
namespace Server.Mobiles
{
[CorpseName( "a frozen ogre lord's corpse" )]
[TypeAlias( "Server.Mobiles.ArticOgreLord" )]
public class ArcticOgreLord : BaseCreature
{
[Constructable]
public ArcticOgreLord() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "an arctic ogre lord";
Body = 135;
BaseSoundID = 427;
SetStr( 767, 945 );
SetDex( 66, 75 );
SetInt( 46, 70 );
SetHits( 476, 552 );
SetDamage( 20, 25 );
SetDamageType( ResistanceType.Physical, 30 );
SetDamageType( ResistanceType.Cold, 70 );
SetResistance( ResistanceType.Physical, 45, 55 );
SetResistance( ResistanceType.Cold, 60, 70 );
SetResistance( ResistanceType.Poison, 100 );
SetResistance( ResistanceType.Energy, 40, 50 );
SetSkill( SkillName.MagicResist, 125.1, 140.0 );
SetSkill( SkillName.Tactics, 90.1, 100.0 );
SetSkill( SkillName.Wrestling, 90.1, 100.0 );
Fame = 15000;
Karma = -15000;
VirtualArmor = 50;
PackItem( new Club() );
}
public override void GenerateLoot()
{
AddLoot( LootPack.FilthyRich );
AddLoot( LootPack.Rich );
}
public override Poison PoisonImmune{ get{ return Poison.Regular; } }
public override int TreasureMapLevel{ get{ return 3; } }
public ArcticOgreLord( 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,88 @@
using System;
using System.Collections;
using Server.Items;
using Server.Targeting;
namespace Server.Mobiles
{
[CorpseName( "a skeletal corpse" )]
public class BoneKnight : BaseCreature
{
[Constructable]
public BoneKnight() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "a bone knight";
Body = 57;
BaseSoundID = 451;
SetStr( 196, 250 );
SetDex( 76, 95 );
SetInt( 36, 60 );
SetHits( 118, 150 );
SetDamage( 8, 18 );
SetDamageType( ResistanceType.Physical, 40 );
SetDamageType( ResistanceType.Cold, 60 );
SetResistance( ResistanceType.Physical, 35, 45 );
SetResistance( ResistanceType.Fire, 20, 30 );
SetResistance( ResistanceType.Cold, 50, 60 );
SetResistance( ResistanceType.Poison, 20, 30 );
SetResistance( ResistanceType.Energy, 30, 40 );
SetSkill( SkillName.MagicResist, 65.1, 80.0 );
SetSkill( SkillName.Tactics, 85.1, 100.0 );
SetSkill( SkillName.Wrestling, 85.1, 95.0 );
Fame = 3000;
Karma = -3000;
VirtualArmor = 40;
switch ( Utility.Random( 6 ) )
{
case 0: PackItem( new PlateArms() ); break;
case 1: PackItem( new PlateChest() ); break;
case 2: PackItem( new PlateGloves() ); break;
case 3: PackItem( new PlateGorget() ); break;
case 4: PackItem( new PlateLegs() ); break;
case 5: PackItem( new PlateHelm() ); break;
}
PackSlayer();
PackItem( new Scimitar() );
PackItem( new WoodenShield() );
}
public override void GenerateLoot()
{
AddLoot( LootPack.Average );
AddLoot( LootPack.Meager );
}
public override bool BleedImmune{ get{ return true; } }
public BoneKnight( Serial serial ) : base( serial )
{
}
public override OppositionGroup OppositionGroup
{
get{ return OppositionGroup.FeyAndUndead; }
}
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.ContextMenus;
using Server.Misc;
using Server.Network;
namespace Server.Mobiles
{
public class Brigand : BaseCreature
{
public override bool ClickTitle{ get{ return false; } }
[Constructable]
public Brigand() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
SpeechHue = Utility.RandomDyedHue();
Title = "the brigand";
Hue = Utility.RandomSkinHue();
if ( this.Female = Utility.RandomBool() )
{
Body = 0x191;
Name = NameList.RandomName( "female" );
AddItem( new Skirt( Utility.RandomNeutralHue() ) );
}
else
{
Body = 0x190;
Name = NameList.RandomName( "male" );
AddItem( new ShortPants( Utility.RandomNeutralHue() ) );
}
SetStr( 86, 100 );
SetDex( 81, 95 );
SetInt( 61, 75 );
SetDamage( 10, 23 );
SetSkill( SkillName.Fencing, 66.0, 97.5 );
SetSkill( SkillName.Macing, 65.0, 87.5 );
SetSkill( SkillName.MagicResist, 25.0, 47.5 );
SetSkill( SkillName.Swords, 65.0, 87.5 );
SetSkill( SkillName.Tactics, 65.0, 87.5 );
SetSkill( SkillName.Wrestling, 15.0, 37.5 );
Fame = 1000;
Karma = -1000;
AddItem( new Boots( Utility.RandomNeutralHue() ) );
AddItem( new FancyShirt());
AddItem( new Bandana());
switch ( Utility.Random( 7 ))
{
case 0: AddItem( new Longsword() ); break;
case 1: AddItem( new Cutlass() ); break;
case 2: AddItem( new Broadsword() ); break;
case 3: AddItem( new Axe() ); break;
case 4: AddItem( new Club() ); break;
case 5: AddItem( new Dagger() ); break;
case 6: AddItem( new Spear() ); break;
}
Utility.AssignRandomHair( this );
}
public override void OnDeath( Container c )
{
base.OnDeath( c );
if ( Utility.RandomDouble() < 0.9 )
c.DropItem( new SeveredHumanEars() );
}
public override void GenerateLoot()
{
AddLoot( LootPack.Average );
}
public override bool AlwaysMurderer{ get{ return true; } }
public Brigand( 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,72 @@
using System;
using System.Collections;
using Server.Items;
using Server.Targeting;
namespace Server.Mobiles
{
[CorpseName( "a chaos daemon corpse" )]
public class ChaosDaemon : BaseCreature
{
public override WeaponAbility GetWeaponAbility()
{
return WeaponAbility.CrushingBlow;
}
[Constructable]
public ChaosDaemon() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "a chaos daemon";
Body = 792;
BaseSoundID = 0x3E9;
SetStr( 106, 130 );
SetDex( 171, 200 );
SetInt( 56, 80 );
SetHits( 91, 110 );
SetDamage( 12, 17 );
SetDamageType( ResistanceType.Physical, 85 );
SetDamageType( ResistanceType.Fire, 15 );
SetResistance( ResistanceType.Physical, 50, 60 );
SetResistance( ResistanceType.Fire, 60, 70 );
SetResistance( ResistanceType.Cold, 40, 50 );
SetResistance( ResistanceType.Poison, 20, 30 );
SetResistance( ResistanceType.Energy, 20, 30 );
SetSkill( SkillName.MagicResist, 85.1, 95.0 );
SetSkill( SkillName.Tactics, 70.1, 80.0 );
SetSkill( SkillName.Wrestling, 95.1, 100.0 );
Fame = 3000;
Karma = -4000;
VirtualArmor = 15;
}
public override void GenerateLoot()
{
AddLoot( LootPack.Average );
AddLoot( LootPack.Meager );
}
public ChaosDaemon( 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,85 @@
using System;
using Server.Items;
namespace Server.Mobiles
{
[CorpseName( "an inhuman corpse" )]
public class Cursed : BaseCreature
{
public override bool ClickTitle{ get{ return false; } }
public override bool ShowFameTitle{ get{ return false; } }
[Constructable]
public Cursed() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Title = "the Cursed";
Hue = Utility.RandomMinMax( 0x8596, 0x8599 );
Body = 0x190;
Name = NameList.RandomName( "male" );
BaseSoundID = 471;
AddItem( new ShortPants( Utility.RandomNeutralHue() ) );
AddItem( new Shirt( Utility.RandomNeutralHue() ) );
BaseWeapon weapon = Loot.RandomWeapon();
weapon.Movable = false;
AddItem( weapon );
SetStr( 91, 100 );
SetDex( 86, 95 );
SetInt( 61, 70 );
SetHits( 91, 120 );
SetDamage( 5, 13 );
SetResistance( ResistanceType.Physical, 15, 25 );
SetResistance( ResistanceType.Fire, 5, 10 );
SetResistance( ResistanceType.Cold, 25, 35 );
SetResistance( ResistanceType.Poison, 5, 10 );
SetResistance( ResistanceType.Energy, 5, 10 );
SetSkill( SkillName.Fencing, 46.0, 77.5 );
SetSkill( SkillName.Macing, 35.0, 57.5 );
SetSkill( SkillName.MagicResist, 53.5, 62.5 );
SetSkill( SkillName.Swords, 55.0, 77.5 );
SetSkill( SkillName.Tactics, 60.0, 82.5 );
SetSkill( SkillName.Poisoning, 60.0, 82.5 );
Fame = 1000;
Karma = -2000;
}
public override int GetAttackSound()
{
return -1;
}
public override void GenerateLoot()
{
AddLoot( LootPack.Meager );
//AddLoot( LootPack.Miscellaneous );
}
public override bool AlwaysMurderer{ get{ return true; } }
public Cursed( 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,70 @@
using System;
using System.Collections;
using Server.Items;
using Server.Targeting;
namespace Server.Mobiles
{
[CorpseName( "a cyclopean corpse" )]
public class Cyclops : BaseCreature
{
[Constructable]
public Cyclops() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "a cyclopean warrior";
Body = 75;
BaseSoundID = 604;
SetStr( 336, 385 );
SetDex( 96, 115 );
SetInt( 31, 55 );
SetHits( 202, 231 );
SetMana( 0 );
SetDamage( 7, 23 );
SetDamageType( ResistanceType.Physical, 100 );
SetResistance( ResistanceType.Physical, 45, 50 );
SetResistance( ResistanceType.Fire, 30, 40 );
SetResistance( ResistanceType.Cold, 25, 35 );
SetResistance( ResistanceType.Poison, 30, 40 );
SetResistance( ResistanceType.Energy, 30, 40 );
SetSkill( SkillName.MagicResist, 60.3, 105.0 );
SetSkill( SkillName.Tactics, 80.1, 100.0 );
SetSkill( SkillName.Wrestling, 80.1, 90.0 );
Fame = 4500;
Karma = -4500;
VirtualArmor = 48;
}
public override void GenerateLoot()
{
AddLoot( LootPack.Rich );
AddLoot( LootPack.Average );
}
public override int Meat{ get{ return 4; } }
public override int TreasureMapLevel{ get{ return 3; } }
public Cyclops( 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,64 @@
using System;
using Server.Items;
namespace Server.Mobiles
{
[CorpseName( "a doppleganger corpse" )]
public class Doppleganger : BaseCreature
{
[Constructable]
public Doppleganger() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "a doppleganger";
Body = 0x309;
BaseSoundID = 0x451;
SetStr( 81, 110 );
SetDex( 56, 75 );
SetInt( 81, 105 );
SetHits( 101, 120 );
SetDamage( 8, 12 );
SetResistance( ResistanceType.Physical, 50, 60 );
SetResistance( ResistanceType.Fire, 10, 20 );
SetResistance( ResistanceType.Cold, 40, 50 );
SetResistance( ResistanceType.Poison, 50, 60 );
SetResistance( ResistanceType.Energy, 30, 40 );
SetSkill( SkillName.MagicResist, 75.1, 85.0 );
SetSkill( SkillName.Tactics, 70.1, 80.0 );
SetSkill( SkillName.Wrestling, 80.1, 90.0 );
Fame = 1000;
Karma = -1000;
VirtualArmor = 55;
}
public override void GenerateLoot()
{
AddLoot( LootPack.Average );
}
public override int Hides{ get{ return 6; } }
public override int Meat{ get{ return 1; } }
public Doppleganger( 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 System.Collections;
using Server.Items;
using Server.ContextMenus;
using Server.Misc;
using Server.Network;
namespace Server.Mobiles
{
// TODO: Needs some Spellweaving abilities
public class ElfBrigand : BaseCreature
{
public override bool ClickTitle{ get{ return false; } }
[Constructable]
public ElfBrigand() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
SpeechHue = Utility.RandomDyedHue();
Title = "the brigand";
Race = Race.Elf;
Hue = Race.RandomSkinHue();
if ( this.Female = Utility.RandomBool() )
{
Body = 0x25E;
Name = NameList.RandomName( "female elf brigand" );
switch ( Utility.Random( 2 ) )
{
case 0: AddItem( new Skirt( Utility.RandomNondyedHue() ) ); break;
case 1: AddItem( new Kilt( Utility.RandomNondyedHue() ) ); break;
}
}
else
{
Body = 0x25D;
Name = NameList.RandomName( "male elf brigand" );
AddItem( new ShortPants( Utility.RandomNondyedHue() ) );
}
SetStr( 86, 100 );
SetDex( 81, 95 );
SetInt( 61, 75 );
SetDamage( 10, 23 );
SetSkill( SkillName.Fencing, 66.0, 97.5 );
SetSkill( SkillName.Macing, 65.0, 87.5 );
SetSkill( SkillName.MagicResist, 25.0, 47.5 );
SetSkill( SkillName.Swords, 65.0, 87.5 );
SetSkill( SkillName.Tactics, 65.0, 87.5 );
SetSkill( SkillName.Wrestling, 15.0, 37.5 );
Fame = 1000;
Karma = -1000;
switch ( Utility.Random( 4 ) )
{
case 0: AddItem( new Boots() ); break;
case 1: AddItem( new ThighBoots() ); break;
case 2: AddItem( new Sandals() ); break;
case 3: AddItem( new Shoes() ); break;
}
AddItem( new Shirt( Utility.RandomNondyedHue() ) );
switch ( Utility.Random( 7 ) )
{
case 0: AddItem( new Longsword() ); break;
case 1: AddItem( new Cutlass() ); break;
case 2: AddItem( new Broadsword() ); break;
case 3: AddItem( new Axe() ); break;
case 4: AddItem( new Club() ); break;
case 5: AddItem( new Dagger() ); break;
case 6: AddItem( new Spear() ); break;
}
Utility.AssignRandomHair( this, true );
}
public override void OnDeath( Container c )
{
base.OnDeath( c );
if ( Utility.RandomDouble() < 0.9 )
c.DropItem( new SeveredElfEars() );
}
public override void GenerateLoot()
{
AddLoot( LootPack.Average );
}
public override bool AlwaysMurderer{ get{ return true; } }
public ElfBrigand( 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,68 @@
using System;
using Server.Items;
namespace Server.Mobiles
{
[CorpseName( "an enslaved gargoyle corpse" )]
public class EnslavedGargoyle : BaseCreature
{
[Constructable]
public EnslavedGargoyle() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "an enslaved gargoyle";
Body = 0x2F1;
BaseSoundID = 0x174;
SetStr( 302, 360 );
SetDex( 76, 95 );
SetInt( 81, 105 );
SetHits( 186,212 );
SetDamage( 7, 14 );
SetResistance( ResistanceType.Physical, 30, 40 );
SetResistance( ResistanceType.Fire, 50, 70 );
SetResistance( ResistanceType.Cold, 15, 25 );
SetResistance( ResistanceType.Poison, 25, 30 );
SetResistance( ResistanceType.Energy, 25, 30 );
SetSkill( SkillName.MagicResist, 70.1, 85.0 );
SetSkill( SkillName.Tactics, 50.1, 70.0 );
SetSkill( SkillName.Wrestling, 40.1, 80.0 );
Fame = 3500;
Karma = 0;
VirtualArmor = 35;
if ( 0.2 > Utility.RandomDouble() )
PackItem( new GargoylesPickaxe() );
}
public override void GenerateLoot()
{
AddLoot( LootPack.Average, 2 );
AddLoot( LootPack.Gems );
}
public override int Meat{ get{ return 1; } }
public override int TreasureMapLevel{ get{ return 1; } }
public EnslavedGargoyle( 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,71 @@
using System;
using System.Collections;
using Server.Items;
using Server.Targeting;
namespace Server.Mobiles
{
[CorpseName( "an ettins corpse" )]
public class Ettin : BaseCreature
{
[Constructable]
public Ettin() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "an ettin";
Body = 18;
BaseSoundID = 367;
SetStr( 136, 165 );
SetDex( 56, 75 );
SetInt( 31, 55 );
SetHits( 82, 99 );
SetDamage( 7, 17 );
SetDamageType( ResistanceType.Physical, 100 );
SetResistance( ResistanceType.Physical, 35, 40 );
SetResistance( ResistanceType.Fire, 15, 25 );
SetResistance( ResistanceType.Cold, 40, 50 );
SetResistance( ResistanceType.Poison, 15, 25 );
SetResistance( ResistanceType.Energy, 15, 25 );
SetSkill( SkillName.MagicResist, 40.1, 55.0 );
SetSkill( SkillName.Tactics, 50.1, 70.0 );
SetSkill( SkillName.Wrestling, 50.1, 60.0 );
Fame = 3000;
Karma = -3000;
VirtualArmor = 38;
}
public override void GenerateLoot()
{
AddLoot( LootPack.Meager );
AddLoot( LootPack.Average );
AddLoot( LootPack.Potions );
}
public override bool CanRummageCorpses{ get{ return true; } }
public override int TreasureMapLevel{ get{ return 1; } }
public override int Meat{ get{ return 4; } }
public Ettin( 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,93 @@
using System;
using System.Collections;
using Server.Items;
using Server.ContextMenus;
using Server.Misc;
using Server.Network;
namespace Server.Mobiles
{
public class Executioner : BaseCreature
{
[Constructable]
public Executioner() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
SpeechHue = Utility.RandomDyedHue();
Title = "the executioner";
Hue = Utility.RandomSkinHue();
if ( this.Female = Utility.RandomBool() )
{
this.Body = 0x191;
this.Name = NameList.RandomName( "female" );
AddItem( new Skirt( Utility.RandomRedHue() ) );
}
else
{
this.Body = 0x190;
this.Name = NameList.RandomName( "male" );
AddItem( new ShortPants( Utility.RandomRedHue() ) );
}
SetStr( 386, 400 );
SetDex( 151, 165 );
SetInt( 161, 175 );
SetDamage( 8, 10 );
SetDamageType( ResistanceType.Physical, 100 );
SetResistance( ResistanceType.Physical, 35, 45 );
SetResistance( ResistanceType.Fire, 25, 30 );
SetResistance( ResistanceType.Cold, 25, 30 );
SetResistance( ResistanceType.Poison, 10, 20 );
SetResistance( ResistanceType.Energy, 10, 20 );
SetSkill( SkillName.Anatomy, 125.0 );
SetSkill( SkillName.Fencing, 46.0, 77.5 );
SetSkill( SkillName.Macing, 35.0, 57.5 );
SetSkill( SkillName.Poisoning, 60.0, 82.5 );
SetSkill( SkillName.MagicResist, 83.5, 92.5 );
SetSkill( SkillName.Swords, 125.0 );
SetSkill( SkillName.Tactics, 125.0 );
SetSkill( SkillName.Lumberjacking, 125.0 );
Fame = 5000;
Karma = -5000;
VirtualArmor = 40;
AddItem( new ThighBoots( Utility.RandomRedHue() ) );
AddItem( new Surcoat( Utility.RandomRedHue() ) );
AddItem( new ExecutionersAxe());
Utility.AssignRandomHair( this );
}
public override void GenerateLoot()
{
AddLoot( LootPack.FilthyRich );
AddLoot( LootPack.Meager );
}
public override bool AlwaysMurderer{ get{ return true; } }
public Executioner( 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 System.Collections;
using Server.Items;
using Server.Targeting;
namespace Server.Mobiles
{
[CorpseName( "a frost troll corpse" )]
public class FrostTroll : BaseCreature
{
[Constructable]
public FrostTroll() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "a frost troll";
Body = 55;
BaseSoundID = 461;
SetStr( 227, 265 );
SetDex( 66, 85 );
SetInt( 46, 70 );
SetHits( 140, 156 );
SetDamage( 14, 20 );
SetDamageType( ResistanceType.Physical, 75 );
SetDamageType( ResistanceType.Cold, 25 );
SetResistance( ResistanceType.Physical, 45, 55 );
SetResistance( ResistanceType.Cold, 40, 50 );
SetResistance( ResistanceType.Poison, 5, 10 );
SetResistance( ResistanceType.Energy, 5, 10 );
SetSkill( SkillName.MagicResist, 65.1, 80.0 );
SetSkill( SkillName.Tactics, 80.1, 100.0 );
SetSkill( SkillName.Wrestling, 80.1, 100.0 );
Fame = 4000;
Karma = -4000;
VirtualArmor = 50;
PackItem( new DoubleAxe() ); // TODO: Weapon??
}
public override void GenerateLoot()
{
AddLoot( LootPack.Average );
AddLoot( LootPack.Gems );
}
public override int Meat{ get{ return 2; } }
public override int TreasureMapLevel{ get{ return 1; } }
public FrostTroll( 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,64 @@
using System;
using Server;
using Server.Items;
namespace Server.Mobiles
{
[CorpseName( "a gazer larva corpse" )]
public class GazerLarva : BaseCreature
{
[Constructable]
public GazerLarva () : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "a gazer larva";
Body = 778;
BaseSoundID = 377;
SetStr( 76, 100 );
SetDex( 51, 75 );
SetInt( 56, 80 );
SetHits( 36, 47 );
SetDamage( 2, 9 );
SetDamageType( ResistanceType.Physical, 100 );
SetResistance( ResistanceType.Physical, 15, 25 );
SetSkill( SkillName.MagicResist, 70.0 );
SetSkill( SkillName.Tactics, 70.0 );
SetSkill( SkillName.Wrestling, 70.0 );
Fame = 900;
Karma = -900;
VirtualArmor = 25;
PackItem( new Nightshade( Utility.RandomMinMax( 2, 3 ) ) );
}
public override void GenerateLoot()
{
AddLoot( LootPack.Poor );
}
public override int Meat{ get{ return 1; } }
public GazerLarva( 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,75 @@
using System;
using System.Collections;
using Server.Items;
using Server.Targeting;
namespace Server.Mobiles
{
[CorpseName( "a ghostly corpse" )]
public class Ghoul : BaseCreature
{
[Constructable]
public Ghoul() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "a ghoul";
Body = 153;
BaseSoundID = 0x482;
SetStr( 76, 100 );
SetDex( 76, 95 );
SetInt( 36, 60 );
SetHits( 46, 60 );
SetMana( 0 );
SetDamage( 7, 9 );
SetDamageType( ResistanceType.Physical, 100 );
SetResistance( ResistanceType.Physical, 25, 30 );
SetResistance( ResistanceType.Cold, 20, 30 );
SetResistance( ResistanceType.Poison, 5, 10 );
SetResistance( ResistanceType.Energy, 10, 20 );
SetSkill( SkillName.MagicResist, 45.1, 60.0 );
SetSkill( SkillName.Tactics, 45.1, 60.0 );
SetSkill( SkillName.Wrestling, 45.1, 55.0 );
Fame = 2500;
Karma = -2500;
VirtualArmor = 28;
PackItem( Loot.RandomWeapon() );
}
public override void GenerateLoot()
{
AddLoot( LootPack.Meager );
}
public override bool BleedImmune{ get{ return true; } }
public override Poison PoisonImmune{ get{ return Poison.Regular; } }
public Ghoul( Serial serial ) : base( serial )
{
}
public override OppositionGroup OppositionGroup
{
get{ return OppositionGroup.FeyAndUndead; }
}
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,71 @@
using System;
using System.Collections;
using Server.Items;
using Server.Targeting;
namespace Server.Mobiles
{
[CorpseName( "a mongbat corpse" )]
public class GreaterMongbat : BaseCreature
{
[Constructable]
public GreaterMongbat() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "a greater mongbat";
Body = 39;
BaseSoundID = 422;
SetStr( 56, 80 );
SetDex( 61, 80 );
SetInt( 26, 50 );
SetHits( 34, 48 );
SetStam( 61, 80);
SetMana( 26, 50 );
SetDamage( 5, 7 );
SetDamageType( ResistanceType.Physical, 100 );
SetResistance( ResistanceType.Physical, 15, 25 );
SetSkill( SkillName.MagicResist, 15.1, 30.0 );
SetSkill( SkillName.Tactics, 35.1, 50.0 );
SetSkill( SkillName.Wrestling, 20.1, 35.0 );
Fame = 450;
Karma = -450;
VirtualArmor = 10;
Tamable = true;
ControlSlots = 1;
MinTameSkill = 71.1;
}
public override void GenerateLoot()
{
AddLoot( LootPack.Poor );
}
public override int Meat{ get{ return 1; } }
public override int Hides{ get{ return 6; } }
public override FoodType FavoriteFood{ get{ return FoodType.Meat; } }
public GreaterMongbat( 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,91 @@
using System;
using System.Collections;
using Server.Misc;
using Server.Items;
using Server.Mobiles;
namespace Server.Mobiles
{
public class Guardian : BaseCreature
{
[Constructable]
public Guardian() : base( AIType.AI_Archer, FightMode.Aggressor, 10, 1, 0.2, 0.4 )
{
InitStats( 100, 125, 25 );
Title = "the guardian";
SpeechHue = Utility.RandomDyedHue();
Hue = Utility.RandomSkinHue();
if ( Female = Utility.RandomBool() )
{
Body = 0x191;
Name = NameList.RandomName( "female" );
}
else
{
Body = 0x190;
Name = NameList.RandomName( "male" );
}
new ForestOstard().Rider = this;
PlateChest chest = new PlateChest();
chest.Hue = 0x966;
AddItem( chest );
PlateArms arms = new PlateArms();
arms.Hue = 0x966;
AddItem( arms );
PlateGloves gloves = new PlateGloves();
gloves.Hue = 0x966;
AddItem( gloves );
PlateGorget gorget = new PlateGorget();
gorget.Hue = 0x966;
AddItem( gorget );
PlateLegs legs = new PlateLegs();
legs.Hue = 0x966;
AddItem( legs );
PlateHelm helm = new PlateHelm();
helm.Hue = 0x966;
AddItem( helm );
Bow bow = new Bow();
bow.Movable = false;
bow.Crafter = this;
bow.Quality = WeaponQuality.Exceptional;
AddItem( bow );
PackItem( new Arrow( 250 ) );
PackGold( 250, 500 );
Skills[SkillName.Anatomy].Base = 120.0;
Skills[SkillName.Tactics].Base = 120.0;
Skills[SkillName.Archery].Base = 120.0;
Skills[SkillName.MagicResist].Base = 120.0;
Skills[SkillName.DetectHidden].Base = 100.0;
}
public Guardian( 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,66 @@
using System;
using System.Collections;
using Server.Items;
using Server.Targeting;
namespace Server.Mobiles
{
[CorpseName( "a headless corpse" )]
public class HeadlessOne : BaseCreature
{
[Constructable]
public HeadlessOne() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "a headless one";
Body = 31;
Hue = Utility.RandomSkinHue() & 0x7FFF;
BaseSoundID = 0x39D;
SetStr( 26, 50 );
SetDex( 36, 55 );
SetInt( 16, 30 );
SetHits( 16, 30 );
SetDamage( 5, 10 );
SetDamageType( ResistanceType.Physical, 100 );
SetResistance( ResistanceType.Physical, 15, 20 );
SetSkill( SkillName.MagicResist, 15.1, 20.0 );
SetSkill( SkillName.Tactics, 25.1, 40.0 );
SetSkill( SkillName.Wrestling, 25.1, 40.0 );
Fame = 450;
Karma = -450;
VirtualArmor = 18;
}
public override void GenerateLoot()
{
AddLoot( LootPack.Poor );
// TODO: body parts
}
public override bool CanRummageCorpses{ get{ return true; } }
public override int Meat{ get{ return 1; } }
public HeadlessOne( 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,87 @@
using System;
using System.Collections;
using Server.Items;
using Server.Targeting;
namespace Server.Mobiles
{
[CorpseName( "a horde minion corpse" )]
public class HordeMinion : BaseCreature
{
[Constructable]
public HordeMinion () : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "a horde minion";
Body = 776;
BaseSoundID = 357;
SetStr( 16, 40 );
SetDex( 31, 60 );
SetInt( 11, 25 );
SetHits( 10, 24 );
SetDamage( 5, 10 );
SetDamageType( ResistanceType.Physical, 100 );
SetResistance( ResistanceType.Physical, 15, 20 );
SetResistance( ResistanceType.Fire, 5, 10 );
SetSkill( SkillName.MagicResist, 10.0 );
SetSkill( SkillName.Tactics, 0.1, 15.0 );
SetSkill( SkillName.Wrestling, 25.1, 40.0 );
Fame = 500;
Karma = -500;
VirtualArmor = 18;
AddItem( new LightSource() );
PackItem( new Bone( 3 ) );
// TODO: Body parts
}
public override int GetIdleSound()
{
return 338;
}
public override int GetAngerSound()
{
return 338;
}
public override int GetDeathSound()
{
return 338;
}
public override int GetAttackSound()
{
return 406;
}
public override int GetHurtSound()
{
return 194;
}
public HordeMinion( 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,158 @@
using System;
using Server;
using Server.Misc;
using Server.Items;
using Server.Network;
namespace Server.Mobiles
{
[CorpseName( "a juggernaut corpse" )]
public class Juggernaut : BaseCreature
{
private bool m_Stunning;
[Constructable]
public Juggernaut() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.3, 0.6 )
{
Name = "a blackthorn juggernaut";
Body = 768;
SetStr( 301, 400 );
SetDex( 51, 70 );
SetInt( 51, 100 );
SetHits( 181, 240 );
SetDamage( 12, 19 );
SetDamageType( ResistanceType.Physical, 50 );
SetDamageType( ResistanceType.Fire, 25 );
SetDamageType( ResistanceType.Energy, 25 );
SetResistance( ResistanceType.Physical, 65, 75 );
SetResistance( ResistanceType.Fire, 35, 45 );
SetResistance( ResistanceType.Cold, 35, 45 );
SetResistance( ResistanceType.Poison, 15, 25 );
SetResistance( ResistanceType.Energy, 10, 20 );
SetSkill( SkillName.Anatomy, 90.1, 100.0 );
SetSkill( SkillName.MagicResist, 140.1, 150.0 );
SetSkill( SkillName.Tactics, 90.1, 100.0 );
SetSkill( SkillName.Wrestling, 90.1, 100.0 );
Fame = 12000;
Karma = -12000;
VirtualArmor = 70;
if ( 0.1 > Utility.RandomDouble() )
PackItem( new PowerCrystal() );
if ( 0.4 > Utility.RandomDouble() )
PackItem( new ClockworkAssembly() );
}
public override void OnDeath( Container c )
{
base.OnDeath( c );
if ( 0.05 > Utility.RandomDouble() )
{
if ( !IsParagon )
{
if ( 0.75 > Utility.RandomDouble() )
c.DropItem( DawnsMusicGear.RandomCommon );
else
c.DropItem( DawnsMusicGear.RandomUncommon );
}
else
c.DropItem( DawnsMusicGear.RandomRare );
}
}
public override void GenerateLoot()
{
AddLoot( LootPack.Rich );
AddLoot( LootPack.Gems, 1 );
}
public override int GetDeathSound()
{
return 0x423;
}
public override int GetAttackSound()
{
return 0x23B;
}
public override int GetHurtSound()
{
return 0x140;
}
public override bool AlwaysMurderer{ get{ return true; } }
public override bool BardImmune{ get{ return !Core.AOS; } }
public override bool BleedImmune{ get{ return true; } }
public override Poison PoisonImmune{ get{ return Poison.Lethal; } }
public override int Meat{ get{ return 1; } }
public override int TreasureMapLevel{ get{ return 5; } }
public override void OnGaveMeleeAttack( Mobile defender )
{
base.OnGaveMeleeAttack( defender );
if ( !m_Stunning && 0.3 > Utility.RandomDouble() )
{
m_Stunning = true;
defender.Animate( 21, 6, 1, true, false, 0 );
this.PlaySound( 0xEE );
defender.LocalOverheadMessage( MessageType.Regular, 0x3B2, false, "You have been stunned by a colossal blow!" );
BaseWeapon weapon = this.Weapon as BaseWeapon;
if ( weapon != null )
weapon.OnHit( this, defender );
if ( defender.Alive )
{
defender.Frozen = true;
Timer.DelayCall( TimeSpan.FromSeconds( 5.0 ), new TimerStateCallback( Recover_Callback ), defender );
}
}
}
private void Recover_Callback( object state )
{
Mobile defender = state as Mobile;
if ( defender != null )
{
defender.Frozen = false;
defender.Combatant = null;
defender.LocalOverheadMessage( MessageType.Regular, 0x3B2, false, "You recover your senses." );
}
m_Stunning = false;
}
public Juggernaut( 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,181 @@
using System;
using System.Collections;
using Server;
using Server.Items;
using Server.Targeting;
namespace Server.Mobiles
{
public class KhaldunRevenant : BaseCreature
{
private static Hashtable m_Table = new Hashtable();
public static void Initialize()
{
EventSink.PlayerDeath += new PlayerDeathEventHandler( EventSink_PlayerDeath );
}
public static void EventSink_PlayerDeath( PlayerDeathEventArgs e )
{
Mobile m = e.Mobile;
Mobile lastKiller = m.LastKiller;
if ( lastKiller is BaseCreature )
lastKiller = ((BaseCreature)lastKiller).GetMaster();
if ( IsInsideKhaldun( m ) && IsInsideKhaldun( lastKiller ) && lastKiller.Player && !m_Table.Contains( lastKiller ) )
{
foreach ( AggressorInfo ai in m.Aggressors )
{
if ( ai.Attacker == lastKiller && ai.CanReportMurder )
{
SummonRevenant( m, lastKiller );
break;
}
}
}
}
public static void SummonRevenant( Mobile victim, Mobile killer )
{
KhaldunRevenant revenant = new KhaldunRevenant( killer );
revenant.MoveToWorld( victim.Location, victim.Map );
revenant.Combatant = killer;
revenant.FixedParticles( 0, 0, 0, 0x13A7, EffectLayer.Waist );
Effects.PlaySound( revenant.Location, revenant.Map, 0x29 );
m_Table.Add( killer, null );
}
public static bool IsInsideKhaldun( Mobile from )
{
return from != null && from.Region != null && from.Region.IsPartOf( "Khaldun" );
}
private Mobile m_Target;
private DateTime m_ExpireTime;
public override bool DeleteCorpseOnDeath{ get{ return true; } }
public override void DisplayPaperdollTo( Mobile to )
{
}
public override Mobile ConstantFocus{ get{ return m_Target; } }
public override bool AlwaysAttackable{ get{ return true; } }
public KhaldunRevenant( Mobile target ) : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.18, 0.36 )
{
Name = "a revenant";
Body = 0x3CA;
Hue = 0x41CE;
m_Target = target;
m_ExpireTime = DateTime.UtcNow + TimeSpan.FromMinutes( 10.0 );
SetStr( 401, 500 );
SetDex( 296, 315 );
SetInt( 101, 200 );
SetHits( 241, 300 );
SetStam( 242, 280 );
SetDamage( 20, 30 );
SetDamageType( ResistanceType.Physical, 50 );
SetDamageType( ResistanceType.Cold, 50 );
SetSkill( SkillName.MagicResist, 100.1, 150.0 );
SetSkill( SkillName.Tactics, 90.1, 100.0 );
SetSkill( SkillName.Swords, 140.1, 150.0 );
SetSkill( SkillName.Wrestling, 90.1, 100.0 );
SetResistance( ResistanceType.Physical, 55, 65 );
SetResistance( ResistanceType.Fire, 30, 40 );
SetResistance( ResistanceType.Cold, 60, 70 );
SetResistance( ResistanceType.Poison, 20, 30 );
SetResistance( ResistanceType.Energy, 20, 30 );
Fame = 0;
Karma = 0;
VirtualArmor = 60;
Halberd weapon = new Halberd();
weapon.Hue = 0x41CE;
weapon.Movable = false;
AddItem( weapon );
}
public override int GetIdleSound()
{
return 0x1BF;
}
public override int GetAngerSound()
{
return 0x107;
}
public override int GetDeathSound()
{
return 0xFD;
}
public override bool BardImmune{ get{ return true; } }
public override Poison PoisonImmune{ get{ return Poison.Lethal; } }
public override void OnThink()
{
if ( !m_Target.Alive || DateTime.UtcNow > m_ExpireTime )
{
Delete();
return;
}
//Combatant = m_Target;
//FocusMob = m_Target;
if ( AIObject != null )
AIObject.Action = ActionType.Combat;
base.OnThink();
}
public override bool OnBeforeDeath()
{
Effects.SendLocationEffect( Location, Map, 0x376A, 10, 1 );
return true;
}
public override void OnDelete()
{
if ( m_Target != null )
m_Table.Remove( m_Target );
base.OnDelete();
}
public KhaldunRevenant( 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();
Delete();
}
}
}

Some files were not shown because too many files have changed in this diff Show more