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

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

View file

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

View file

@ -0,0 +1,75 @@
using System;
using Server;
using Server.Items;
namespace Server.Mobiles
{
[CorpseName( "a bone demon corpse" )]
public class BoneDemon : BaseCreature
{
[Constructable]
public BoneDemon() : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "a bone demon";
Body = 308;
BaseSoundID = 0x48D;
SetStr( 1000 );
SetDex( 151, 175 );
SetInt( 171, 220 );
SetHits( 3600 );
SetDamage( 34, 36 );
SetDamageType( ResistanceType.Physical, 50 );
SetDamageType( ResistanceType.Cold, 50 );
SetResistance( ResistanceType.Physical, 75 );
SetResistance( ResistanceType.Fire, 60 );
SetResistance( ResistanceType.Cold, 90 );
SetResistance( ResistanceType.Poison, 100 );
SetResistance( ResistanceType.Energy, 60 );
SetSkill( SkillName.DetectHidden, 80.0 );
SetSkill( SkillName.EvalInt, 77.6, 87.5 );
SetSkill( SkillName.Magery, 77.6, 87.5 );
SetSkill( SkillName.Meditation, 100.0 );
SetSkill( SkillName.MagicResist, 50.1, 75.0 );
SetSkill( SkillName.Tactics, 100.0 );
SetSkill( SkillName.Wrestling, 100.0 );
Fame = 20000;
Karma = -20000;
VirtualArmor = 44;
}
public override void GenerateLoot()
{
AddLoot( LootPack.FilthyRich, 8 );
}
public override bool BardImmune { get { return !Core.SE; } }
public override bool Unprovokable { get { return Core.SE; } }
public override bool AreaPeaceImmune { get { return Core.SE; } }
public override Poison PoisonImmune{ get{ return Poison.Lethal; } }
public override int TreasureMapLevel{ get{ return 1; } }
public BoneDemon( Serial serial ) : base( serial )
{
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write( (int) 0 );
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
}
}
}

View file

@ -0,0 +1,78 @@
using System;
using Server;
using Server.Items;
namespace Server.Mobiles
{
[CorpseName( "a crystal elemental corpse" )]
public class CrystalElemental : BaseCreature
{
public override WeaponAbility GetWeaponAbility()
{
return WeaponAbility.BleedAttack;
}
[Constructable]
public CrystalElemental() : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "a crystal elemental";
Body = 300;
BaseSoundID = 278;
SetStr( 136, 160 );
SetDex( 51, 65 );
SetInt( 86, 110 );
SetHits( 150 );
SetDamage( 10, 15 );
SetDamageType( ResistanceType.Physical, 80 );
SetDamageType( ResistanceType.Energy, 20 );
SetResistance( ResistanceType.Physical, 50, 60 );
SetResistance( ResistanceType.Fire, 40, 50 );
SetResistance( ResistanceType.Cold, 40, 50 );
SetResistance( ResistanceType.Poison, 100 );
SetResistance( ResistanceType.Energy, 55, 70 );
SetSkill( SkillName.EvalInt, 70.1, 75.0 );
SetSkill( SkillName.Magery, 70.1, 75.0 );
SetSkill( SkillName.Meditation, 65.1, 75.0 );
SetSkill( SkillName.MagicResist, 80.1, 90.0 );
SetSkill( SkillName.Tactics, 75.1, 85.0 );
SetSkill( SkillName.Wrestling, 65.1, 75.0 );
Fame = 6500;
Karma = -6500;
VirtualArmor = 54;
}
public override void GenerateLoot()
{
AddLoot( LootPack.Rich );
AddLoot( LootPack.Average );
}
public override bool BleedImmune{ get{ return true; } }
public override Poison PoisonImmune{ get{ return Poison.Lethal; } }
public override int TreasureMapLevel{ get{ return 1; } }
public CrystalElemental( Serial serial ) : base( serial )
{
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write( (int) 0 );
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
}
}
}

View file

@ -0,0 +1,94 @@
using System;
using Server;
using Server.Items;
namespace Server.Mobiles
{
[CorpseName( "a darknight creeper corpse" )]
public class DarknightCreeper : BaseCreature
{
public override bool IgnoreYoungProtection { get { return Core.ML; } }
[Constructable]
public DarknightCreeper() : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = NameList.RandomName( "darknight creeper" );
Body = 313;
BaseSoundID = 0xE0;
SetStr( 301, 330 );
SetDex( 101, 110 );
SetInt( 301, 330 );
SetHits( 4000 );
SetDamage( 22, 26 );
SetDamageType( ResistanceType.Physical, 85 );
SetDamageType( ResistanceType.Poison, 15 );
SetResistance( ResistanceType.Physical, 60 );
SetResistance( ResistanceType.Fire, 60 );
SetResistance( ResistanceType.Cold, 100 );
SetResistance( ResistanceType.Poison, 90 );
SetResistance( ResistanceType.Energy, 75 );
SetSkill( SkillName.DetectHidden, 80.0 );
SetSkill( SkillName.EvalInt, 118.1, 120.0 );
SetSkill( SkillName.Magery, 112.6, 120.0 );
SetSkill( SkillName.Meditation, 150.0 );
SetSkill( SkillName.Poisoning, 120.0 );
SetSkill( SkillName.MagicResist, 90.1, 90.9 );
SetSkill( SkillName.Tactics, 100.0 );
SetSkill( SkillName.Wrestling, 90.1, 90.9 );
SetSkill( SkillName.Necromancy, 120.1, 130.0 );
SetSkill( SkillName.SpiritSpeak, 120.1, 130.0 );
Fame = 22000;
Karma = -22000;
VirtualArmor = 34;
}
public override void GenerateLoot()
{
AddLoot( LootPack.UltraRich, 2 );
}
public override void OnDeath( Container c )
{
base.OnDeath( c );
if ( !Summoned && !NoKillAwards && DemonKnight.CheckArtifactChance( this ) )
DemonKnight.DistributeArtifact( this );
}
public override bool BardImmune{ get{ return !Core.SE; } }
public override bool Unprovokable{ get{ return Core.SE; } }
public override bool AreaPeaceImmune { get { return Core.SE; } }
public override bool BleedImmune{ get{ return true; } }
public override Poison PoisonImmune{ get{ return Poison.Lethal; } }
public override Poison HitPoison{ get{ return Poison.Lethal; } }
public override int TreasureMapLevel{ get{ return 1; } }
public DarknightCreeper( Serial serial ) : base( serial )
{
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write( (int) 0 );
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
if ( BaseSoundID == 471 )
BaseSoundID = 0xE0;
}
}
}

