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

View file

@ -0,0 +1,144 @@
using System;
using Server.Misc;
using Server.Network;
using System.Collections;
using Server.Items;
using Server.Targeting;
namespace Server.Mobiles
{
public class KhaldunSummoner : BaseCreature
{
public override bool ClickTitle{ get{ return false; } }
public override bool ShowFameTitle{ get{ return false; } }
[Constructable]
public KhaldunSummoner():base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Body = 0x190;
Name = "Zealot of Khaldun";
Title = "the Summoner";
SetStr( 351, 400 );
SetDex( 101, 150 );
SetInt( 502, 700 );
SetHits( 421, 480 );
SetDamage( 5, 15 );
SetDamageType( ResistanceType.Physical, 75 );
SetDamageType( ResistanceType.Cold, 25 );
SetResistance( ResistanceType.Physical, 35, 40 );
SetResistance( ResistanceType.Fire, 25, 30 );
SetResistance( ResistanceType.Cold, 50, 60 );
SetResistance( ResistanceType.Poison, 25, 35 );
SetResistance( ResistanceType.Energy, 25, 35 );
SetSkill( SkillName.Wrestling, 90.1, 100.0 );
SetSkill( SkillName.Tactics, 90.1, 100.0 );
SetSkill( SkillName.MagicResist, 90.1, 100.0 );
SetSkill( SkillName.Magery, 90.1, 100.0 );
SetSkill( SkillName.EvalInt, 100.0 );
SetSkill( SkillName.Meditation, 120.1, 130.0 );
VirtualArmor = 36;
Fame = 10000;
Karma = -10000;
LeatherGloves gloves = new LeatherGloves();
gloves.Hue = 0x66D;
AddItem( gloves );
BoneHelm helm = new BoneHelm();
helm.Hue = 0x835;
AddItem( helm );
Necklace necklace = new Necklace();
necklace.Hue = 0x66D;
AddItem( necklace );
Cloak cloak = new Cloak();
cloak.Hue = 0x66D;
AddItem( cloak );
Kilt kilt = new Kilt();
kilt.Hue = 0x66D;
AddItem( kilt );
Sandals sandals = new Sandals();
sandals.Hue = 0x66D;
AddItem( sandals );
}
public override int GetIdleSound()
{
return 0x184;
}
public override int GetAngerSound()
{
return 0x286;
}
public override int GetDeathSound()
{
return 0x288;
}
public override int GetHurtSound()
{
return 0x19F;
}
public override bool AlwaysMurderer{ get{ return true; } }
public override bool Unprovokable{ get{ return true; } }
public KhaldunSummoner( Serial serial ) : base( serial )
{
}
public override bool OnBeforeDeath()
{
BoneMagi rm = new BoneMagi();
rm.Team = this.Team;
rm.Combatant = this.Combatant;
rm.NoKillAwards = true;
if ( rm.Backpack == null )
{
Backpack pack = new Backpack();
pack.Movable = false;
rm.AddItem( pack );
}
for ( int i = 0; i < 2; i++ )
{
LootPack.FilthyRich.Generate( this, rm.Backpack, true, LootPack.GetLuckChanceForKiller( this ) );
LootPack.FilthyRich.Generate( this, rm.Backpack, false, LootPack.GetLuckChanceForKiller( this ) );
}
Effects.PlaySound(this, Map, GetDeathSound());
Effects.SendLocationEffect( Location, Map, 0x3709, 30, 10, 0x835, 0 );
rm.MoveToWorld( Location, Map );
Delete();
return false;
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write( (int) 0 ); // version
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
}
}
}

View file

