From 6962ed06bf58ef2c9c6daa5a1ae2a9b50bfde0e8 Mon Sep 17 00:00:00 2001 From: eos Date: Sun, 6 May 2012 03:46:11 +0000 Subject: [PATCH] - Updated WhoGump visibility of same AccessLevel players to resemble regular visibility. - Vendors should not handle speech starting with their name, only if it is followed by *buy* or *sell*. - Added most Prism of Light mobiles. --- Scripts/Gumps/WhoGump.cs | 4 +- Scripts/Mobiles/AI/VendorAI.cs | 12 +- Scripts/Mobiles/BaseCreature.cs | 10 +- .../ML/Prism of Light/CorporealBrume.cs | 83 ++++++++++ .../ML/Prism of Light/CrystalDaemon.cs | 85 ++++++++++ .../ML/Prism of Light/CrystalLatticeSeeker.cs | 153 ++++++++++++++++++ .../ML/Prism of Light/CrystalSeaSerpent.cs | 71 ++++++++ .../ML/Prism of Light/CrystalVortex.cs | 91 +++++++++++ .../Monsters/ML/Prism of Light/CrystalWisp.cs | 37 +++++ .../ML/Prism of Light/MantraEffervescence.cs | 71 ++++++++ .../Monsters/ML/Prism of Light/Protector.cs | 108 +++++++++++++ .../ML/Prism of Light/UnfrozenMummy.cs | 90 +++++++++++ 12 files changed, 805 insertions(+), 10 deletions(-) create mode 100644 Scripts/Mobiles/Monsters/ML/Prism of Light/CorporealBrume.cs create mode 100644 Scripts/Mobiles/Monsters/ML/Prism of Light/CrystalDaemon.cs create mode 100644 Scripts/Mobiles/Monsters/ML/Prism of Light/CrystalLatticeSeeker.cs create mode 100644 Scripts/Mobiles/Monsters/ML/Prism of Light/CrystalSeaSerpent.cs create mode 100644 Scripts/Mobiles/Monsters/ML/Prism of Light/CrystalVortex.cs create mode 100644 Scripts/Mobiles/Monsters/ML/Prism of Light/CrystalWisp.cs create mode 100644 Scripts/Mobiles/Monsters/ML/Prism of Light/MantraEffervescence.cs create mode 100644 Scripts/Mobiles/Monsters/ML/Prism of Light/Protector.cs create mode 100644 Scripts/Mobiles/Monsters/ML/Prism of Light/UnfrozenMummy.cs diff --git a/Scripts/Gumps/WhoGump.cs b/Scripts/Gumps/WhoGump.cs index 72443b7da..9676c3891 100644 --- a/Scripts/Gumps/WhoGump.cs +++ b/Scripts/Gumps/WhoGump.cs @@ -127,7 +127,7 @@ namespace Server.Gumps { Mobile m = states[i].Mobile; - if ( m != null && (m == owner || !m.Hidden || owner.AccessLevel > m.AccessLevel || (m is PlayerMobile && ((PlayerMobile)m).VisibilityList.Contains( owner ) ) ) ) + if ( m != null && (m == owner || !m.Hidden || owner.AccessLevel >= m.AccessLevel || (m is PlayerMobile && ((PlayerMobile)m).VisibilityList.Contains( owner ) ) ) ) { if ( filter != null && ( m.Name == null || m.Name.ToLower().IndexOf( filter ) < 0 ) ) continue; @@ -281,7 +281,7 @@ namespace Server.Gumps from.SendMessage( "That player is no longer online." ); from.SendGump( new WhoGump( from, m_Mobiles, m_Page ) ); } - else if ( m == from || !m.Hidden || from.AccessLevel > m.AccessLevel || (m is PlayerMobile && ((PlayerMobile)m).VisibilityList.Contains( from ))) + else if ( m == from || !m.Hidden || from.AccessLevel >= m.AccessLevel || (m is PlayerMobile && ((PlayerMobile)m).VisibilityList.Contains( from ))) { from.SendGump( new ClientGump( from, m.NetState ) ); } diff --git a/Scripts/Mobiles/AI/VendorAI.cs b/Scripts/Mobiles/AI/VendorAI.cs index f7dcaf070..75b814aa3 100644 --- a/Scripts/Mobiles/AI/VendorAI.cs +++ b/Scripts/Mobiles/AI/VendorAI.cs @@ -125,7 +125,7 @@ namespace Server.Mobiles ((BaseVendor)m_Mobile).VendorSell( from ); m_Mobile.FocusMob = from; } - else if ( e.HasKeyword( 0x3C ) ) + else if ( e.HasKeyword( 0x3C ) ) // *vendor buy* { e.Handled = true; @@ -134,12 +134,18 @@ namespace Server.Mobiles } else if ( WasNamed( e.Speech ) ) { - e.Handled = true; - if ( e.HasKeyword( 0x177 ) ) // *sell* + { + e.Handled = true; + ((BaseVendor)m_Mobile).VendorSell( from ); + } else if ( e.HasKeyword( 0x171 ) ) // *buy* + { + e.Handled = true; + ((BaseVendor)m_Mobile).VendorBuy( from ); + } m_Mobile.FocusMob = from; } diff --git a/Scripts/Mobiles/BaseCreature.cs b/Scripts/Mobiles/BaseCreature.cs index 1d20d22b7..5e5b09997 100644 --- a/Scripts/Mobiles/BaseCreature.cs +++ b/Scripts/Mobiles/BaseCreature.cs @@ -5045,11 +5045,11 @@ namespace Server.Mobiles public virtual int AuraRange { get { return 4; } } public virtual int AuraBaseDamage { get { return 5; } } - public virtual int AuraPhysicalDamage { get{ return 0; } } - public virtual int AuraFireDamage { get{ return 100; } } - public virtual int AuraColdDamage { get{ return 0; } } - public virtual int AuraPoisonDamage { get{ return 0; } } - public virtual int AuraEnergyDamage { get{ return 0; } } + public virtual int AuraPhysicalDamage { get { return 0; } } + public virtual int AuraFireDamage { get { return 100; } } + public virtual int AuraColdDamage { get { return 0; } } + public virtual int AuraPoisonDamage { get { return 0; } } + public virtual int AuraEnergyDamage { get { return 0; } } public virtual int AuraChaosDamage { get { return 0; } } public virtual void AuraDamage() diff --git a/Scripts/Mobiles/Monsters/ML/Prism of Light/CorporealBrume.cs b/Scripts/Mobiles/Monsters/ML/Prism of Light/CorporealBrume.cs new file mode 100644 index 000000000..ec8b21b63 --- /dev/null +++ b/Scripts/Mobiles/Monsters/ML/Prism of Light/CorporealBrume.cs @@ -0,0 +1,83 @@ +using System; +using Server; +using Server.Items; + +namespace Server.Mobiles +{ + [CorpseName( "a corporeal brume corpse" )] + public class CorporealBrume : BaseCreature + { + [Constructable] + public CorporealBrume() + : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 ) + { + Name = "a corporeal brume"; + Body = 0x104; // TODO: Verify + BaseSoundID = 0x56B; + + SetStr( 400, 450 ); + SetDex( 100, 150 ); + SetInt( 50, 60 ); + + SetHits( 1150, 1250 ); + + SetDamage( 21, 25 ); + + SetDamageType( ResistanceType.Physical, 100 ); + + SetResistance( ResistanceType.Physical, 100 ); + SetResistance( ResistanceType.Fire, 40, 50 ); + SetResistance( ResistanceType.Cold, 40, 50 ); + SetResistance( ResistanceType.Poison, 50, 60 ); + SetResistance( ResistanceType.Energy, 30, 40 ); + + SetSkill( SkillName.Wrestling, 110.0, 115.0 ); + SetSkill( SkillName.Tactics, 110.0, 115.0 ); + SetSkill( SkillName.MagicResist, 80.0, 95.0 ); + SetSkill( SkillName.Anatomy, 100.0, 110.0 ); + + Fame = 12000; + Karma = -12000; + } + + public override void GenerateLoot() + { + AddLoot( LootPack.FilthyRich ); + AddLoot( LootPack.Rich ); + } + + // TODO: Verify area attack specifics + public override bool HasAura { get { return ( Combatant != null ); } } + public override TimeSpan AuraInterval { get { return TimeSpan.FromSeconds( 20 ); } } + public override int AuraRange { get { return 10; } } + + public override int AuraBaseDamage { get { return Utility.RandomMinMax( 25, 35 ); } } + public override int AuraFireDamage { get { return 0; } } + public override int AuraColdDamage { get { return 100; } } + + public override void AuraEffect( Mobile m ) + { + m.FixedParticles( 0x374A, 10, 15, 5038, 1181, 2, EffectLayer.Head ); + m.PlaySound( 0x213 ); + } + + public CorporealBrume( Serial serial ) + : base( serial ) + { + } + + public override void Serialize( GenericWriter writer ) + { + base.Serialize( writer ); + + writer.Write( (int) 0 ); // version + } + + public override void Deserialize( GenericReader reader ) + { + base.Deserialize( reader ); + + int version = reader.ReadInt(); + } + } +} \ No newline at end of file diff --git a/Scripts/Mobiles/Monsters/ML/Prism of Light/CrystalDaemon.cs b/Scripts/Mobiles/Monsters/ML/Prism of Light/CrystalDaemon.cs new file mode 100644 index 000000000..4ed76891a --- /dev/null +++ b/Scripts/Mobiles/Monsters/ML/Prism of Light/CrystalDaemon.cs @@ -0,0 +1,85 @@ +using System; +using Server; +using Server.Items; + +namespace Server.Mobiles +{ + [CorpseName( "a crystal daemon corpse" )] + public class CrystalDaemon : BaseCreature + { + [Constructable] + public CrystalDaemon() + : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 ) + { + Name = "a crystal daemon"; + Body = 0x310; + Hue = 0x3E8; + BaseSoundID = 0x47D; + + SetStr( 140, 200 ); + SetDex( 120, 150 ); + SetInt( 800, 850 ); + + SetHits( 200, 220 ); + + SetDamage( 16, 20 ); + + SetDamageType( ResistanceType.Physical, 0 ); + SetDamageType( ResistanceType.Cold, 40 ); + SetDamageType( ResistanceType.Energy, 60 ); + + SetResistance( ResistanceType.Physical, 20, 40 ); + SetResistance( ResistanceType.Fire, 0, 20 ); + SetResistance( ResistanceType.Cold, 60, 80 ); + SetResistance( ResistanceType.Poison, 20, 40 ); + SetResistance( ResistanceType.Energy, 65, 75 ); + + SetSkill( SkillName.Wrestling, 60.0, 80.0 ); + SetSkill( SkillName.Tactics, 70.0, 80.0 ); + SetSkill( SkillName.MagicResist, 100.0, 110.0 ); + SetSkill( SkillName.Magery, 120.0, 130.0 ); + SetSkill( SkillName.EvalInt, 100.0, 110.0 ); + SetSkill( SkillName.Meditation, 100.0, 110.0 ); + + Fame = 15000; + Karma = -15000; + + PackArcaneScroll( 0, 1 ); + } + + public override void GenerateLoot() + { + AddLoot( LootPack.FilthyRich, 3 ); + } + + /* + // TODO: uncomment once added + public override void OnDeath( Container c ) + { + base.OnDeath( c ); + + if ( Utility.RandomDouble() < 0.4 ) + c.DropItem( new ScatteredCrystals() ); + } + */ + + public CrystalDaemon( Serial serial ) + : base( serial ) + { + } + + public override void Serialize( GenericWriter writer ) + { + base.Serialize( writer ); + + writer.Write( (int) 0 ); // version + } + + public override void Deserialize( GenericReader reader ) + { + base.Deserialize( reader ); + + int version = reader.ReadInt(); + } + } +} diff --git a/Scripts/Mobiles/Monsters/ML/Prism of Light/CrystalLatticeSeeker.cs b/Scripts/Mobiles/Monsters/ML/Prism of Light/CrystalLatticeSeeker.cs new file mode 100644 index 000000000..63e098356 --- /dev/null +++ b/Scripts/Mobiles/Monsters/ML/Prism of Light/CrystalLatticeSeeker.cs @@ -0,0 +1,153 @@ +using System; +using Server; +using Server.Items; + +namespace Server.Mobiles +{ + [CorpseName( "a Crystal Lattice Seeker corpse" )] + public class CrystalLatticeSeeker : BaseCreature + { + [Constructable] + public CrystalLatticeSeeker() + : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 ) + { + Name = "Crystal Lattice Seeker"; + Body = 0x7B; + Hue = 0x47E; + + SetStr( 550, 850 ); + SetDex( 190, 250 ); + SetInt( 350, 450 ); + + SetHits( 350, 550 ); + + SetDamage( 13, 19 ); + + SetDamageType( ResistanceType.Physical, 100 ); + + SetResistance( ResistanceType.Physical, 80, 90 ); + SetResistance( ResistanceType.Fire, 40, 50 ); + SetResistance( ResistanceType.Cold, 40, 50 ); + SetResistance( ResistanceType.Poison, 40, 50 ); + SetResistance( ResistanceType.Energy, 40, 50 ); + + SetSkill( SkillName.Anatomy, 50.0, 75.0 ); + SetSkill( SkillName.EvalInt, 90.0, 100.0 ); + SetSkill( SkillName.Magery, 100.0, 100.0 ); + SetSkill( SkillName.Meditation, 90.0, 100.0 ); + SetSkill( SkillName.MagicResist, 90.0, 100.0 ); + SetSkill( SkillName.Tactics, 90.0, 100.0 ); + SetSkill( SkillName.Wrestling, 90.0, 100.0 ); + + Fame = 17000; + Karma = -17000; + + PackArcaneScroll( 0, 2 ); + } + + public override void GenerateLoot() + { + AddLoot( LootPack.FilthyRich, 4 ); + // TODO: uncomment once added + //AddLoot( LootPack.Parrot ); + AddLoot( LootPack.Gems ); + } + + public override void OnGaveMeleeAttack( Mobile defender ) + { + base.OnGaveMeleeAttack( defender ); + + if ( Utility.RandomDouble() < 0.1 ) + Drain( defender ); + } + + public override void OnGotMeleeAttack( Mobile attacker ) + { + base.OnGotMeleeAttack( attacker ); + + if ( Utility.RandomDouble() < 0.1 ) + Drain( attacker ); + } + + public virtual void Drain( Mobile m ) + { + int toDrain; + + switch ( Utility.Random( 3 ) ) + { + case 0: + { + Say( 1042156 ); // I can grant life, and I can sap it as easily. + PlaySound( 0x1E6 ); + + toDrain = Utility.RandomMinMax( 3, 6 ); + Hits += toDrain; + m.Hits -= toDrain; + break; + } + case 1: + { + Say( 1042157 ); // You'll go nowhere, unless I deem it should be so. + PlaySound( 0x1DF ); + + toDrain = Utility.RandomMinMax( 10, 25 ); + Stam += toDrain; + m.Stam -= toDrain; + break; + } + case 2: + { + Say( 1042155 ); // Your power is mine to use as I will. + PlaySound( 0x1F8 ); + + toDrain = Utility.RandomMinMax( 15, 25 ); + Mana += toDrain; + m.Mana -= toDrain; + break; + } + } + } + + /* + // TODO: uncomment once added + public override void OnDeath( Container c ) + { + base.OnDeath( c ); + + if ( Utility.RandomDouble() < 0.75 ) + c.DropItem( new CrystallineFragments() ); + + if ( Utility.RandomDouble() < 0.07 ) + c.DropItem( new PiecesOfCrystal() ); + } + */ + + public override int Feathers { get { return 100; } } + public override int TreasureMapLevel { get { return 5; } } + + public override int GetAttackSound() { return 0x2F6; } + public override int GetDeathSound() { return 0x2F7; } + public override int GetAngerSound() { return 0x2F8; } + public override int GetHurtSound() { return 0x2F9; } + public override int GetIdleSound() { return 0x2FA; } + + public CrystalLatticeSeeker( Serial serial ) + : base( serial ) + { + } + + public override void Serialize( GenericWriter writer ) + { + base.Serialize( writer ); + + writer.Write( (int) 0 ); // version + } + + public override void Deserialize( GenericReader reader ) + { + base.Deserialize( reader ); + + int version = reader.ReadInt(); + } + } +} diff --git a/Scripts/Mobiles/Monsters/ML/Prism of Light/CrystalSeaSerpent.cs b/Scripts/Mobiles/Monsters/ML/Prism of Light/CrystalSeaSerpent.cs new file mode 100644 index 000000000..6fb0e4058 --- /dev/null +++ b/Scripts/Mobiles/Monsters/ML/Prism of Light/CrystalSeaSerpent.cs @@ -0,0 +1,71 @@ +using System; +using Server; +using Server.Items; + +namespace Server.Mobiles +{ + [CorpseName( "a crystal sea serpent corpse" )] + public class CrystalSeaSerpent : SeaSerpent + { + [Constructable] + public CrystalSeaSerpent() + { + Name = "a crystal sea serpent"; + Hue = 0x47E; + + SetStr( 250, 450 ); + SetDex( 100, 150 ); + SetInt( 90, 190 ); + + SetHits( 230, 330 ); + + SetDamage( 10, 18 ); + + SetDamageType( ResistanceType.Physical, 10 ); + SetDamageType( ResistanceType.Cold, 45 ); + SetDamageType( ResistanceType.Energy, 45 ); + + SetResistance( ResistanceType.Physical, 50, 70 ); + SetResistance( ResistanceType.Fire, 0 ); + SetResistance( ResistanceType.Cold, 70, 90 ); + SetResistance( ResistanceType.Poison, 20, 30 ); + SetResistance( ResistanceType.Energy, 60, 80 ); + } + + /* + // TODO: uncomment once added + public override void OnDeath( Container c ) + { + base.OnDeath( c ); + + if ( Utility.RandomDouble() < 0.05 ) + c.DropItem( new CrushedCrystals() ); + + if ( Utility.RandomDouble() < 0.1 ) + c.DropItem( new IcyHeart() ); + + if ( Utility.RandomDouble() < 0.1 ) + c.DropItem( new LuckyDagger() ); + } + */ + + public CrystalSeaSerpent( Serial serial ) + : base( serial ) + { + } + + public override void Serialize( GenericWriter writer ) + { + base.Serialize( writer ); + + writer.Write( (int) 0 ); // version + } + + public override void Deserialize( GenericReader reader ) + { + base.Deserialize( reader ); + + int version = reader.ReadInt(); + } + } +} diff --git a/Scripts/Mobiles/Monsters/ML/Prism of Light/CrystalVortex.cs b/Scripts/Mobiles/Monsters/ML/Prism of Light/CrystalVortex.cs new file mode 100644 index 000000000..35c288ba6 --- /dev/null +++ b/Scripts/Mobiles/Monsters/ML/Prism of Light/CrystalVortex.cs @@ -0,0 +1,91 @@ +using System; +using Server; +using Server.Items; + +namespace Server.Mobiles +{ + [CorpseName( "a crystal vortex corpse" )] + public class CrystalVortex : BaseCreature + { + [Constructable] + public CrystalVortex() + : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 ) + { + Name = "a crystal vortex"; + Body = 0xD; + Hue = 0x2B2; + BaseSoundID = 0x107; + + SetStr( 800, 900 ); + SetDex( 500, 600 ); + SetInt( 200 ); + + SetHits( 350, 400 ); + SetMana( 0 ); + + SetDamage( 15, 20 ); + + SetDamageType( ResistanceType.Physical, 0 ); + SetDamageType( ResistanceType.Cold, 50 ); + SetDamageType( ResistanceType.Energy, 50 ); + + SetResistance( ResistanceType.Physical, 60, 80 ); + SetResistance( ResistanceType.Fire, 0, 10 ); + SetResistance( ResistanceType.Cold, 70, 80 ); + SetResistance( ResistanceType.Poison, 40, 50 ); + SetResistance( ResistanceType.Energy, 60, 90 ); + + SetSkill( SkillName.MagicResist, 120.0 ); + SetSkill( SkillName.Tactics, 120.0 ); + SetSkill( SkillName.Wrestling, 120.0 ); + + Fame = 17000; + Karma = -17000; + + PackArcaneScroll( 0, 2 ); + } + + public override void GenerateLoot() + { + AddLoot( LootPack.FilthyRich, 2 ); + // TODO: uncomment once added + //AddLoot( LootPack.Parrot ); + } + + /* + // TODO: uncomment once added + public override void OnDeath( Container c ) + { + base.OnDeath( c ); + + if ( Utility.RandomDouble() < 0.75 ) + c.DropItem( new CrystallineFragments() ); + + if ( Utility.RandomDouble() < 0.06 ) + c.DropItem( new JaggedCrystals() ); + } + */ + + public override int GetAngerSound() { return 0x15; } + public override int GetAttackSound() { return 0x28; } + + public CrystalVortex( Serial serial ) + : base( serial ) + { + } + + public override void Serialize( GenericWriter writer ) + { + base.Serialize( writer ); + + writer.Write( (int) 0 ); // version + } + + public override void Deserialize( GenericReader reader ) + { + base.Deserialize( reader ); + + int version = reader.ReadInt(); + } + } +} diff --git a/Scripts/Mobiles/Monsters/ML/Prism of Light/CrystalWisp.cs b/Scripts/Mobiles/Monsters/ML/Prism of Light/CrystalWisp.cs new file mode 100644 index 000000000..902af5347 --- /dev/null +++ b/Scripts/Mobiles/Monsters/ML/Prism of Light/CrystalWisp.cs @@ -0,0 +1,37 @@ +using System; +using Server; +using Server.Items; + +namespace Server.Mobiles +{ + public class CrystalWisp : Wisp + { + [Constructable] + public CrystalWisp() + { + Name = "a crystal wisp"; + Hue = 0x482; + + PackArcaneScroll( 0, 1 ); + } + + public CrystalWisp( Serial serial ) + : base( serial ) + { + } + + public override void Serialize( GenericWriter writer ) + { + base.Serialize( writer ); + + writer.Write( (int) 0 ); // version + } + + public override void Deserialize( GenericReader reader ) + { + base.Deserialize( reader ); + + int version = reader.ReadInt(); + } + } +} diff --git a/Scripts/Mobiles/Monsters/ML/Prism of Light/MantraEffervescence.cs b/Scripts/Mobiles/Monsters/ML/Prism of Light/MantraEffervescence.cs new file mode 100644 index 000000000..dd583af81 --- /dev/null +++ b/Scripts/Mobiles/Monsters/ML/Prism of Light/MantraEffervescence.cs @@ -0,0 +1,71 @@ +using System; +using Server; +using Server.Items; + +namespace Server.Mobiles +{ + [CorpseName( "a mantra effervescence corpse" )] + public class MantraEffervescence : BaseCreature + { + [Constructable] + public MantraEffervescence() + : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 ) + { + Name = "a mantra effervescence"; + Body = 0x111; + BaseSoundID = 0x56E; + + SetStr( 130, 150 ); + SetDex( 120, 130 ); + SetInt( 150, 230 ); + + SetHits( 150, 250 ); + + SetDamage( 21, 25 ); + + SetDamageType( ResistanceType.Physical, 30 ); + SetDamageType( ResistanceType.Energy, 70 ); + + SetResistance( ResistanceType.Physical, 60, 65 ); + SetResistance( ResistanceType.Fire, 40, 50 ); + SetResistance( ResistanceType.Cold, 40, 50 ); + SetResistance( ResistanceType.Poison, 50, 60 ); + SetResistance( ResistanceType.Energy, 100 ); + + SetSkill( SkillName.Wrestling, 80.0, 85.0 ); + SetSkill( SkillName.Tactics, 80.0, 85.0 ); + SetSkill( SkillName.MagicResist, 105.0, 115.0 ); + SetSkill( SkillName.Magery, 90.0, 110.0 ); + SetSkill( SkillName.EvalInt, 80.0, 90.0 ); + SetSkill( SkillName.Meditation, 90.0, 100.0 ); + + Fame = 6500; + Karma = -6500; + } + + public override void GenerateLoot() + { + AddLoot( LootPack.FilthyRich ); + AddLoot( LootPack.Rich ); + } + + public MantraEffervescence( Serial serial ) + : base( serial ) + { + } + + public override void Serialize( GenericWriter writer ) + { + base.Serialize( writer ); + + writer.Write( (int) 0 ); // version + } + + public override void Deserialize( GenericReader reader ) + { + base.Deserialize( reader ); + + int version = reader.ReadInt(); + } + } +} diff --git a/Scripts/Mobiles/Monsters/ML/Prism of Light/Protector.cs b/Scripts/Mobiles/Monsters/ML/Prism of Light/Protector.cs new file mode 100644 index 000000000..7654da1e0 --- /dev/null +++ b/Scripts/Mobiles/Monsters/ML/Prism of Light/Protector.cs @@ -0,0 +1,108 @@ +using System; +using Server; +using Server.Items; + +namespace Server.Mobiles +{ + [CorpseName( "a human corpse" )] + public class Protector : BaseCreature + { + [Constructable] + public Protector() + : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 ) + { + Body = 401; + Female = true; + Hue = Race.Human.RandomSkinHue(); + HairItemID = Race.Human.RandomHair( this ); + HairHue = Race.Human.RandomHairHue(); + + Name = "a Protector"; + Title = "the mystic llamaherder"; + + SetStr( 700, 800 ); + SetDex( 100, 150 ); + SetInt( 50, 75 ); + + SetHits( 350, 450 ); + + SetDamage( 6, 12 ); + + SetDamageType( ResistanceType.Physical, 100 ); + + SetResistance( ResistanceType.Physical, 30, 40 ); + SetResistance( ResistanceType.Fire, 20, 30 ); + SetResistance( ResistanceType.Cold, 35, 40 ); + SetResistance( ResistanceType.Poison, 30, 40 ); + SetResistance( ResistanceType.Energy, 30, 40 ); + + SetSkill( SkillName.Wrestling, 70.0, 100.0 ); + SetSkill( SkillName.Tactics, 80.0, 100.0 ); + SetSkill( SkillName.MagicResist, 50.0, 70.0 ); + SetSkill( SkillName.Anatomy, 70.0, 100.0 ); + + Fame = 10000; + Karma = -10000; + + Item boots = new ThighBoots(); + boots.Movable = false; + boots.Hue = Utility.Random( 2 ); + + Item shroud = new Item( 0x204E ); + shroud.Layer = Layer.OuterTorso; + shroud.Movable = false; + shroud.Hue = boots.Hue ^ 1; + + AddItem( boots ); + AddItem( shroud ); + } + + public override bool AlwaysMurderer { get { return true; } } + public override bool PropertyTitle { get { return false; } } + public override bool ShowFameTitle { get { return false; } } + + public Protector( Serial serial ) + : base( serial ) + { + } + + public override void GenerateLoot( bool spawning ) + { + if ( spawning ) + return; // No loot/backpack on spawn + + base.GenerateLoot( true ); + base.GenerateLoot( false ); + } + + public override void GenerateLoot() + { + AddLoot( LootPack.FilthyRich ); + } + + /* + // TODO: uncomment once added + public override void OnDeath( Container c ) + { + base.OnDeath( c ); + + if ( Utility.RandomDouble() < 0.4 ) + c.DropItem( new ProtectorsEssence() ); + } + */ + + public override void Serialize( GenericWriter writer ) + { + base.Serialize( writer ); + + writer.Write( (int) 0 ); // version + } + + public override void Deserialize( GenericReader reader ) + { + base.Deserialize( reader ); + + int version = reader.ReadInt(); + } + } +} diff --git a/Scripts/Mobiles/Monsters/ML/Prism of Light/UnfrozenMummy.cs b/Scripts/Mobiles/Monsters/ML/Prism of Light/UnfrozenMummy.cs new file mode 100644 index 000000000..d720de34c --- /dev/null +++ b/Scripts/Mobiles/Monsters/ML/Prism of Light/UnfrozenMummy.cs @@ -0,0 +1,90 @@ +using System; +using Server; +using Server.Items; + +namespace Server.Mobiles +{ + [CorpseName( "an unfrozen mummy corpse" )] + public class UnfrozenMummy : BaseCreature + { + [Constructable] + public UnfrozenMummy() + : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.4, 0.8 ) + { + Name = "an unfrozen mummy"; + Body = 0x9B; + Hue = 0x480; + BaseSoundID = 0x1D7; + + SetStr( 450, 500 ); + SetDex( 200, 250 ); + SetInt( 800, 850 ); + + SetHits( 1500 ); + + SetDamage( 16, 20 ); + + SetDamageType( ResistanceType.Physical, 0 ); + SetDamageType( ResistanceType.Energy, 50 ); + SetDamageType( ResistanceType.Cold, 50 ); + + SetResistance( ResistanceType.Physical, 35, 40 ); + SetResistance( ResistanceType.Fire, 20, 30 ); + SetResistance( ResistanceType.Cold, 60, 80 ); + SetResistance( ResistanceType.Poison, 20, 30 ); + SetResistance( ResistanceType.Energy, 70, 80 ); + + SetSkill( SkillName.Wrestling, 90.0, 100.0 ); + SetSkill( SkillName.Tactics, 100.0 ); + SetSkill( SkillName.MagicResist, 250.0 ); + SetSkill( SkillName.Magery, 50.0, 60.0 ); + SetSkill( SkillName.EvalInt, 50.0, 60.0 ); + SetSkill( SkillName.Meditation, 80.0 ); + + Fame = 25000; + Karma = -25000; + + PackArcaneScroll( 0, 2 ); + } + + public override void GenerateLoot() + { + AddLoot( LootPack.UltraRich, 2 ); + // TODO: uncomment once added + //AddLoot( LootPack.Parrot ); + } + + /* + // TODO: uncomment once added + public override void OnDeath( Container c ) + { + base.OnDeath( c ); + + if ( Utility.RandomDouble() < 0.6 ) + c.DropItem( new BrokenCrystals() ); + + if ( Utility.RandomDouble() < 0.1 ) + c.DropItem( new ParrotItem() ); + } + */ + + public UnfrozenMummy( Serial serial ) + : base( serial ) + { + } + + public override void Serialize( GenericWriter writer ) + { + base.Serialize( writer ); + + writer.Write( (int) 0 ); // version + } + + public override void Deserialize( GenericReader reader ) + { + base.Deserialize( reader ); + + int version = reader.ReadInt(); + } + } +}