View file

@ -0,0 +1,293 @@
using System;
using System.Collections;
using System.Collections.Generic;
using Server;
using Server.Items;
namespace Server.Mobiles
{
[CorpseName( "a demon knight corpse" )]
public class DemonKnight : BaseCreature
{
public override bool IgnoreYoungProtection { get { return Core.ML; } }
public static Type[] ArtifactRarity10 { get { return m_ArtifactRarity10; } }
public static Type[] ArtifactRarity11 { get { return m_ArtifactRarity11; } }
private static Type[] m_ArtifactRarity10 = new Type[]
{
typeof( LegacyOfTheDreadLord ),
typeof( TheTaskmaster )
};
private static Type[] m_ArtifactRarity11 = new Type[]
{
typeof( TheDragonSlayer ),
typeof( ArmorOfFortune ),
typeof( GauntletsOfNobility ),
typeof( HelmOfInsight ),
typeof( HolyKnightsBreastplate ),
typeof( JackalsCollar ),
typeof( LeggingsOfBane ),
typeof( MidnightBracers ),
typeof( OrnateCrownOfTheHarrower ),
typeof( ShadowDancerLeggings ),
typeof( TunicOfFire ),
typeof( VoiceOfTheFallenKing ),
typeof( BraceletOfHealth ),
typeof( OrnamentOfTheMagician ),
typeof( RingOfTheElements ),
typeof( RingOfTheVile ),
typeof( Aegis ),
typeof( ArcaneShield ),
typeof( AxeOfTheHeavens ),
typeof( BladeOfInsanity ),
typeof( BoneCrusher ),
typeof( BreathOfTheDead ),
typeof( Frostbringer ),
typeof( SerpentsFang ),
typeof( StaffOfTheMagi ),
typeof( TheBeserkersMaul ),
typeof( TheDryadBow ),
typeof( DivineCountenance ),
typeof( HatOfTheMagi ),
typeof( HuntersHeaddress ),
typeof( SpiritOfTheTotem )
};
public static Item CreateRandomArtifact()
{
if ( !Core.AOS )
return null;
int count = ( m_ArtifactRarity10.Length * 5 ) + ( m_ArtifactRarity11.Length * 4 );
int random = Utility.Random( count );
Type type;
if ( random < ( m_ArtifactRarity10.Length * 5 ) )
{
type = m_ArtifactRarity10[random / 5];
}
else
{
random -= m_ArtifactRarity10.Length * 5;
type = m_ArtifactRarity11[random / 4];
}
return Loot.Construct( type );
}
public static Mobile FindRandomPlayer( BaseCreature creature )
{
List<DamageStore> rights = BaseCreature.GetLootingRights( creature.DamageEntries, creature.HitsMax );
for ( int i = rights.Count - 1; i >= 0; --i )
{
DamageStore ds = rights[i];
if ( !ds.m_HasRight )
rights.RemoveAt( i );
}
if ( rights.Count > 0 )
return rights[Utility.Random( rights.Count )].m_Mobile;
return null;
}
public static void DistributeArtifact( BaseCreature creature )
{
DistributeArtifact( creature, CreateRandomArtifact() );
}
public static void DistributeArtifact( BaseCreature creature, Item artifact )
{
DistributeArtifact( FindRandomPlayer( creature ), artifact );
}
public static void DistributeArtifact( Mobile to )
{
DistributeArtifact( to, CreateRandomArtifact() );
}
public static void DistributeArtifact( Mobile to, Item artifact )
{
if ( to == null || artifact == null )
return;
Container pack = to.Backpack;
if ( pack == null || !pack.TryDropItem( to, artifact, false ) )
to.BankBox.DropItem( artifact );
to.SendLocalizedMessage( 1062317 ); // For your valor in combating the fallen beast, a special artifact has been bestowed on you.
}
public static int GetArtifactChance( Mobile boss )
{
if ( !Core.AOS )
return 0;
int luck = LootPack.GetLuckChanceForKiller( boss );
int chance;
if ( boss is DemonKnight )
chance = 1500 + (luck / 5);
else
chance = 750 + (luck / 10);
return chance;
}
public static bool CheckArtifactChance( Mobile boss )
{
return GetArtifactChance( boss ) > Utility.Random( 100000 );
}
public override WeaponAbility GetWeaponAbility()
{
switch ( Utility.Random( 3 ) )
{
default:
case 0: return WeaponAbility.DoubleStrike;
case 1: return WeaponAbility.WhirlwindAttack;
case 2: return WeaponAbility.CrushingBlow;
}
}
public override void OnDeath( Container c )
{
base.OnDeath( c );
if ( !Summoned && !NoKillAwards && DemonKnight.CheckArtifactChance( this ) )
DemonKnight.DistributeArtifact( this );
}
[Constructable]
public DemonKnight() : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = NameList.RandomName( "demon knight" );
Title = "the Dark Father";
Body = 318;
BaseSoundID = 0x165;
SetStr( 500 );
SetDex( 100 );
SetInt( 1000 );
SetHits( 30000 );
SetMana( 5000 );
SetDamage( 17, 21 );
SetDamageType( ResistanceType.Physical, 20 );
SetDamageType( ResistanceType.Fire, 20 );
SetDamageType( ResistanceType.Cold, 20 );
SetDamageType( ResistanceType.Poison, 20 );
SetDamageType( ResistanceType.Energy, 20 );
SetResistance( ResistanceType.Physical, 30 );
SetResistance( ResistanceType.Fire, 30 );
SetResistance( ResistanceType.Cold, 30 );
SetResistance( ResistanceType.Poison, 30 );
SetResistance( ResistanceType.Energy, 30 );
SetSkill( SkillName.Necromancy, 120, 120.0 );
SetSkill( SkillName.SpiritSpeak, 120.0, 120.0 );
SetSkill( SkillName.DetectHidden, 80.0 );
SetSkill( SkillName.EvalInt, 100.0 );
SetSkill( SkillName.Magery, 100.0 );
SetSkill( SkillName.Meditation, 120.0 );
SetSkill( SkillName.MagicResist, 150.0 );
SetSkill( SkillName.Tactics, 100.0 );
SetSkill( SkillName.Wrestling, 120.0 );
Fame = 28000;
Karma = -28000;
VirtualArmor = 64;
}
public override void GenerateLoot()
{
AddLoot( LootPack.SuperBoss, 2 );
AddLoot( LootPack.HighScrolls, Utility.RandomMinMax( 6, 60 ) );
}
public override bool BardImmune{ get{ return !Core.SE; } }
public override bool Unprovokable{ get{ return Core.SE; } }
public override bool AreaPeaceImmune { get { return Core.SE; } }
public override Poison PoisonImmune{ get{ return Poison.Lethal; } }
public override int TreasureMapLevel{ get{ return 1; } }
private static bool m_InHere;
public override void OnDamage( int amount, Mobile from, bool willKill )
{
if ( from != null && from != this && !m_InHere )
{
m_InHere = true;
AOS.Damage( from, this, Utility.RandomMinMax( 8, 20 ), 100, 0, 0, 0, 0 );
MovingEffect( from, 0xECA, 10, 0, false, false, 0, 0 );
PlaySound( 0x491 );
if ( 0.05 > Utility.RandomDouble() )
Timer.DelayCall( TimeSpan.FromSeconds( 1.0 ), new TimerStateCallback( CreateBones_Callback ), from );
m_InHere = false;
}
}
public virtual void CreateBones_Callback( object state )
{
Mobile from = (Mobile)state;
Map map = from.Map;
if ( map == null )
return;
int count = Utility.RandomMinMax( 1, 3 );
for ( int i = 0; i < count; ++i )
{
int x = from.X + Utility.RandomMinMax( -1, 1 );
int y = from.Y + Utility.RandomMinMax( -1, 1 );
int z = from.Z;
if ( !map.CanFit( x, y, z, 16, false, true ) )
{
z = map.GetAverageZ( x, y );
if ( z == from.Z || !map.CanFit( x, y, z, 16, false, true ) )
continue;
}
UnholyBone bone = new UnholyBone();
bone.Hue = 0;
bone.Name = "unholy bones";
bone.ItemID = Utility.Random( 0xECA, 9 );
bone.MoveToWorld( new Point3D( x, y, z ), map );
}
}
public DemonKnight( Serial serial ) : base( serial )
{
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write( (int) 0 );
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
}
}
}