@ -0,0 +1,153 @@
using System;
using Server.Misc;
using Server.Network;
using System.Collections;
using Server.Items;
using Server.Targeting;
namespace Server.Mobiles
{
public class KhaldunZealot : BaseCreature
{
public override bool ClickTitle{ get{ return false; } }
public override bool ShowFameTitle{ get{ return false; } }
[Constructable]
public KhaldunZealot(): base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Body = 0x190;
Name = "Zealot of Khaldun";
Title = "the Knight";
Hue = 0;
SetStr( 351, 400 );
SetDex( 151, 165 );
SetInt( 76, 100 );
SetHits( 448, 470 );
SetDamage( 15, 25 );
SetDamageType( ResistanceType.Physical, 75 );
SetDamageType( ResistanceType.Cold, 25 );
SetResistance( ResistanceType.Physical, 35, 45 );
SetResistance( ResistanceType.Fire, 25, 30 );
SetResistance( ResistanceType.Cold, 50, 60 );
SetResistance( ResistanceType.Poison, 25, 35 );
SetResistance( ResistanceType.Energy, 25, 35 );
SetSkill( SkillName.Wrestling, 70.1, 80.0 );
SetSkill( SkillName.Swords, 120.1, 130.0 );
SetSkill( SkillName.Anatomy, 120.1, 130.0 );
SetSkill( SkillName.MagicResist, 90.1, 100.0 );
SetSkill( SkillName.Tactics, 90.1, 100.0 );
Fame = 10000;
Karma = -10000;
VirtualArmor = 40;
VikingSword weapon = new VikingSword();
weapon.Hue = 0x835;
weapon.Movable = false;
AddItem( weapon );
MetalShield shield = new MetalShield();
shield.Hue = 0x835;
shield.Movable = false;
AddItem( shield );
BoneHelm helm = new BoneHelm();
helm.Hue = 0x835;
AddItem( helm );
BoneArms arms = new BoneArms();
arms.Hue = 0x835;
AddItem( arms );
BoneGloves gloves = new BoneGloves();
gloves.Hue = 0x835;
AddItem( gloves );
BoneChest tunic = new BoneChest();
tunic.Hue = 0x835;
AddItem( tunic );
BoneLegs legs = new BoneLegs();
legs.Hue = 0x835;
AddItem( legs );
AddItem( new Boots() );
}
public override int GetIdleSound()
{
return 0x184;
}
public override int GetAngerSound()
{
return 0x286;
}
public override int GetDeathSound()
{
return 0x288;
}
public override int GetHurtSound()
{
return 0x19F;
}
public override bool AlwaysMurderer{ get{ return true; } }
public override bool Unprovokable{ get{ return true; } }
public override Poison PoisonImmune{ get{ return Poison.Deadly; } }
public KhaldunZealot( Serial serial ) : base( serial )
{
}
public override bool OnBeforeDeath()
{
BoneKnight rm = new BoneKnight();
rm.Team = this.Team;
rm.Combatant = this.Combatant;
rm.NoKillAwards = true;
if ( rm.Backpack == null )
{
Backpack pack = new Backpack();
pack.Movable = false;
rm.AddItem( pack );
}
for ( int i = 0; i < 2; i++ )
{
LootPack.FilthyRich.Generate( this, rm.Backpack, true, LootPack.GetLuckChanceForKiller( this ) );
LootPack.FilthyRich.Generate( this, rm.Backpack, false, LootPack.GetLuckChanceForKiller( this ) );
}
Effects.PlaySound(this, Map, GetDeathSound());
Effects.SendLocationEffect( Location, Map, 0x3709, 30, 10, 0x835, 0 );
rm.MoveToWorld( Location, Map );
Delete();
return false;
}
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( "a moloch corpse" )]
public class Moloch : BaseCreature
{
public override WeaponAbility GetWeaponAbility()
{
return WeaponAbility.ConcussionBlow;
}
[Constructable]
public Moloch() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "a moloch";
Body = 0x311;
BaseSoundID = 0x300;
SetStr( 331, 360 );
SetDex( 66, 85 );
SetInt( 41, 65 );
SetHits( 171, 200 );
SetDamage( 15, 23 );
SetResistance( ResistanceType.Physical, 60, 70 );
SetResistance( ResistanceType.Fire, 60, 70 );
SetResistance( ResistanceType.Cold, 40, 50 );
SetResistance( ResistanceType.Poison, 20, 30 );
SetResistance( ResistanceType.Energy, 20, 30 );
SetSkill( SkillName.MagicResist, 65.1, 75.0 );
SetSkill( SkillName.Tactics, 75.1, 90.0 );
SetSkill( SkillName.Wrestling, 70.1, 90.0 );
Fame = 7500;
Karma = -7500;
VirtualArmor = 32;
}
public override void GenerateLoot()
{
AddLoot( LootPack.Rich );
}
public override Poison PoisonImmune{ get{ return Poison.Regular; } }
public Moloch( 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( "a mongbat corpse" )]
public class Mongbat : BaseCreature
{
[Constructable]
public Mongbat() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "a mongbat";
Body = 39;
BaseSoundID = 422;
SetStr( 6, 10 );
SetDex( 26, 38 );
SetInt( 6, 14 );
SetHits( 4, 6 );
SetMana( 0 );
SetDamage( 1, 2 );
SetDamageType( ResistanceType.Physical, 100 );
SetResistance( ResistanceType.Physical, 5, 10 );
SetSkill( SkillName.MagicResist, 5.1, 14.0 );
SetSkill( SkillName.Tactics, 5.1, 10.0 );
SetSkill( SkillName.Wrestling, 5.1, 10.0 );
Fame = 150;
Karma = -150;
VirtualArmor = 10;
Tamable = true;
ControlSlots = 1;
MinTameSkill = -18.9;
}
public override bool CanFly { get { return true; } }
public override void GenerateLoot()
{
AddLoot( LootPack.Poor );
}
public override int Meat{ get{ return 1; } }
public override FoodType FavoriteFood{ get{ return FoodType.Meat; } }
public Mongbat( Serial serial ) : base( serial )
{
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write( (int) 0 );
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
}
}
}

View file