View file

@ -0,0 +1,75 @@
using System;
using Server;
using Server.Items;
namespace Server.Mobiles
{
[CorpseName( "a devourer of souls corpse" )]
public class Devourer : BaseCreature
{
[Constructable]
public Devourer() : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "a devourer of souls";
Body = 303;
BaseSoundID = 357;
SetStr( 801, 950 );
SetDex( 126, 175 );
SetInt( 201, 250 );
SetHits( 650 );
SetDamage( 22, 26 );
SetDamageType( ResistanceType.Physical, 60 );
SetDamageType( ResistanceType.Cold, 20 );
SetDamageType( ResistanceType.Energy, 20 );
SetResistance( ResistanceType.Physical, 45, 55 );
SetResistance( ResistanceType.Fire, 25, 35 );
SetResistance( ResistanceType.Cold, 15, 25 );
SetResistance( ResistanceType.Poison, 60, 70 );
SetResistance( ResistanceType.Energy, 40, 50 );
SetSkill( SkillName.EvalInt, 90.1, 100.0 );
SetSkill( SkillName.Magery, 90.1, 100.0 );
SetSkill( SkillName.Meditation, 90.1, 100.0 );
SetSkill( SkillName.MagicResist, 90.1, 105.0 );
SetSkill( SkillName.Tactics, 75.1, 85.0 );
SetSkill( SkillName.Wrestling, 80.1, 100.0 );
Fame = 9500;
Karma = -9500;
VirtualArmor = 44;
PackNecroReg( 24, 45 );
}
public override void GenerateLoot()
{
AddLoot( LootPack.FilthyRich, 2 );
}
public override Poison PoisonImmune{ get{ return Poison.Lethal; } }
public override int Meat{ get{ return 3; } }
public Devourer( Serial serial ) : base( serial )
{
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write( (int) 0 );
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
}
}
}

View file

@ -0,0 +1,72 @@
using System;
using Server;
using Server.Items;
namespace Server.Mobiles
{
[CorpseName( "a flesh golem corpse" )]
public class FleshGolem : BaseCreature
{
public override WeaponAbility GetWeaponAbility()
{
return WeaponAbility.BleedAttack;
}
[Constructable]
public FleshGolem() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "a flesh golem";
Body = 304;
BaseSoundID = 684;
SetStr( 176, 200 );
SetDex( 51, 75 );
SetInt( 46, 70 );
SetHits( 106, 120 );
SetDamage( 18, 22 );
SetDamageType( ResistanceType.Physical, 100 );
SetResistance( ResistanceType.Physical, 50, 60 );
SetResistance( ResistanceType.Fire, 25, 35 );
SetResistance( ResistanceType.Cold, 15, 25 );
SetResistance( ResistanceType.Poison, 60, 70 );
SetResistance( ResistanceType.Energy, 30, 40 );
SetSkill( SkillName.MagicResist, 50.1, 75.0 );
SetSkill( SkillName.Tactics, 55.1, 80.0 );
SetSkill( SkillName.Wrestling, 60.1, 70.0 );
Fame = 1000;
Karma = -1800;
VirtualArmor = 34;
}
public override void GenerateLoot()
{
AddLoot( LootPack.Average );
}
public override bool BleedImmune{ get{ return true; } }
public override int TreasureMapLevel{ get{ return 1; } }
public FleshGolem( Serial serial ) : base( serial )
{
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write( (int) 0 );
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
}
}
}

View file

@ -0,0 +1,117 @@
using System;
using Server;
using Server.Items;
namespace Server.Mobiles
{
[CorpseName( "a fleshrenderer corpse" )]
public class FleshRenderer : BaseCreature
{
public override WeaponAbility GetWeaponAbility()
{
return Utility.RandomBool() ? WeaponAbility.Dismount : WeaponAbility.ParalyzingBlow;
}
public override bool IgnoreYoungProtection { get { return Core.ML; } }
[Constructable]
public FleshRenderer() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "a fleshrenderer";
Body = 315;
SetStr( 401, 460 );
SetDex( 201, 210 );
SetInt( 221, 260 );
SetHits( 4500 );
SetDamage( 16, 20 );
SetDamageType( ResistanceType.Physical, 80 );
SetDamageType( ResistanceType.Poison, 20 );
SetResistance( ResistanceType.Physical, 80, 90 );
SetResistance( ResistanceType.Fire, 50, 60 );
SetResistance( ResistanceType.Cold, 50, 60 );
SetResistance( ResistanceType.Poison, 100 );
SetResistance( ResistanceType.Energy, 70, 80 );
SetSkill( SkillName.DetectHidden, 80.0 );
SetSkill( SkillName.MagicResist, 155.1, 160.0 );
SetSkill( SkillName.Meditation, 100.0 );
SetSkill( SkillName.Tactics, 100.0 );
SetSkill( SkillName.Wrestling, 90.1, 100.0 );
Fame = 23000;
Karma = -23000;
VirtualArmor = 24;
}
public override void GenerateLoot()
{
AddLoot( LootPack.UltraRich, 2 );
}
public override void OnDeath( Container c )
{
base.OnDeath( c );
if ( !Summoned && !NoKillAwards && DemonKnight.CheckArtifactChance( this ) )
DemonKnight.DistributeArtifact( this );
}
public override bool AutoDispel{ get{ return true; } }
public override bool BardImmune { get { return !Core.SE; } }
public override bool Unprovokable { get { return Core.SE; } }
public override bool AreaPeaceImmune { get { return Core.SE; } }
public override Poison PoisonImmune{ get{ return Poison.Lethal; } }
public override int TreasureMapLevel{ get{ return 1; } }
public override int GetAttackSound()
{
return 0x34C;
}
public override int GetHurtSound()
{
return 0x354;
}
public override int GetAngerSound()
{
return 0x34C;
}
public override int GetIdleSound()
{
return 0x34C;
}
public override int GetDeathSound()
{
return 0x354;
}
public FleshRenderer( Serial serial ) : base( serial )
{
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write( (int) 0 );
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
if ( BaseSoundID == 660 )
BaseSoundID = -1;
}
}
}

View file

@ -0,0 +1,73 @@
using System;
using Server;
using Server.Items;
namespace Server.Mobiles
{
[CorpseName( "a gibberling corpse" )]
public class Gibberling : BaseCreature
{
public override WeaponAbility GetWeaponAbility()
{
return WeaponAbility.Dismount;
}
[Constructable]
public Gibberling() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "a gibberling";
Body = 307;
BaseSoundID = 422;
SetStr( 141, 165 );
SetDex( 101, 125 );
SetInt( 56, 80 );
SetHits( 85, 99 );
SetDamage( 12, 17 );
SetDamageType( ResistanceType.Physical, 0 );
SetDamageType( ResistanceType.Fire, 40 );
SetDamageType( ResistanceType.Energy, 60 );
SetResistance( ResistanceType.Physical, 45, 55 );
SetResistance( ResistanceType.Fire, 25, 35 );
SetResistance( ResistanceType.Cold, 25, 35 );
SetResistance( ResistanceType.Poison, 10, 20 );
SetResistance( ResistanceType.Energy, 30, 40 );
SetSkill( SkillName.MagicResist, 45.1, 70.0 );
SetSkill( SkillName.Tactics, 67.6, 92.5 );
SetSkill( SkillName.Wrestling, 60.1, 80.0 );
Fame = 1500;
Karma = -1500;
VirtualArmor = 27;
}
public override void GenerateLoot()
{
AddLoot( LootPack.Meager );
}
public override int TreasureMapLevel{ get{ return 1; } }
public Gibberling( Serial serial ) : base( serial )
{
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write( (int) 0 );
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
}
}
}