@ -0,0 +1,82 @@
using System;
using System.Collections;
using Server.Items;
using Server.Targeting;
namespace Server.Mobiles
{
[CorpseName( "a mummy corpse" )]
public class Mummy : BaseCreature
{
[Constructable]
public Mummy() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.4, 0.8 )
{
Name = "a mummy";
Body = 154;
BaseSoundID = 471;
SetStr( 346, 370 );
SetDex( 71, 90 );
SetInt( 26, 40 );
SetHits( 208, 222 );
SetDamage( 13, 23 );
SetDamageType( ResistanceType.Physical, 40 );
SetDamageType( ResistanceType.Cold, 60 );
SetResistance( ResistanceType.Physical, 45, 55 );
SetResistance( ResistanceType.Fire, 10, 20 );
SetResistance( ResistanceType.Cold, 50, 60 );
SetResistance( ResistanceType.Poison, 20, 30 );
SetResistance( ResistanceType.Energy, 20, 30 );
SetSkill( SkillName.MagicResist, 15.1, 40.0 );
SetSkill( SkillName.Tactics, 35.1, 50.0 );
SetSkill( SkillName.Wrestling, 35.1, 50.0 );
Fame = 4000;
Karma = -4000;
VirtualArmor = 50;
if ( Core.ML && Utility.RandomDouble() < .33 )
PackItem( Engines.Plants.Seed.RandomPeculiarSeed(2) );
PackItem( new Garlic( 5 ) );
PackItem( new Bandage( 10 ) );
}
public override void GenerateLoot()
{
AddLoot( LootPack.Rich );
AddLoot( LootPack.Gems );
AddLoot( LootPack.Potions );
}
public override bool BleedImmune{ get{ return true; } }
public override Poison PoisonImmune{ get{ return Poison.Lesser; } }
public Mummy( 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,73 @@
using System;
using System.Collections;
using Server.Items;
using Server.Targeting;
namespace Server.Mobiles
{
[CorpseName( "an ogre corpse" )]
public class Ogre : BaseCreature
{
[Constructable]
public Ogre () : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "an ogre";
Body = 1;
BaseSoundID = 427;
SetStr( 166, 195 );
SetDex( 46, 65 );
SetInt( 46, 70 );
SetHits( 100, 117 );
SetMana( 0 );
SetDamage( 9, 11 );
SetDamageType( ResistanceType.Physical, 100 );
SetResistance( ResistanceType.Physical, 30, 35 );
SetResistance( ResistanceType.Fire, 15, 25 );
SetResistance( ResistanceType.Cold, 15, 25 );
SetResistance( ResistanceType.Poison, 15, 25 );
SetResistance( ResistanceType.Energy, 25 );
SetSkill( SkillName.MagicResist, 55.1, 70.0 );
SetSkill( SkillName.Tactics, 60.1, 70.0 );
SetSkill( SkillName.Wrestling, 70.1, 80.0 );
Fame = 3000;
Karma = -3000;
VirtualArmor = 32;
PackItem( new Club() );
}
public override void GenerateLoot()
{
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 2; } }
public Ogre( 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,76 @@
using System;
using System.Collections;
using Server.Items;
using Server.Targeting;
using Server.Factions;
namespace Server.Mobiles
{
[CorpseName( "an ogre lords corpse" )]
public class OgreLord : BaseCreature
{
public override Faction FactionAllegiance { get { return Minax.Instance; } }
public override Ethics.Ethic EthicAllegiance { get { return Ethics.Ethic.Evil; } }
[Constructable]
public OgreLord () : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "an ogre lord";
Body = 83;
BaseSoundID = 427;
SetStr( 767, 945 );
SetDex( 66, 75 );
SetInt( 46, 70 );
SetHits( 476, 552 );
SetDamage( 20, 25 );
SetDamageType( ResistanceType.Physical, 100 );
SetResistance( ResistanceType.Physical, 45, 55 );
SetResistance( ResistanceType.Fire, 30, 40 );
SetResistance( ResistanceType.Cold, 30, 40 );
SetResistance( ResistanceType.Poison, 40, 50 );
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.Rich, 2 );
}
public override bool CanRummageCorpses{ get{ return true; } }
public override Poison PoisonImmune{ get{ return Poison.Regular; } }
public override int TreasureMapLevel{ get{ return 3; } }
public override int Meat{ get{ return 2; } }
public OgreLord( 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,122 @@
using System;
using System.Collections;
using Server.Items;
using Server.Targeting;
using Server.Misc;
namespace Server.Mobiles
{
[CorpseName( "an orcish corpse" )]
public class Orc : BaseCreature
{
public override InhumanSpeech SpeechType{ get{ return InhumanSpeech.Orc; } }
[Constructable]
public Orc() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = NameList.RandomName( "orc" );
Body = 17;
BaseSoundID = 0x45A;
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, 50.1, 75.0 );
SetSkill( SkillName.Tactics, 55.1, 80.0 );
SetSkill( SkillName.Wrestling, 50.1, 70.0 );
Fame = 1500;
Karma = -1500;
VirtualArmor = 28;
switch ( Utility.Random( 20 ) )
{
case 0: PackItem( new Scimitar() ); break;
case 1: PackItem( new Katana() ); break;
case 2: PackItem( new WarMace() ); break;
case 3: PackItem( new WarHammer() ); break;
case 4: PackItem( new Kryss() ); break;
case 5: PackItem( new Pitchfork() ); break;
}
PackItem( new ThighBoots() );
switch ( Utility.Random( 3 ) )
{
case 0: PackItem( new Ribs() ); break;
case 1: PackItem( new Shaft() ); break;
case 2: PackItem( new Candle() ); break;
}
if ( 0.2 > Utility.RandomDouble() )
PackItem( new BolaBall() );
}
public override void GenerateLoot()
{
AddLoot( LootPack.Meager );
}
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 Orc( Serial serial ) : base( serial )
{
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write( (int) 0 );
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
}
}
}

View file

@ -0,0 +1,161 @@
using System;
using System.Collections;
using Server.Items;
using Server.Targeting;
using Server.Misc;
namespace Server.Mobiles
{
[CorpseName( "an orcish corpse" )]
public class OrcBomber : BaseCreature
{
public override InhumanSpeech SpeechType{ get{ return InhumanSpeech.Orc; } }
[Constructable]
public OrcBomber() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Body = 182;
Name = "an orc bomber";
BaseSoundID = 0x45A;
SetStr( 147, 215 );
SetDex( 91, 115 );
SetInt( 61, 85 );
SetHits( 95, 123 );
SetDamage( 1, 8 );
SetDamageType( ResistanceType.Physical, 75 );
SetDamageType( ResistanceType.Fire, 25 );
SetResistance( ResistanceType.Physical, 25, 35 );
SetResistance( ResistanceType.Fire, 30, 40 );
SetResistance( ResistanceType.Cold, 15, 25 );
SetResistance( ResistanceType.Poison, 15, 20 );
SetResistance( ResistanceType.Energy, 25, 30 );
SetSkill( SkillName.MagicResist, 70.1, 85.0 );
SetSkill( SkillName.Swords, 60.1, 85.0 );
SetSkill( SkillName.Tactics, 75.1, 90.0 );
SetSkill( SkillName.Wrestling, 60.1, 85.0 );
Fame = 2500;
Karma = -2500;
VirtualArmor = 30;
PackItem( new SulfurousAsh( Utility.RandomMinMax( 6, 10 ) ) );
PackItem( new MandrakeRoot( Utility.RandomMinMax( 6, 10 ) ) );
PackItem( new BlackPearl( Utility.RandomMinMax( 6, 10 ) ) );
PackItem( new MortarPestle() );
PackItem( new LesserExplosionPotion() );
if ( 0.2 > Utility.RandomDouble() )
PackItem( new BolaBall() );
}
public override void GenerateLoot()
{
AddLoot( LootPack.Average );
AddLoot( LootPack.Meager );
}
public override bool CanRummageCorpses{ get{ return true; } }
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 );
}
}
private DateTime m_NextBomb;
private int m_Thrown;
public override void OnActionCombat()
{
Mobile combatant = Combatant;
if ( combatant == null || combatant.Deleted || combatant.Map != Map || !InRange( combatant, 12 ) || !CanBeHarmful( combatant ) || !InLOS( combatant ) )
return;
if ( DateTime.UtcNow >= m_NextBomb )
{
ThrowBomb( combatant );
m_Thrown++;
if ( 0.75 >= Utility.RandomDouble() && (m_Thrown % 2) == 1 ) // 75% chance to quickly throw another bomb
m_NextBomb = DateTime.UtcNow + TimeSpan.FromSeconds( 3.0 );
else
m_NextBomb = DateTime.UtcNow + TimeSpan.FromSeconds( 5.0 + (10.0 * Utility.RandomDouble()) ); // 5-15 seconds
}
}
public void ThrowBomb( Mobile m )
{
DoHarmful( m );
this.MovingParticles( m, 0x1C19, 1, 0, false, true, 0, 0, 9502, 6014, 0x11D, EffectLayer.Waist, 0 );
new InternalTimer( m, this ).Start();
}
private class InternalTimer : Timer
{
private Mobile m_Mobile, m_From;
public InternalTimer( Mobile m, Mobile from ) : base( TimeSpan.FromSeconds( 1.0 ) )
{
m_Mobile = m;
m_From = from;
Priority = TimerPriority.TwoFiftyMS;
}
protected override void OnTick()
{
m_Mobile.PlaySound( 0x11D );
AOS.Damage( m_Mobile, m_From, Utility.RandomMinMax( 10, 20 ), 0, 100, 0, 0, 0 );
}
}
public OrcBomber( 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,165 @@
using System;
using System.Collections;
using Server.Items;
using Server.Targeting;
using Server.Misc;
namespace Server.Mobiles
{
[CorpseName( "an orcish corpse" )]
public class OrcBrute : BaseCreature
{
[Constructable]
public OrcBrute() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Body = 189;
Name = "an orc brute";
BaseSoundID = 0x45A;
SetStr( 767, 945 );
SetDex( 66, 75 );
SetInt( 46, 70 );
SetHits( 476, 552 );
SetDamage( 20, 25 );
SetDamageType( ResistanceType.Physical, 100 );
SetResistance( ResistanceType.Physical, 45, 55 );
SetResistance( ResistanceType.Fire, 40, 50 );
SetResistance( ResistanceType.Cold, 25, 35 );
SetResistance( ResistanceType.Poison, 25, 35 );
SetResistance( ResistanceType.Energy, 25, 35 );
SetSkill( SkillName.Macing, 90.1, 100.0 );
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;
Item ore = new ShadowIronOre( 25 );
ore.ItemID = 0x19B9;
PackItem( ore );
PackItem( new IronIngot( 10 ) );
if ( 0.05 > Utility.RandomDouble() )
PackItem( new OrcishKinMask() );
if ( 0.2 > Utility.RandomDouble() )
PackItem( new BolaBall() );
}
public override void GenerateLoot()
{
AddLoot( LootPack.FilthyRich );
AddLoot( LootPack.Rich );
}
public override bool BardImmune{ get{ return !Core.AOS; } }
public override Poison PoisonImmune{ get{ return Poison.Lethal; } }
public override int Meat{ get{ return 2; } }
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 override bool CanRummageCorpses{ get{ return true; } }
public override bool AutoDispel{ get{ return true; } }
public override void OnDamagedBySpell( Mobile caster )
{
if ( caster == this )
return;
SpawnOrcLord( caster );
}
public void SpawnOrcLord( Mobile target )
{
Map map = target.Map;
if ( map == null )
return;
int orcs = 0;
foreach ( Mobile m in this.GetMobilesInRange( 10 ) )
{
if ( m is OrcishLord )
++orcs;
}
if ( orcs < 10 )
{
BaseCreature orc = new SpawnedOrcishLord();
orc.Team = this.Team;
Point3D loc = target.Location;
bool validLocation = false;
for ( int j = 0; !validLocation && j < 10; ++j )
{
int x = target.X + Utility.Random( 3 ) - 1;
int y = target.Y + Utility.Random( 3 ) - 1;
int z = map.GetAverageZ( x, y );
if ( validLocation = map.CanFit( x, y, this.Z, 16, false, false ) )
loc = new Point3D( x, y, Z );
else if ( validLocation = map.CanFit( x, y, z, 16, false, false ) )
loc = new Point3D( x, y, z );
}
orc.MoveToWorld( loc, map );
orc.Combatant = target;
}
}
public OrcBrute( 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,123 @@
using System;
using System.Collections;
using Server.Misc;
using Server.Items;
using Server.Targeting;
namespace Server.Mobiles
{
[CorpseName( "an orcish corpse" )]
public class OrcCaptain : BaseCreature
{
public override InhumanSpeech SpeechType{ get{ return InhumanSpeech.Orc; } }
[Constructable]
public OrcCaptain() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = NameList.RandomName( "orc" );
Body = 7;
BaseSoundID = 0x45A;
SetStr( 111, 145 );
SetDex( 101, 135 );
SetInt( 86, 110 );
SetHits( 67, 87 );
SetDamage( 5, 15 );
SetDamageType( ResistanceType.Physical, 100 );
SetResistance( ResistanceType.Physical, 30, 35 );
SetResistance( ResistanceType.Fire, 10, 20 );
SetResistance( ResistanceType.Cold, 15, 25 );
SetResistance( ResistanceType.Poison, 5, 10 );
SetResistance( ResistanceType.Energy, 5, 10 );
SetSkill( SkillName.MagicResist, 70.1, 85.0 );
SetSkill( SkillName.Swords, 70.1, 95.0 );
SetSkill( SkillName.Tactics, 85.1, 100.0 );
Fame = 2500;
Karma = -2500;
VirtualArmor = 34;
// TODO: Skull?
switch ( Utility.Random( 7 ) )
{
case 0: PackItem( new Arrow() ); break;
case 1: PackItem( new Lockpick() ); break;
case 2: PackItem( new Shaft() ); break;
case 3: PackItem( new Ribs() ); break;
case 4: PackItem( new Bandage() ); break;
case 5: PackItem( new BeverageBottle( BeverageType.Wine ) ); break;
case 6: PackItem( new Jug( BeverageType.Cider ) ); break;
}
if ( Core.AOS )
PackItem( Loot.RandomNecromancyReagent() );
}
public override void OnDeath( Container c )
{
base.OnDeath( c );
// TODO: Check drop rate
if ( Utility.RandomDouble() < 0.05 )
c.DropItem( new StoutWhip() );
}
public override void GenerateLoot()
{
AddLoot( LootPack.Meager, 2 );
}
public override bool CanRummageCorpses{ get{ return true; } }
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 OrcCaptain( 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,118 @@
using System;
using System.Collections;
using Server.Misc;
using Server.Items;
using Server.Targeting;
namespace Server.Mobiles
{
[CorpseName( "an orcish corpse" )]
public class OrcishLord : BaseCreature
{
public override InhumanSpeech SpeechType{ get{ return InhumanSpeech.Orc; } }
[Constructable]
public OrcishLord() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "an orcish lord";
Body = 138;
BaseSoundID = 0x45A;
SetStr( 147, 215 );
SetDex( 91, 115 );
SetInt( 61, 85 );
SetHits( 95, 123 );
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.MagicResist, 70.1, 85.0 );
SetSkill( SkillName.Swords, 60.1, 85.0 );
SetSkill( SkillName.Tactics, 75.1, 90.0 );
SetSkill( SkillName.Wrestling, 60.1, 85.0 );
Fame = 2500;
Karma = -2500;
switch ( Utility.Random( 5 ) )
{
case 0: PackItem( new Lockpick() ); break;
case 1: PackItem( new MortarPestle() ); break;
case 2: PackItem( new Bottle() ); break;
case 3: PackItem( new RawRibs() ); break;
case 4: PackItem( new Shovel() ); break;
}
PackItem( new RingmailChest() );
if ( 0.3 > Utility.RandomDouble() )
PackItem( Loot.RandomPossibleReagent() );
if ( 0.2 > Utility.RandomDouble() )
PackItem( new BolaBall() );
}
public override void GenerateLoot()
{
AddLoot( LootPack.Meager );
AddLoot( LootPack.Average );
// TODO: evil orc helm
}
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 OrcishLord( 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 System.Collections;
using Server.Misc;
using Server.Items;
using Server.Targeting;
namespace Server.Mobiles
{
[CorpseName( "a ratman's corpse" )]
public class Ratman : BaseCreature
{
public override InhumanSpeech SpeechType{ get{ return InhumanSpeech.Ratman; } }
[Constructable]
public Ratman() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = NameList.RandomName( "ratman" );
Body = 42;
BaseSoundID = 437;
SetStr( 96, 120 );
SetDex( 81, 100 );
SetInt( 36, 60 );
SetHits( 58, 72 );
SetDamage( 4, 5 );
SetDamageType( ResistanceType.Physical, 100 );
SetResistance( ResistanceType.Physical, 25, 30 );
SetResistance( ResistanceType.Fire, 10, 20 );
SetResistance( ResistanceType.Cold, 10, 20 );
SetResistance( ResistanceType.Poison, 10, 20 );
SetResistance( ResistanceType.Energy, 10, 20 );
SetSkill( SkillName.MagicResist, 35.1, 60.0 );
SetSkill( SkillName.Tactics, 50.1, 75.0 );
SetSkill( SkillName.Wrestling, 50.1, 75.0 );
Fame = 1500;
Karma = -1500;
VirtualArmor = 28;
}
public override void GenerateLoot()
{
AddLoot( LootPack.Meager );
// TODO: weapon, misc
}
public override bool CanRummageCorpses{ get{ return true; } }
public override int Hides{ get{ return 8; } }
public override HideType HideType{ get{ return HideType.Spined; } }
public Ratman( 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 System.Collections;
using Server.Misc;
using Server.Items;
using Server.Targeting;
namespace Server.Mobiles
{
[CorpseName( "a ratman archer corpse" )]
public class RatmanArcher : BaseCreature
{
public override InhumanSpeech SpeechType{ get{ return InhumanSpeech.Ratman; } }
[Constructable]
public RatmanArcher() : base( AIType.AI_Archer, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = NameList.RandomName( "ratman" );
Body = 0x8E;
BaseSoundID = 437;
SetStr( 146, 180 );
SetDex( 101, 130 );
SetInt( 116, 140 );
SetHits( 88, 108 );
SetDamage( 4, 10 );
SetDamageType( ResistanceType.Physical, 100 );
SetResistance( ResistanceType.Physical, 40, 55 );
SetResistance( ResistanceType.Fire, 10, 20 );
SetResistance( ResistanceType.Cold, 10, 20 );
SetResistance( ResistanceType.Poison, 10, 20 );
SetResistance( ResistanceType.Energy, 10, 20 );
SetSkill( SkillName.Anatomy, 60.2, 100.0 );
SetSkill( SkillName.Archery, 80.1, 90.0 );
SetSkill( SkillName.MagicResist, 65.1, 90.0 );
SetSkill( SkillName.Tactics, 50.1, 75.0 );
SetSkill( SkillName.Wrestling, 50.1, 75.0 );
Fame = 6500;
Karma = -6500;
VirtualArmor = 56;
AddItem( new Bow() );
PackItem( new Arrow( Utility.RandomMinMax( 50, 70 ) ) );
}
public override void GenerateLoot()
{
AddLoot( LootPack.Rich );
}
public override bool CanRummageCorpses{ get{ return true; } }
public override int Hides{ get{ return 8; } }
public override HideType HideType{ get{ return HideType.Spined; } }
public RatmanArcher( 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 = 0x8E;
Hue = 0;
}
}
}
}

View file

@ -0,0 +1,120 @@
using System;
using System.Collections;
using System.Collections.Generic;
using Server.Items;
using Server.Targeting;
using Server.Engines.Quests;
using Server.Engines.Quests.Haven;
using Server.ContextMenus;
namespace Server.Mobiles
{
[CorpseName( "a ghostly corpse" )]
public class RestlessSoul : BaseCreature
{
[Constructable]
public RestlessSoul() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.4, 0.8 )
{
Name = "restless soul";
Body = 0x3CA;
Hue = 0x453;
SetStr( 26, 40 );
SetDex( 26, 40 );
SetInt( 26, 40 );
SetHits( 16, 24 );
SetDamage( 1, 10 );
SetDamageType( ResistanceType.Physical, 100 );
SetResistance( ResistanceType.Physical, 15, 25 );
SetResistance( ResistanceType.Fire, 5, 15 );
SetResistance( ResistanceType.Cold, 25, 40 );
SetResistance( ResistanceType.Poison, 5, 10 );
SetResistance( ResistanceType.Energy, 10, 20 );
SetSkill( SkillName.MagicResist, 20.1, 30.0 );
SetSkill( SkillName.Swords, 20.1, 30.0 );
SetSkill( SkillName.Tactics, 20.1, 30.0 );
SetSkill( SkillName.Wrestling, 20.1, 30.0 );
Fame = 500;
Karma = -500;
VirtualArmor = 6;
}
public override void GenerateLoot()
{
AddLoot( LootPack.Poor );
}
public override bool AlwaysAttackable{ get{ return true; } }
public override bool BleedImmune{ get{ return true; } }
public override void DisplayPaperdollTo(Mobile to)
{
}
public override void GetContextMenuEntries( Mobile from, List<ContextMenuEntry> list )
{
base.GetContextMenuEntries( from, list );
for ( int i = 0; i < list.Count; ++i )
{
if ( list[i] is ContextMenus.PaperdollEntry )
list.RemoveAt( i-- );
}
}
public override int GetIdleSound()
{
return 0x107;
}
public override int GetAngerSound()
{
return 0x1BF;
}
public override int GetDeathSound()
{
return 0xFD;
}
public override bool IsEnemy( Mobile m )
{
PlayerMobile player = m as PlayerMobile;
if ( player != null && Map == Map.Trammel && X >= 5199 && X <= 5271 && Y >= 1812 && Y <= 1865 ) // Schmendrick's cave
{
QuestSystem qs = player.Quest;
if ( qs is UzeraanTurmoilQuest && qs.IsObjectiveInProgress( typeof( FindSchmendrickObjective ) ) )
{
return false;
}
}
return base.IsEnemy( m );
}
public RestlessSoul( 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 System.Collections;
using Server.Items;
using Server.Targeting;
namespace Server.Mobiles
{
[CorpseName( "a rotting corpse" )]
public class RottingCorpse : BaseCreature
{
[Constructable]
public RottingCorpse() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "a rotting corpse";
Body = 155;
BaseSoundID = 471;
SetStr( 301, 350 );
SetDex( 75 );
SetInt( 151, 200 );
SetHits( 1200 );
SetStam( 150 );
SetMana( 0 );
SetDamage( 8, 10 );
SetDamageType( ResistanceType.Physical, 0 );
SetDamageType( ResistanceType.Cold, 50 );
SetDamageType( ResistanceType.Poison, 50 );
SetResistance( ResistanceType.Physical, 35, 45 );
SetResistance( ResistanceType.Fire, 20, 30 );
SetResistance( ResistanceType.Cold, 50, 70 );
SetResistance( ResistanceType.Poison, 40, 50 );
SetResistance( ResistanceType.Energy, 20, 30 );
SetSkill( SkillName.Poisoning, 120.0 );
SetSkill( SkillName.MagicResist, 250.0 );
SetSkill( SkillName.Tactics, 100.0 );
SetSkill( SkillName.Wrestling, 90.1, 100.0 );
Fame = 6000;
Karma = -6000;
VirtualArmor = 40;
}
public override void GenerateLoot()
{
AddLoot( LootPack.FilthyRich, 2 );
}
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 5; } }
public RottingCorpse( 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,118 @@
using System;
using Server;
using Server.Misc;
using Server.Items;
namespace Server.Mobiles
{
[CorpseName( "a savage corpse" )]
public class Savage : BaseCreature
{
[Constructable]
public Savage() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = NameList.RandomName( "savage" );
if ( Female = Utility.RandomBool() )
Body = 184;
else
Body = 183;
SetStr( 96, 115 );
SetDex( 86, 105 );
SetInt( 51, 65 );
SetDamage( 23, 27 );
SetDamageType( ResistanceType.Physical, 100 );
SetSkill( SkillName.Fencing, 60.0, 82.5 );
SetSkill( SkillName.Macing, 60.0, 82.5 );
SetSkill( SkillName.Poisoning, 60.0, 82.5 );
SetSkill( SkillName.MagicResist, 57.5, 80.0 );
SetSkill( SkillName.Swords, 60.0, 82.5 );
SetSkill( SkillName.Tactics, 60.0, 82.5 );
Fame = 1000;
Karma = -1000;
PackItem( new Bandage( Utility.RandomMinMax( 1, 15 ) ) );
if ( Female && 0.1 > Utility.RandomDouble() )
PackItem( new TribalBerry() );
else if ( !Female && 0.1 > Utility.RandomDouble() )
PackItem( new BolaBall() );
AddItem( new Spear() );
AddItem( new BoneArms() );
AddItem( new BoneLegs() );
if ( 0.5 > Utility.RandomDouble() )
AddItem( new SavageMask() );
else if ( 0.1 > Utility.RandomDouble() )
AddItem( new OrcishKinMask() );
}
public override void GenerateLoot()
{
AddLoot( LootPack.Meager );
}
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 Savage( 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,128 @@
using System;
using Server;
using Server.Misc;
using Server.Items;
namespace Server.Mobiles
{
[CorpseName( "a savage corpse" )]
public class SavageRider : BaseCreature
{
[Constructable]
public SavageRider() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.15, 0.4 )
{
Name = NameList.RandomName( "savage rider" );
if ( Female = Utility.RandomBool() )
Body = 186;
else
Body = 185;
SetStr( 151, 170 );
SetDex( 92, 130 );
SetInt( 51, 65 );
SetDamage( 29, 34 );
SetDamageType( ResistanceType.Physical, 100 );
SetSkill( SkillName.Fencing, 72.5, 95.0 );
SetSkill( SkillName.Healing, 60.3, 90.0 );
SetSkill( SkillName.Macing, 72.5, 95.0 );
SetSkill( SkillName.Poisoning, 60.0, 82.5 );
SetSkill( SkillName.MagicResist, 72.5, 95.0 );
SetSkill( SkillName.Swords, 72.5, 95.0 );
SetSkill( SkillName.Tactics, 72.5, 95.0 );
Fame = 1000;
Karma = -1000;
PackItem( new Bandage( Utility.RandomMinMax( 1, 15 ) ) );
if ( 0.1 > Utility.RandomDouble() )
PackItem( new BolaBall() );
AddItem( new TribalSpear() );
AddItem( new BoneArms() );
AddItem( new BoneLegs() );
// TODO: BEAR MASK
new SavageRidgeback().Rider = this;
}
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 OnBeforeDeath()
{
IMount mount = this.Mount;
if ( mount != null )
mount.Rider = null;
if ( mount is Mobile )
((Mobile)mount).Delete();
return base.OnBeforeDeath();
}
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 SavageRider( 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,144 @@
using System;
using System.Collections;
using Server.Items;
namespace Server.Mobiles
{
public class ShadowFiend : BaseCreature
{
public override bool DeleteCorpseOnDeath{ get{ return true; } }
private UnhideTimer m_Timer;
[Constructable]
public ShadowFiend() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "a shadow fiend";
Body = 0xA8;
// this to allow shadow fiend to loot from corpses
Backpack backpack = new Backpack();
backpack.Movable = false;
AddItem( backpack );
SetStr( 46, 55 );
SetDex( 121, 130 );
SetInt( 46, 55 );
SetHits( 28, 33 );
SetStam( 46, 55 );
SetDamage( 10, 22 );
SetDamageType( ResistanceType.Physical, 20 );
SetDamageType( ResistanceType.Cold, 80 );
SetResistance( ResistanceType.Physical, 20, 25 );
SetResistance( ResistanceType.Fire, 20, 25 );
SetResistance( ResistanceType.Cold, 40, 45 );
SetResistance( ResistanceType.Poison, 60, 70 );
SetResistance( ResistanceType.Energy, 5, 10 );
SetSkill( SkillName.MagicResist, 20.1, 30.0 );
SetSkill( SkillName.Tactics, 20.1, 30.0 );
SetSkill( SkillName.Wrestling, 20.1, 30.0 );
Fame = 1000;
Karma = -1000;
m_Timer = new UnhideTimer( this );
m_Timer.Start();
}
public override int GetIdleSound()
{
return 0x37A;
}
public override int GetAngerSound()
{
return 0x379;
}
public override int GetDeathSound()
{
return 0x381;
}
public override int GetAttackSound()
{
return 0x37F;
}
public override int GetHurtSound()
{
return 0x380;
}
public override bool CanRummageCorpses{ get{ return true; } }
public override bool OnBeforeDeath()
{
if ( Backpack != null )
Backpack.Destroy();
Effects.SendLocationEffect( Location, Map, 0x376A, 10, 1 );
return true;
}
public ShadowFiend( 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();
m_Timer = new UnhideTimer( this );
m_Timer.Start();
}
public override void OnAfterDelete()
{
if ( m_Timer != null )
m_Timer.Stop();
m_Timer = null;
base.OnAfterDelete();
}
private class UnhideTimer : Timer
{
private ShadowFiend m_Owner;
public UnhideTimer( ShadowFiend owner ) : base( TimeSpan.FromSeconds( 30.0 ) )
{
m_Owner = owner;
Priority = TimerPriority.OneSecond;
}
protected override void OnTick()
{
if ( m_Owner.Deleted )
{
Stop();
return;
}
foreach ( Mobile m in m_Owner.GetMobilesInRange( 3 ) )
{
if ( m != m_Owner && m.Player && m.Hidden && m_Owner.CanBeHarmful( m ) && m.AccessLevel == AccessLevel.Player )
m.Hidden = false;
}
}
}
}
}

View file

@ -0,0 +1,87 @@
using System;
using System.Collections;
using Server.Items;
using Server.Targeting;
namespace Server.Mobiles
{
[CorpseName( "a skeletal corpse" )]
public class SkeletalKnight : BaseCreature
{
[Constructable]
public SkeletalKnight() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "a skeletal knight";
Body = 147;
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;
}
PackItem( new Scimitar() );
PackItem( new WoodenShield() );
}
public override void GenerateLoot()
{
AddLoot( LootPack.Average );
AddLoot( LootPack.Meager );
}
public override bool BleedImmune{ get{ return true; } }
public SkeletalKnight( 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,82 @@
using System;
using System.Collections;
using Server.Items;
using Server.Targeting;
namespace Server.Mobiles
{
[CorpseName( "a skeletal corpse" )]
public class Skeleton : BaseCreature
{
[Constructable]
public Skeleton() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "a skeleton";
Body = Utility.RandomList( 50, 56 );
BaseSoundID = 0x48D;
SetStr( 56, 80 );
SetDex( 56, 75 );
SetInt( 16, 40 );
SetHits( 34, 48 );
SetDamage( 3, 7 );
SetDamageType( ResistanceType.Physical, 100 );
SetResistance( ResistanceType.Physical, 15, 20 );
SetResistance( ResistanceType.Fire, 5, 10 );
SetResistance( ResistanceType.Cold, 25, 40 );
SetResistance( ResistanceType.Poison, 25, 35 );
SetResistance( ResistanceType.Energy, 5, 15 );
SetSkill( SkillName.MagicResist, 45.1, 60.0 );
SetSkill( SkillName.Tactics, 45.1, 60.0 );
SetSkill( SkillName.Wrestling, 45.1, 55.0 );
Fame = 450;
Karma = -450;
VirtualArmor = 16;
switch ( Utility.Random( 5 ))
{
case 0: PackItem( new BoneArms() ); break;
case 1: PackItem( new BoneChest() ); break;
case 2: PackItem( new BoneGloves() ); break;
case 3: PackItem( new BoneLegs() ); break;
case 4: PackItem( new BoneHelm() ); break;
}
}
public override void GenerateLoot()
{
AddLoot( LootPack.Poor );
}
public override bool BleedImmune{ get{ return true; } }
public override Poison PoisonImmune{ get{ return Poison.Lesser; } }
public Skeleton( 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,46 @@
using System;
using System.Collections;
using Server.Items;
using Server.Targeting;
namespace Server.Mobiles
{
[CorpseName( "an orcish corpse" )]
public class SpawnedOrcishLord : OrcishLord
{
[Constructable]
public SpawnedOrcishLord()
{
Container pack = this.Backpack;
if ( pack != null )
pack.Delete();
NoKillAwards = true;
}
public SpawnedOrcishLord( Serial serial ) : base( serial )
{
}
public override void OnDeath( Container c )
{
base.OnDeath( c );
c.Delete();
}
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();
NoKillAwards = true;
}
}
}

View file

@ -0,0 +1,97 @@
using System;
using Server.Items;
namespace Server.Mobiles
{
public class SpectralArmour : BaseCreature
{
public override bool DeleteCorpseOnDeath{ get{ return true; } }
[Constructable]
public SpectralArmour() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Body = 637;
Hue = 0x8026;
Name = "spectral armour";
Buckler buckler = new Buckler();
ChainCoif coif = new ChainCoif();
PlateGloves gloves = new PlateGloves();
buckler.Hue = 0x835; buckler.Movable = false;
coif.Hue = 0x835;
gloves.Hue = 0x835;
AddItem( buckler );
AddItem( coif );
AddItem( gloves );
SetStr( 101, 110 );
SetDex( 101, 110 );
SetInt( 101, 110 );
SetHits( 178, 201 );
SetStam( 191, 200 );
SetDamage( 10, 22 );
SetDamageType( ResistanceType.Physical, 75 );
SetDamageType( ResistanceType.Cold, 25 );
SetResistance( ResistanceType.Physical, 35, 45 );
SetResistance( ResistanceType.Fire, 20, 30 );
SetResistance( ResistanceType.Cold, 30, 40 );
SetResistance( ResistanceType.Poison, 20, 30 );
SetResistance( ResistanceType.Energy, 20, 30 );
SetSkill( SkillName.Wrestling, 75.1, 100.0 );
SetSkill( SkillName.Tactics, 90.1, 100.0 );
SetSkill( SkillName.MagicResist, 90.1, 100 );
VirtualArmor = 40;
Fame = 7000;
Karma = -7000;
}
public override int GetIdleSound()
{
return 0x200;
}
public override int GetAngerSound()
{
return 0x56;
}
public override bool OnBeforeDeath()
{
if ( !base.OnBeforeDeath() )
return false;
Gold gold = new Gold( Utility.RandomMinMax( 240, 375 ) );
gold.MoveToWorld( Location, Map );
Effects.SendLocationEffect( Location, Map, 0x376A, 10, 1 );
return true;
}
public override Poison PoisonImmune{ get{ return Poison.Regular; } }
public SpectralArmour( 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 System.Collections;
using Server.Items;
using Server.Targeting;
namespace Server.Mobiles
{
[CorpseName( "a gargoyle corpse" )]
public class StoneGargoyle : BaseCreature
{
[Constructable]
public StoneGargoyle() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "a stone gargoyle";
Body = 67;
BaseSoundID = 0x174;
SetStr( 246, 275 );
SetDex( 76, 95 );
SetInt( 81, 105 );
SetHits( 148, 165 );
SetDamage( 11, 17 );
SetDamageType( ResistanceType.Physical, 100 );
SetResistance( ResistanceType.Physical, 45, 55 );
SetResistance( ResistanceType.Fire, 20, 30 );
SetResistance( ResistanceType.Cold, 10, 20 );
SetResistance( ResistanceType.Poison, 30, 40 );
SetResistance( ResistanceType.Energy, 30, 40 );
SetSkill( SkillName.MagicResist, 85.1, 100.0 );
SetSkill( SkillName.Tactics, 80.1, 100.0 );
SetSkill( SkillName.Wrestling, 60.1, 100.0 );
Fame = 4000;
Karma = -4000;
VirtualArmor = 50;
PackItem( new IronIngot( 12 ) );
if ( 0.05 > Utility.RandomDouble() )
PackItem( new GargoylesPickaxe() );
}
public override void GenerateLoot()
{
AddLoot( LootPack.Average, 2 );
AddLoot( LootPack.Gems, 1 );
AddLoot( LootPack.Potions );
}
public override int TreasureMapLevel{ get{ return 2; } }
public StoneGargoyle( 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 System.Collections;
using Server.Items;
using Server.Targeting;
namespace Server.Mobiles
{
[CorpseName( "a mongbat corpse" )]
public class StrongMongbat : BaseCreature
{
[Constructable]
public StrongMongbat() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "a mongbat";
Body = 39;
BaseSoundID = 422;
SetStr( 6, 10 );
SetDex( 26, 38 );
SetInt( 6, 14 );
SetHits( 4, 6 );
SetMana( 0 );
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 = 150;
Karma = -150;
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 StrongMongbat( 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 System.Collections;
using Server.Items;
using Server.Targeting;
namespace Server.Mobiles
{
[CorpseName( "a troll corpse" )]
public class Troll : BaseCreature
{
[Constructable]
public Troll () : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "a troll";
Body = Utility.RandomList( 53, 54 );
BaseSoundID = 461;
SetStr( 176, 205 );
SetDex( 46, 65 );
SetInt( 46, 70 );
SetHits( 106, 123 );
SetDamage( 8, 14 );
SetDamageType( ResistanceType.Physical, 100 );
SetResistance( ResistanceType.Physical, 35, 45 );
SetResistance( ResistanceType.Fire, 25, 35 );
SetResistance( ResistanceType.Cold, 15, 25 );
SetResistance( ResistanceType.Poison, 5, 15 );
SetResistance( ResistanceType.Energy, 5, 15 );
SetSkill( SkillName.MagicResist, 45.1, 60.0 );
SetSkill( SkillName.Tactics, 50.1, 70.0 );
SetSkill( SkillName.Wrestling, 50.1, 70.0 );
Fame = 3500;
Karma = -3500;
VirtualArmor = 40;
}
public override void GenerateLoot()
{
AddLoot( LootPack.Average );
}
public override bool CanRummageCorpses{ get{ return true; } }
public override int TreasureMapLevel{ get{ return 1; } }
public override int Meat{ get{ return 2; } }
public Troll( 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 System.Collections;
using Server.Items;
using Server.Targeting;
namespace Server.Mobiles
{
[CorpseName( "a rotting corpse" )]
public class Zombie : BaseCreature
{
[Constructable]
public Zombie() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "a zombie";
Body = 3;
BaseSoundID = 471;
SetStr( 46, 70 );
SetDex( 31, 50 );
SetInt( 26, 40 );
SetHits( 28, 42 );
SetDamage( 3, 7 );
SetDamageType( ResistanceType.Physical, 100 );
SetResistance( ResistanceType.Physical, 15, 20 );
SetResistance( ResistanceType.Cold, 20, 30 );
SetResistance( ResistanceType.Poison, 5, 10 );
SetSkill( SkillName.MagicResist, 15.1, 40.0 );
SetSkill( SkillName.Tactics, 35.1, 50.0 );
SetSkill( SkillName.Wrestling, 35.1, 50.0 );
Fame = 600;
Karma = -600;
VirtualArmor = 18;
switch ( Utility.Random( 10 ))
{
case 0: PackItem( new LeftArm() ); break;
case 1: PackItem( new RightArm() ); break;
case 2: PackItem( new Torso() ); break;
case 3: PackItem( new Bone() ); break;
case 4: PackItem( new RibCage() ); break;
case 5: PackItem( new RibCage() ); break;
case 6: PackItem( new BonePile() ); break;
case 7: PackItem( new BonePile() ); break;
case 8: PackItem( new BonePile() ); break;
case 9: PackItem( new BonePile() ); break;
}
}
public override void GenerateLoot()
{
AddLoot( LootPack.Meager );
}
public override bool BleedImmune{ get{ return true; } }
public override Poison PoisonImmune{ get{ return Poison.Regular; } }
public Zombie( 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();
}
}
}