View file

@ -0,0 +1,72 @@
using System;
using Server;
using Server.Items;
namespace Server.Mobiles
{
[CorpseName( "a gore fiend corpse" )]
public class GoreFiend : BaseCreature
{
[Constructable]
public GoreFiend() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "a gore fiend";
Body = 305;
BaseSoundID = 224;
SetStr( 161, 185 );
SetDex( 41, 65 );
SetInt( 46, 70 );
SetHits( 97, 111 );
SetDamage( 15, 21 );
SetDamageType( ResistanceType.Physical, 85 );
SetDamageType( ResistanceType.Poison, 15 );
SetResistance( ResistanceType.Physical, 35, 45 );
SetResistance( ResistanceType.Fire, 25, 35 );
SetResistance( ResistanceType.Cold, 15, 25 );
SetResistance( ResistanceType.Poison, 5, 15 );
SetResistance( ResistanceType.Energy, 30, 40 );
SetSkill( SkillName.MagicResist, 40.1, 55.0 );
SetSkill( SkillName.Tactics, 45.1, 70.0 );
SetSkill( SkillName.Wrestling, 50.1, 70.0 );
Fame = 1500;
Karma = -1500;
VirtualArmor = 24;
}
public override void GenerateLoot()
{
AddLoot( LootPack.Average );
}
public override int GetDeathSound()
{
return 1218;
}
public override bool BleedImmune{ get{ return true; } }
public GoreFiend( Serial serial ) : base( serial )
{
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write( (int) 0 );
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
}
}
}

View file

@ -0,0 +1,94 @@
using System;
using Server;
using Server.Items;
namespace Server.Mobiles
{
[CorpseName( "an impaler corpse" )]
public class Impaler : BaseCreature
{
public override WeaponAbility GetWeaponAbility()
{
return Utility.RandomBool() ? WeaponAbility.MortalStrike : WeaponAbility.BleedAttack;
}
public override bool IgnoreYoungProtection { get { return Core.ML; } }
[Constructable]
public Impaler() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = NameList.RandomName( "impaler" );
Body = 306;
BaseSoundID = 0x2A7;
SetStr( 190 );
SetDex( 45 );
SetInt( 190 );
SetHits( 5000 );
SetDamage( 31, 35 );
SetDamageType( ResistanceType.Physical, 100 );
SetResistance( ResistanceType.Physical, 90 );
SetResistance( ResistanceType.Fire, 60 );
SetResistance( ResistanceType.Cold, 75 );
SetResistance( ResistanceType.Poison, 60 );
SetResistance( ResistanceType.Energy, 100 );
SetSkill( SkillName.DetectHidden, 80.0 );
SetSkill( SkillName.Meditation, 120.0 );
SetSkill( SkillName.Poisoning, 160.0 );
SetSkill( SkillName.MagicResist, 100.0 );
SetSkill( SkillName.Tactics, 100.0 );
SetSkill( SkillName.Wrestling, 80.0 );
Fame = 24000;
Karma = -24000;
VirtualArmor = 49;
}
public override void GenerateLoot()
{
AddLoot( LootPack.UltraRich, 2 );
}
public override void OnDeath( Container c )
{
base.OnDeath( c );
if ( !Summoned && !NoKillAwards && DemonKnight.CheckArtifactChance( this ) )
DemonKnight.DistributeArtifact( this );
}
public override bool AutoDispel{ get{ return true; } }
public override bool BardImmune{ get{ return !Core.SE; } }
public override bool Unprovokable{ get{ return Core.SE; } }
public override bool AreaPeaceImmune { get { return Core.SE; } }
public override Poison PoisonImmune{ get{ return Poison.Lethal; } }
public override Poison HitPoison{ get{ return (0.8 >= Utility.RandomDouble() ? Poison.Greater : Poison.Deadly); } }
public override int TreasureMapLevel{ get{ return 1; } }
public Impaler( Serial serial ) : base( serial )
{
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write( (int) 0 );
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
if ( BaseSoundID == 1200 )
BaseSoundID = 0x2A7;
}
}
}

View file

@ -0,0 +1,66 @@
using System;
using Server;
using Server.Items;
namespace Server.Mobiles
{
[CorpseName( "a maggoty corpse" )] // TODO: Corpse name?
public class MoundOfMaggots : BaseCreature
{
[Constructable]
public MoundOfMaggots() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "a mound of maggots";
Body = 319;
BaseSoundID = 898;
SetStr( 61, 70 );
SetDex( 61, 70 );
SetInt( 10 );
SetMana( 0 );
SetDamage( 3, 9 );
SetDamageType( ResistanceType.Physical, 50 );
SetDamageType( ResistanceType.Poison, 50 );
SetResistance( ResistanceType.Physical, 90 );
SetResistance( ResistanceType.Poison, 100 );
SetSkill( SkillName.Tactics, 50.0 );
SetSkill( SkillName.Wrestling, 50.1, 60.0 );
Fame = 1000;
Karma = -1000;
VirtualArmor = 24;
}
public override void GenerateLoot()
{
AddLoot( LootPack.Meager );
AddLoot( LootPack.Gems );
}
public override Poison PoisonImmune{ get{ return Poison.Lethal; } }
public override int TreasureMapLevel{ get{ return 1; } }
public MoundOfMaggots( Serial serial ) : base( serial )
{
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write( (int) 0 );
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
}
}
}

View file

@ -0,0 +1,75 @@
using System;
using Server;
using Server.Items;
namespace Server.Mobiles
{
[CorpseName( "a patchwork skeletal corpse" )]
public class PatchworkSkeleton : BaseCreature
{
public override WeaponAbility GetWeaponAbility()
{
return WeaponAbility.Dismount;
}
[Constructable]
public PatchworkSkeleton() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "a patchwork skeleton";
Body = 309;
BaseSoundID = 0x48D;
SetStr( 96, 120 );
SetDex( 71, 95 );
SetInt( 16, 40 );
SetHits( 58, 72 );
SetDamage( 18, 22 );
SetDamageType( ResistanceType.Physical, 85 );
SetDamageType( ResistanceType.Cold, 15 );
SetResistance( ResistanceType.Physical, 55, 65 );
SetResistance( ResistanceType.Fire, 50, 60 );
SetResistance( ResistanceType.Cold, 70, 80 );
SetResistance( ResistanceType.Poison, 100 );
SetResistance( ResistanceType.Energy, 40, 50 );
SetSkill( SkillName.MagicResist, 70.1, 95.0 );
SetSkill( SkillName.Tactics, 55.1, 80.0 );
SetSkill( SkillName.Wrestling, 50.1, 70.0 );
Fame = 500;
Karma = -500;
VirtualArmor = 54;
}
public override void GenerateLoot()
{
AddLoot( LootPack.Meager );
}
public override bool BleedImmune{ get{ return true; } }
public override Poison PoisonImmune{ get{ return Poison.Lethal; } }
public override int TreasureMapLevel{ get{ return 1; } }
public PatchworkSkeleton( Serial serial ) : base( serial )
{
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write( (int) 0 );
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
}
}
}

View file

@ -0,0 +1,69 @@
using System;
using Server;
using Server.Items;
namespace Server.Mobiles
{
[CorpseName( "a ravager corpse" )]
public class Ravager : BaseCreature
{
public override WeaponAbility GetWeaponAbility()
{
return Utility.RandomBool() ? WeaponAbility.Dismount : WeaponAbility.CrushingBlow;
}
[Constructable]
public Ravager() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "a ravager";
Body = 314;
BaseSoundID = 357;
SetStr( 251, 275 );
SetDex( 101, 125 );
SetInt( 66, 90 );
SetHits( 161, 175 );
SetDamage( 15, 20 );
SetDamageType( ResistanceType.Physical, 100 );
SetResistance( ResistanceType.Physical, 50, 60 );
SetResistance( ResistanceType.Fire, 50, 60 );
SetResistance( ResistanceType.Cold, 60, 70 );
SetResistance( ResistanceType.Poison, 30, 40 );
SetResistance( ResistanceType.Energy, 20, 30 );
SetSkill( SkillName.MagicResist, 50.1, 75.0 );
SetSkill( SkillName.Tactics, 75.1, 100.0 );
SetSkill( SkillName.Wrestling, 70.1, 90.0 );
Fame = 3500;
Karma = -3500;
VirtualArmor = 54;
}
public override void GenerateLoot()
{
AddLoot( LootPack.Rich );
}
public Ravager( Serial serial ) : base( serial )
{
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write( (int) 0 );
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
}
}
}

View file

@ -0,0 +1,183 @@
using System;
using Server;
using Server.Items;
using Server.Targeting;
namespace Server.Mobiles
{
public class Revenant : BaseCreature
{
private Mobile m_Target;
private DateTime m_ExpireTime;
public override void DisplayPaperdollTo( Mobile to )
{
// Do nothing
}
public override Mobile ConstantFocus{ get{ return m_Target; } }
public override bool NoHouseRestrictions{ get{ return true; } }
public override double DispelDifficulty{ get{ return 80.0; } }
public override double DispelFocus{ get{ return 20.0; } }
public Revenant( Mobile caster, Mobile target, TimeSpan duration ) : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.18, 0.36 )
{
Name = "a revenant";
Body = 400;
Hue = 1;
// TODO: Sound values?
double scalar = caster.Skills[SkillName.SpiritSpeak].Value * 0.01;
m_Target = target;
m_ExpireTime = DateTime.UtcNow + duration;
SetStr( 200 );
SetDex( 150 );
SetInt( 150 );
SetDamage( 16, 17 );
// Bestiary says 50 phys 50 cold, animal lore says differently
SetDamageType( ResistanceType.Physical, 100 );
SetSkill( SkillName.MagicResist, 100.0 * scalar ); // magic resist is absolute value of spiritspeak
SetSkill( SkillName.Tactics, 100.0 ); // always 100
SetSkill( SkillName.Swords, 100.0 * scalar ); // not displayed in animal lore but tests clearly show this is influenced
SetSkill( SkillName.DetectHidden, 75.0 * scalar );
scalar /= 1.2;
SetResistance( ResistanceType.Physical, 40 + (int)(20 * scalar), 50 + (int)(20 * scalar) );
SetResistance( ResistanceType.Cold, 40 + (int)(20 * scalar), 50 + (int)(20 * scalar) );
SetResistance( ResistanceType.Fire, (int)(20 * scalar) );
SetResistance( ResistanceType.Poison, 100 );
SetResistance( ResistanceType.Energy, 40 + (int)(20 * scalar), 50 + (int)(20 * scalar) );
Fame = 0;
Karma = 0;
ControlSlots = 3;
VirtualArmor = 32;
Item shroud = new DeathShroud();
shroud.Hue = 0x455;
shroud.Movable = false;
AddItem( shroud );
Halberd weapon = new Halberd();
weapon.Hue = 1;
weapon.Movable = false;
AddItem( weapon );
}
public override bool AlwaysMurderer{ get{ return true; } }
public override bool BleedImmune{ get{ return true; } }
public override bool BardImmune{ get{ return true; } }
public override Poison PoisonImmune{ get{ return Poison.Lethal; } }
public override void OnThink()
{
if ( !m_Target.Alive || DateTime.UtcNow > m_ExpireTime )
{
Kill();
return;
}
else if ( Map != m_Target.Map || !InRange( m_Target, 15 ) )
{
Map fromMap = Map;
Point3D from = Location;
Map toMap = m_Target.Map;
Point3D to = m_Target.Location;
if ( toMap != null )
{
for ( int i = 0; i < 5; ++i )
{
Point3D loc = new Point3D( to.X - 4 + Utility.Random( 9 ), to.Y - 4 + Utility.Random( 9 ), to.Z );
if ( toMap.CanSpawnMobile( loc ) )
{
to = loc;
break;
}
else
{
loc.Z = toMap.GetAverageZ( loc.X, loc.Y );
if ( toMap.CanSpawnMobile( loc ) )
{
to = loc;
break;
}
}
}
}
Map = toMap;
Location = to;
ProcessDelta();
Effects.SendLocationParticles( EffectItem.Create( from, fromMap, EffectItem.DefaultDuration ), 0x3728, 1, 13, 37, 7, 5023, 0 );
FixedParticles( 0x3728, 1, 13, 5023, 37, 7, EffectLayer.Waist );
PlaySound( 0x37D );
}
if (m_Target.Hidden && InRange(m_Target, 3) && Core.TickCount - this.NextSkillTime >= 0 && UseSkill(SkillName.DetectHidden))
{
Target targ = this.Target;
if ( targ != null )
targ.Invoke( this, this );
}
Combatant = m_Target;
FocusMob = m_Target;
if ( AIObject != null )
AIObject.Action = ActionType.Combat;
base.OnThink();
}
public override bool OnBeforeDeath()
{
Effects.PlaySound( Location, Map, 0x10B );
Effects.SendLocationParticles( EffectItem.Create( Location, Map, TimeSpan.FromSeconds( 10.0 ) ), 0x37CC, 1, 50, 2101, 7, 9909, 0 );
Delete();
return false;
}
public Revenant( Serial serial ) : base( serial )
{
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write( (int) 0 );
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
Delete();
}
}
}

View file

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

View file

@ -0,0 +1,68 @@
using System;
using Server;
using Server.Items;
namespace Server.Mobiles
{
[CorpseName( "a skittering hopper corpse" )]
public class SkitteringHopper : BaseCreature
{
[Constructable]
public SkitteringHopper() : base( AIType.AI_Melee, FightMode.Aggressor, 10, 1, 0.2, 0.4 )
{
Name = "a skittering hopper";
Body = 302;
BaseSoundID = 959;
SetStr( 41, 65 );
SetDex( 91, 115 );
SetInt( 26, 50 );
SetHits( 31, 45 );
SetDamage( 3, 5 );
SetDamageType( ResistanceType.Physical, 100 );
SetResistance( ResistanceType.Physical, 5, 10 );
SetResistance( ResistanceType.Cold, 10, 20 );
SetResistance( ResistanceType.Energy, 5, 10 );
SetSkill( SkillName.MagicResist, 30.1, 45.0 );
SetSkill( SkillName.Tactics, 45.1, 70.0 );
SetSkill( SkillName.Wrestling, 40.1, 60.0 );
Fame = 300;
Karma = 0;
Tamable = true;
ControlSlots = 1;
MinTameSkill = -12.9;
VirtualArmor = 12;
}
public override void GenerateLoot()
{
AddLoot( LootPack.Meager );
}
public override int TreasureMapLevel{ get{ return 1; } }
public SkitteringHopper( Serial serial ) : base( serial )
{
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write( (int) 0 );
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
}
}
}

View file

@ -0,0 +1,93 @@
using System;
using Server;
using Server.Items;
namespace Server.Mobiles
{
[CorpseName( "a treefellow corpse" )]
public class Treefellow : BaseCreature
{
public override WeaponAbility GetWeaponAbility()
{
return WeaponAbility.Dismount;
}
[Constructable]
public Treefellow() : base( AIType.AI_Melee, FightMode.Evil, 10, 1, 0.2, 0.4 )
{
Name = "a treefellow";
Body = 301;
SetStr( 196, 220 );
SetDex( 31, 55 );
SetInt( 66, 90 );
SetHits( 118, 132 );
SetDamage( 12, 16 );
SetDamageType( ResistanceType.Physical, 100 );
SetResistance( ResistanceType.Physical, 20, 25 );
SetResistance( ResistanceType.Cold, 50, 60 );
SetResistance( ResistanceType.Poison, 30, 35 );
SetResistance( ResistanceType.Energy, 20, 30 );
SetSkill( SkillName.MagicResist, 40.1, 55.0 );
SetSkill( SkillName.Tactics, 65.1, 90.0 );
SetSkill( SkillName.Wrestling, 65.1, 85.0 );
Fame = 500;
Karma = 1500;
VirtualArmor = 24;
PackItem( new Log( Utility.RandomMinMax( 23, 34 ) ) );
}
public override OppositionGroup OppositionGroup
{
get{ return OppositionGroup.FeyAndUndead; }
}
public override int GetIdleSound()
{
return 443;
}
public override int GetDeathSound()
{
return 31;
}
public override int GetAttackSound()
{
return 672;
}
public override bool BleedImmune{ get{ return true; } }
public override void GenerateLoot()
{
AddLoot( LootPack.Average );
}
public Treefellow( Serial serial ) : base( serial )
{
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write( (int) 0 );
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
if ( BaseSoundID == 442 )
BaseSoundID = -1;
}
}
}

View file

@ -0,0 +1,70 @@
using System;
using Server;
using Server.Items;
namespace Server.Mobiles
{
[CorpseName( "a vampire bat corpse" )]
public class VampireBat : BaseCreature
{
[Constructable]
public VampireBat() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "a vampire bat";
Body = 317;
BaseSoundID = 0x270;
SetStr( 91, 110 );
SetDex( 91, 115 );
SetInt( 26, 50 );
SetHits( 55, 66 );
SetDamage( 7, 9 );
SetDamageType( ResistanceType.Physical, 80 );
SetDamageType( ResistanceType.Poison, 20 );
SetResistance( ResistanceType.Physical, 35, 45 );
SetResistance( ResistanceType.Fire, 15, 25 );
SetResistance( ResistanceType.Cold, 15, 25 );
SetResistance( ResistanceType.Poison, 60, 70 );
SetResistance( ResistanceType.Energy, 40, 50 );
SetSkill( SkillName.MagicResist, 70.1, 95.0 );
SetSkill( SkillName.Tactics, 55.1, 80.0 );
SetSkill( SkillName.Wrestling, 30.1, 55.0 );
Fame = 1000;
Karma = -1000;
VirtualArmor = 14;
}
public override void GenerateLoot()
{
AddLoot( LootPack.Poor );
}
public override int GetIdleSound()
{
return 0x29B;
}
public VampireBat( Serial serial ) : base( serial )
{
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write( (int) 0 );
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
}
}
}

View file

@ -0,0 +1,73 @@
using System;
using Server;
using Server.Items;
namespace Server.Mobiles
{
[CorpseName( "a wailing banshee corpse" )]
public class WailingBanshee : BaseCreature
{
public override WeaponAbility GetWeaponAbility()
{
return WeaponAbility.MortalStrike;
}
[Constructable]
public WailingBanshee() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "a wailing banshee";
Body = 310;
BaseSoundID = 0x482;
SetStr( 126, 150 );
SetDex( 76, 100 );
SetInt( 86, 110 );
SetHits( 76, 90 );
SetDamage( 10, 14 );
SetDamageType( ResistanceType.Physical, 20 );
SetDamageType( ResistanceType.Cold, 60 );
SetDamageType( ResistanceType.Poison, 20 );
SetResistance( ResistanceType.Physical, 50, 60 );
SetResistance( ResistanceType.Fire, 25, 30 );
SetResistance( ResistanceType.Cold, 70, 80 );
SetResistance( ResistanceType.Poison, 30, 40 );
SetResistance( ResistanceType.Energy, 40, 50 );
SetSkill( SkillName.MagicResist, 70.1, 95.0 );
SetSkill( SkillName.Tactics, 45.1, 70.0 );
SetSkill( SkillName.Wrestling, 50.1, 70.0 );
Fame = 1500;
Karma = -1500;
VirtualArmor = 19;
}
public override void GenerateLoot()
{
AddLoot( LootPack.Meager );
}
public override bool BleedImmune{ get{ return true; } }
public WailingBanshee( Serial serial ) : base( serial )
{
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write( (int) 0 );
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
}
}
}

View file

@ -0,0 +1,78 @@
using System;
using Server;
using Server.Items;
namespace Server.Mobiles
{
[CorpseName( "a wanderer of the void corpse" )]
public class WandererOfTheVoid : BaseCreature
{
[Constructable]
public WandererOfTheVoid() : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 )
{
Name = "a wanderer of the void";
Body = 316;
BaseSoundID = 377;
SetStr( 111, 200 );
SetDex( 101, 125 );
SetInt( 301, 390 );
SetHits( 351, 400 );
SetDamage( 11, 13 );
SetDamageType( ResistanceType.Physical, 0 );
SetDamageType( ResistanceType.Cold, 15 );
SetDamageType( ResistanceType.Energy, 85 );
SetResistance( ResistanceType.Physical, 40, 50 );
SetResistance( ResistanceType.Fire, 15, 25 );
SetResistance( ResistanceType.Cold, 40, 50 );
SetResistance( ResistanceType.Poison, 50, 75 );
SetResistance( ResistanceType.Energy, 40, 50 );
SetSkill( SkillName.EvalInt, 60.1, 70.0 );
SetSkill( SkillName.Magery, 60.1, 70.0 );
SetSkill( SkillName.Meditation, 60.1, 70.0 );
SetSkill( SkillName.MagicResist, 50.1, 75.0 );
SetSkill( SkillName.Tactics, 60.1, 70.0 );
SetSkill( SkillName.Wrestling, 60.1, 70.0 );
Fame = 20000;
Karma = -20000;
VirtualArmor = 44;
int count = Utility.RandomMinMax( 2, 3 );
for ( int i = 0; i < count; ++i )
PackItem( new TreasureMap( 3, Map.Trammel ) );
}
public override bool BleedImmune{ get{ return true; } }
public override Poison PoisonImmune{ get{ return Poison.Lethal; } }
public override int TreasureMapLevel{ get{ return Core.AOS ? 4 : 1; } }
public override void GenerateLoot()
{
AddLoot( LootPack.FilthyRich );
}
public WandererOfTheVoid( Serial serial ) : base( serial )
{
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write( (int) 0 );
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
}
}
}