1967 lines
57 KiB
C#
1967 lines
57 KiB
C#
using System;
|
|
using Server;
|
|
using Server.Items;
|
|
using Server.Engines.PartySystem;
|
|
using Server.Network;
|
|
using System.Collections.Generic;
|
|
using Server.Engines.ShameRevamped;
|
|
|
|
namespace Server.Mobiles
|
|
{
|
|
[CorpseName("a mud pie corpse")]
|
|
public class MudPie : BaseCreature
|
|
{
|
|
public static Dictionary<Mobile, Timer> Table { get; private set; }
|
|
|
|
[Constructable]
|
|
public MudPie()
|
|
: base(AIType.AI_Melee, FightMode.Closest, 10, 1, 0.4, 0.2)
|
|
{
|
|
Name = "a mud pie";
|
|
Body = 779;
|
|
BaseSoundID = 422;
|
|
|
|
Hue = 2012;
|
|
|
|
SetStr(140, 210);
|
|
SetDex(70, 100);
|
|
SetInt(90, 110);
|
|
|
|
SetHits(280, 340);
|
|
|
|
SetDamage(9, 12);
|
|
|
|
SetDamageType(ResistanceType.Physical, 80);
|
|
SetDamageType(ResistanceType.Poison, 20);
|
|
|
|
SetResistance(ResistanceType.Physical, 30, 45);
|
|
SetResistance(ResistanceType.Fire, 35, 40);
|
|
SetResistance(ResistanceType.Cold, 30, 40);
|
|
SetResistance(ResistanceType.Poison, 35, 45);
|
|
SetResistance(ResistanceType.Energy, 40);
|
|
|
|
SetSkill(SkillName.MagicResist, 65, 85);
|
|
SetSkill(SkillName.Tactics, 65, 85);
|
|
SetSkill(SkillName.Wrestling, 65, 85);
|
|
|
|
Fame = 500;
|
|
Karma = -500;
|
|
|
|
PackReg(1, 2);
|
|
PackGem(1, 2);
|
|
|
|
PackItem(new ExecutionersCap());
|
|
|
|
if (0.33 > Utility.RandomDouble())
|
|
PackItem(new ExecutionersCap());
|
|
|
|
SetSpecialAbility(SpecialAbility.StickySkin);
|
|
}
|
|
|
|
public override void OnDeath(Container c)
|
|
{
|
|
base.OnDeath(c);
|
|
|
|
if (0.05 > Utility.RandomDouble() && Region.Find(c.Location, c.Map).IsPartOf("Shame"))
|
|
c.DropItem(new ShameCrystal());
|
|
}
|
|
|
|
public override void GenerateLoot()
|
|
{
|
|
this.AddLoot(LootPack.Rich, 1);
|
|
}
|
|
|
|
public MudPie(Serial serial)
|
|
: base(serial)
|
|
{
|
|
}
|
|
|
|
public override void Serialize(GenericWriter writer)
|
|
{
|
|
base.Serialize(writer);
|
|
writer.Write(0);
|
|
}
|
|
|
|
public override void Deserialize(GenericReader reader)
|
|
{
|
|
base.Deserialize(reader);
|
|
int version = reader.ReadInt();
|
|
}
|
|
}
|
|
|
|
[CorpseName("a stone elemental corpse")]
|
|
public class StoneElemental : EarthElemental
|
|
{
|
|
[Constructable]
|
|
public StoneElemental()
|
|
{
|
|
Name = "a stone elemental";
|
|
Hue = 2401;
|
|
|
|
SetStr(140, 210);
|
|
SetDex(80, 110);
|
|
SetInt(90, 120);
|
|
|
|
SetHits(900, 1000);
|
|
|
|
SetDamage(15, 17);
|
|
|
|
SetDamageType(ResistanceType.Physical, 100);
|
|
|
|
SetResistance(ResistanceType.Physical, 60, 65);
|
|
SetResistance(ResistanceType.Fire, 50, 60);
|
|
SetResistance(ResistanceType.Cold, 45, 55);
|
|
SetResistance(ResistanceType.Poison, 55, 60);
|
|
SetResistance(ResistanceType.Energy, 45, 55);
|
|
|
|
SetSkill(SkillName.MagicResist, 100.0);
|
|
SetSkill(SkillName.Tactics, 80.0, 96.0);
|
|
SetSkill(SkillName.Wrestling, 80.0, 97.0);
|
|
|
|
Fame = 4000;
|
|
Karma = -4000;
|
|
|
|
PackReg(1, 2);
|
|
PackGem(1, 2);
|
|
|
|
PackItem(new Granite());
|
|
PackItem(new Sand());
|
|
|
|
SetSpecialAbility(SpecialAbility.ColossalRage);
|
|
}
|
|
|
|
public override void OnDeath(Container c)
|
|
{
|
|
base.OnDeath(c);
|
|
|
|
if (0.15 > Utility.RandomDouble() && Region.Find(c.Location, c.Map).IsPartOf("Shame"))
|
|
c.DropItem(new ShameCrystal());
|
|
}
|
|
|
|
public override int TreasureMapLevel
|
|
{
|
|
get
|
|
{
|
|
return 2;
|
|
}
|
|
}
|
|
|
|
public override void GenerateLoot()
|
|
{
|
|
this.AddLoot(LootPack.FilthyRich, 2);
|
|
}
|
|
|
|
public StoneElemental(Serial serial)
|
|
: base(serial)
|
|
{
|
|
}
|
|
|
|
public override void Serialize(GenericWriter writer)
|
|
{
|
|
base.Serialize(writer);
|
|
writer.Write(0);
|
|
}
|
|
|
|
public override void Deserialize(GenericReader reader)
|
|
{
|
|
base.Deserialize(reader);
|
|
int version = reader.ReadInt();
|
|
}
|
|
}
|
|
|
|
[CorpseName("a cave troll corpse")]
|
|
public class CaveTroll : Troll
|
|
{
|
|
[CommandProperty(AccessLevel.GameMaster)]
|
|
public ShameWall Wall { get; set; }
|
|
|
|
[Constructable]
|
|
public CaveTroll() : this(null)
|
|
{
|
|
}
|
|
|
|
[Constructable]
|
|
public CaveTroll(ShameWall wall)
|
|
{
|
|
Name = "a cave troll";
|
|
BodyValue = 0x1;
|
|
FightMode = FightMode.Aggressor;
|
|
|
|
if (wall != null)
|
|
Title = "the wall guardian";
|
|
|
|
Hue = 638;
|
|
Wall = wall;
|
|
|
|
SetStr(180, 210);
|
|
SetDex(107, 205);
|
|
SetInt(40, 70);
|
|
|
|
SetHits(638, 978);
|
|
|
|
SetDamage(15, 17);
|
|
|
|
SetDamageType(ResistanceType.Physical, 100);
|
|
|
|
SetResistance(ResistanceType.Physical, 55, 65);
|
|
SetResistance(ResistanceType.Fire, 45, 55);
|
|
SetResistance(ResistanceType.Cold, 45, 55);
|
|
SetResistance(ResistanceType.Poison, 35, 45);
|
|
SetResistance(ResistanceType.Energy, 35, 45);
|
|
|
|
SetSkill(SkillName.MagicResist, 70, 90);
|
|
SetSkill(SkillName.Tactics, 80, 110);
|
|
SetSkill(SkillName.Wrestling, 80, 110);
|
|
SetSkill(SkillName.DetectHidden, 100.0);
|
|
|
|
Fame = 3500;
|
|
Karma = -3500;
|
|
PackGem(1);
|
|
|
|
PackItem(new Saltpeter(Utility.RandomMinMax(1, 5)));
|
|
PackItem(new Potash(Utility.RandomMinMax(1, 5)));
|
|
PackItem(new Charcoal(Utility.RandomMinMax(1, 5)));
|
|
PackItem(new BlackPowder(Utility.RandomMinMax(1, 5)));
|
|
|
|
SetWeaponAbility(WeaponAbility.ArmorIgnore);
|
|
}
|
|
|
|
public override MeatType MeatType { get { return MeatType.Ribs; } }
|
|
public override int Meat { get { return 2; } }
|
|
|
|
public override void OnDeath(Container c)
|
|
{
|
|
base.OnDeath(c);
|
|
|
|
if (Wall != null)
|
|
Wall.OnTrollKilled();
|
|
|
|
if (0.10 > Utility.RandomDouble() && Region.Find(c.Location, c.Map).IsPartOf("Shame"))
|
|
c.DropItem(new ShameCrystal());
|
|
}
|
|
|
|
public override int TreasureMapLevel
|
|
{
|
|
get
|
|
{
|
|
return 1;
|
|
}
|
|
}
|
|
|
|
public override void GenerateLoot()
|
|
{
|
|
this.AddLoot(LootPack.Rich, 2);
|
|
}
|
|
|
|
public CaveTroll(Serial serial)
|
|
: base(serial)
|
|
{
|
|
}
|
|
|
|
public override void Serialize(GenericWriter writer)
|
|
{
|
|
base.Serialize(writer);
|
|
writer.Write(0);
|
|
}
|
|
|
|
public override void Deserialize(GenericReader reader)
|
|
{
|
|
base.Deserialize(reader);
|
|
int version = reader.ReadInt();
|
|
}
|
|
}
|
|
|
|
[CorpseName("a clay golem corpse")]
|
|
public class ClayGolem : Golem
|
|
{
|
|
[Constructable]
|
|
public ClayGolem()
|
|
{
|
|
Name = "a clay golem";
|
|
Hue = 654;
|
|
|
|
SetStr(450, 600);
|
|
SetDex(100, 150);
|
|
SetInt(100, 150);
|
|
|
|
SetHits(700, 900);
|
|
|
|
SetDamage(13, 24);
|
|
|
|
SetDamageType(ResistanceType.Physical, 100);
|
|
|
|
SetResistance(ResistanceType.Physical, 45, 55);
|
|
SetResistance(ResistanceType.Fire, 50, 60);
|
|
SetResistance(ResistanceType.Cold, 45, 55);
|
|
SetResistance(ResistanceType.Poison, 99);
|
|
SetResistance(ResistanceType.Energy, 35, 45);
|
|
|
|
SetSkill(SkillName.MagicResist, 150, 200);
|
|
SetSkill(SkillName.Tactics, 80, 120);
|
|
SetSkill(SkillName.Wrestling, 80, 110);
|
|
SetSkill(SkillName.Parry, 70, 80);
|
|
SetSkill(SkillName.DetectHidden, 70.0, 80.0);
|
|
|
|
Fame = 4500;
|
|
Karma = -4500;
|
|
|
|
PackItem(new ExecutionersCap());
|
|
}
|
|
|
|
public override void SpawnPackItems()
|
|
{
|
|
}
|
|
|
|
public override void OnDeath(Container c)
|
|
{
|
|
base.OnDeath(c);
|
|
|
|
if (0.2 > Utility.RandomDouble() && Region.Find(c.Location, c.Map).IsPartOf("Shame"))
|
|
c.DropItem(new ShameCrystal());
|
|
}
|
|
|
|
public override void GenerateLoot()
|
|
{
|
|
this.AddLoot(LootPack.Rich, 2);
|
|
}
|
|
|
|
public ClayGolem(Serial serial)
|
|
: base(serial)
|
|
{
|
|
}
|
|
|
|
public override void Serialize(GenericWriter writer)
|
|
{
|
|
base.Serialize(writer);
|
|
writer.Write(0);
|
|
}
|
|
|
|
public override void Deserialize(GenericReader reader)
|
|
{
|
|
base.Deserialize(reader);
|
|
int version = reader.ReadInt();
|
|
}
|
|
}
|
|
|
|
[CorpseName("a greater earth elemental corpse")]
|
|
public class GreaterEarthElemental : EarthElemental
|
|
{
|
|
[Constructable]
|
|
public GreaterEarthElemental()
|
|
{
|
|
Name = "a greater earth elemental";
|
|
Hue = 1143;
|
|
|
|
SetHits(500, 600);
|
|
|
|
SetDamageType(ResistanceType.Physical, 100);
|
|
|
|
SetResistance(ResistanceType.Physical, 50, 65);
|
|
SetResistance(ResistanceType.Fire, 35, 45);
|
|
SetResistance(ResistanceType.Cold, 35, 45);
|
|
SetResistance(ResistanceType.Poison, 45, 55);
|
|
SetResistance(ResistanceType.Energy, 25, 35);
|
|
|
|
SetSkill(SkillName.MagicResist, 40, 70);
|
|
SetSkill(SkillName.Tactics, 70, 90);
|
|
SetSkill(SkillName.Wrestling, 80, 95);
|
|
|
|
Fame = 2500;
|
|
Karma = -2500;
|
|
|
|
SetSpecialAbility(SpecialAbility.ColossalRage);
|
|
}
|
|
|
|
public override void OnDeath(Container c)
|
|
{
|
|
base.OnDeath(c);
|
|
|
|
if (0.08 > Utility.RandomDouble() && Region.Find(c.Location, c.Map).IsPartOf("Shame"))
|
|
c.DropItem(new ShameCrystal());
|
|
}
|
|
|
|
public override void GenerateLoot()
|
|
{
|
|
this.AddLoot(LootPack.Rich, 1);
|
|
}
|
|
|
|
public GreaterEarthElemental(Serial serial)
|
|
: base(serial)
|
|
{
|
|
}
|
|
|
|
public override void Serialize(GenericWriter writer)
|
|
{
|
|
base.Serialize(writer);
|
|
writer.Write(0);
|
|
}
|
|
|
|
public override void Deserialize(GenericReader reader)
|
|
{
|
|
base.Deserialize(reader);
|
|
int version = reader.ReadInt();
|
|
}
|
|
}
|
|
|
|
[CorpseName("a mud elemental corpse")]
|
|
public class MudElemental : EarthElemental
|
|
{
|
|
[Constructable]
|
|
public MudElemental()
|
|
{
|
|
Name = "a mud elemental";
|
|
Hue = 542;
|
|
|
|
SetStr(400, 550);
|
|
SetHits(650, 850);
|
|
SetDamage(17, 19);
|
|
|
|
SetDamageType(ResistanceType.Physical, 50);
|
|
SetDamageType(ResistanceType.Fire, 50);
|
|
|
|
SetResistance(ResistanceType.Physical, 50, 65);
|
|
SetResistance(ResistanceType.Fire, 55, 65);
|
|
SetResistance(ResistanceType.Cold, 45, 50);
|
|
SetResistance(ResistanceType.Poison, 55, 65);
|
|
SetResistance(ResistanceType.Energy, 50, 60);
|
|
|
|
SetSkill(SkillName.MagicResist, 100);
|
|
SetSkill(SkillName.Tactics, 100);
|
|
SetSkill(SkillName.Wrestling, 120);
|
|
SetSkill(SkillName.Parry, 120);
|
|
|
|
Fame = 3500;
|
|
Karma = -3500;
|
|
|
|
PackItem(new FertileDirt());
|
|
PackItem(new ExecutionersCap());
|
|
|
|
SetSpecialAbility(SpecialAbility.ColossalRage);
|
|
}
|
|
|
|
public override void OnDeath(Container c)
|
|
{
|
|
base.OnDeath(c);
|
|
|
|
if (0.08 > Utility.RandomDouble() && Region.Find(c.Location, c.Map).IsPartOf("Shame"))
|
|
c.DropItem(new ShameCrystal());
|
|
}
|
|
|
|
public override void GenerateLoot()
|
|
{
|
|
this.AddLoot(LootPack.Rich, 2);
|
|
}
|
|
|
|
public MudElemental(Serial serial)
|
|
: base(serial)
|
|
{
|
|
}
|
|
|
|
public override void Serialize(GenericWriter writer)
|
|
{
|
|
base.Serialize(writer);
|
|
writer.Write(0);
|
|
}
|
|
|
|
public override void Deserialize(GenericReader reader)
|
|
{
|
|
base.Deserialize(reader);
|
|
int version = reader.ReadInt();
|
|
}
|
|
}
|
|
|
|
public class GreaterAirElemental : AirElemental
|
|
{
|
|
[Constructable]
|
|
public GreaterAirElemental()
|
|
{
|
|
SetStr(250, 315);
|
|
SetHits(800, 900);
|
|
SetDamage(15, 17);
|
|
|
|
SetDamageType(ResistanceType.Physical, 20);
|
|
SetDamageType(ResistanceType.Cold, 40);
|
|
SetDamageType(ResistanceType.Energy, 40);
|
|
|
|
SetResistance(ResistanceType.Physical, 75, 85);
|
|
SetResistance(ResistanceType.Fire, 55, 65);
|
|
SetResistance(ResistanceType.Cold, 55, 65);
|
|
SetResistance(ResistanceType.Poison, 55, 65);
|
|
SetResistance(ResistanceType.Energy, 45, 55);
|
|
|
|
SetSkill(SkillName.MagicResist, 100, 120);
|
|
SetSkill(SkillName.Tactics, 100, 120);
|
|
SetSkill(SkillName.Wrestling, 100, 120);
|
|
SetSkill(SkillName.Magery, 100, 120);
|
|
SetSkill(SkillName.EvalInt, 100, 120);
|
|
|
|
Fame = 4500;
|
|
Karma = -4500;
|
|
}
|
|
|
|
public override void OnDeath(Container c)
|
|
{
|
|
base.OnDeath(c);
|
|
|
|
if (0.10 > Utility.RandomDouble() && Region.Find(c.Location, c.Map).IsPartOf("Shame"))
|
|
c.DropItem(new ShameCrystal());
|
|
}
|
|
|
|
public override void GenerateLoot()
|
|
{
|
|
this.AddLoot(LootPack.Rich, 2);
|
|
}
|
|
|
|
public GreaterAirElemental(Serial serial)
|
|
: base(serial)
|
|
{
|
|
}
|
|
|
|
public override void Serialize(GenericWriter writer)
|
|
{
|
|
base.Serialize(writer);
|
|
writer.Write(0);
|
|
}
|
|
|
|
public override void Deserialize(GenericReader reader)
|
|
{
|
|
base.Deserialize(reader);
|
|
int version = reader.ReadInt();
|
|
}
|
|
}
|
|
|
|
[CorpseName("a molten earth elemental corpse")]
|
|
public class MoltenEarthElemental : GreaterEarthElemental
|
|
{
|
|
[Constructable]
|
|
public MoltenEarthElemental()
|
|
{
|
|
Hue = 442;
|
|
Name = "a molten earth elemental";
|
|
|
|
SetStr(400, 550);
|
|
SetHits(1200, 1400);
|
|
SetDamage(17, 19);
|
|
|
|
SetDamageType(ResistanceType.Physical, 50);
|
|
SetDamageType(ResistanceType.Fire, 50);
|
|
|
|
SetResistance(ResistanceType.Physical, 50, 70);
|
|
SetResistance(ResistanceType.Fire, 50, 60);
|
|
SetResistance(ResistanceType.Cold, 40, 50);
|
|
SetResistance(ResistanceType.Poison, 55, 65);
|
|
SetResistance(ResistanceType.Energy, 50, 60);
|
|
|
|
SetSkill(SkillName.MagicResist, 100);
|
|
SetSkill(SkillName.Tactics, 100);
|
|
SetSkill(SkillName.Wrestling, 120);
|
|
SetSkill(SkillName.Parry, 120);
|
|
|
|
Fame = 5000;
|
|
Karma = -5000;
|
|
|
|
SetSpecialAbility(SpecialAbility.SearingWounds);
|
|
SetSpecialAbility(SpecialAbility.DragonBreath);
|
|
}
|
|
|
|
public override void OnDeath(Container c)
|
|
{
|
|
base.OnDeath(c);
|
|
|
|
if (0.10 > Utility.RandomDouble() && Region.Find(c.Location, c.Map).IsPartOf("Shame"))
|
|
c.DropItem(new ShameCrystal());
|
|
}
|
|
|
|
public override void GenerateLoot()
|
|
{
|
|
this.AddLoot(LootPack.Rich, 2);
|
|
}
|
|
|
|
public MoltenEarthElemental(Serial serial)
|
|
: base(serial)
|
|
{
|
|
}
|
|
|
|
public override void Serialize(GenericWriter writer)
|
|
{
|
|
base.Serialize(writer);
|
|
writer.Write(0);
|
|
}
|
|
|
|
public override void Deserialize(GenericReader reader)
|
|
{
|
|
base.Deserialize(reader);
|
|
int version = reader.ReadInt();
|
|
}
|
|
}
|
|
|
|
[CorpseName("a flame elemental corpse")]
|
|
public class LesserFlameElemental : BaseCreature, IAuraCreature
|
|
{
|
|
[Constructable]
|
|
public LesserFlameElemental()
|
|
: base(AIType.AI_Mage, FightMode.Closest, 10, 1, 0.4, 0.2)
|
|
{
|
|
Name = "a flame elemental";
|
|
Body = 15;
|
|
BaseSoundID = 838;
|
|
Hue = 1161;
|
|
|
|
SetStr(420, 460);
|
|
SetDex(160, 210);
|
|
SetInt(120, 190);
|
|
|
|
SetHits(700, 800);
|
|
SetMana(1000, 1200);
|
|
|
|
SetDamage(13, 15);
|
|
|
|
SetDamageType(ResistanceType.Physical, 25);
|
|
SetDamageType(ResistanceType.Fire, 75);
|
|
|
|
SetResistance(ResistanceType.Physical, 40, 60);
|
|
SetResistance(ResistanceType.Fire, 100);
|
|
SetResistance(ResistanceType.Cold, 30, 40);
|
|
SetResistance(ResistanceType.Poison, 60, 70);
|
|
SetResistance(ResistanceType.Energy, 60, 70);
|
|
|
|
SetSkill(SkillName.MagicResist, 90, 140);
|
|
SetSkill(SkillName.Tactics, 90, 130.0);
|
|
SetSkill(SkillName.Wrestling, 90, 120);
|
|
SetSkill(SkillName.Magery, 100, 145);
|
|
SetSkill(SkillName.EvalInt, 90, 140);
|
|
SetSkill(SkillName.Meditation, 80, 120);
|
|
SetSkill(SkillName.Parry, 100, 120);
|
|
|
|
Fame = 3500;
|
|
Karma = -3500;
|
|
|
|
PackItem(new SulfurousAsh(5));
|
|
SetSpecialAbility(SpecialAbility.DragonBreath);
|
|
SetAreaEffect(AreaEffect.AuraDamage);
|
|
}
|
|
|
|
public void AuraEffect(Mobile m)
|
|
{
|
|
m.SendLocalizedMessage(1008112); // The intense heat is damaging you!
|
|
}
|
|
|
|
public override void OnDeath(Container c)
|
|
{
|
|
base.OnDeath(c);
|
|
|
|
if (0.10 > Utility.RandomDouble() && Region.Find(c.Location, c.Map).IsPartOf("Shame"))
|
|
c.DropItem(new ShameCrystal());
|
|
}
|
|
|
|
public override int TreasureMapLevel
|
|
{
|
|
get
|
|
{
|
|
return 2;
|
|
}
|
|
}
|
|
|
|
public override void GenerateLoot()
|
|
{
|
|
this.AddLoot(LootPack.Rich, 2);
|
|
}
|
|
|
|
public LesserFlameElemental(Serial serial)
|
|
: base(serial)
|
|
{
|
|
}
|
|
|
|
public override void Serialize(GenericWriter writer)
|
|
{
|
|
base.Serialize(writer);
|
|
writer.Write(0);
|
|
}
|
|
|
|
public override void Deserialize(GenericReader reader)
|
|
{
|
|
base.Deserialize(reader);
|
|
int version = reader.ReadInt();
|
|
}
|
|
}
|
|
|
|
[CorpseName("a wind elemental corpse")]
|
|
public class LesserWindElemental : BaseCreature
|
|
{
|
|
[Constructable]
|
|
public LesserWindElemental()
|
|
: base(AIType.AI_Mage, FightMode.Closest, 10, 1, 0.4, 0.2)
|
|
{
|
|
Name = "a wind elemental";
|
|
Body = 13;
|
|
BaseSoundID = 655;
|
|
Hue = 33765;
|
|
|
|
SetStr(370, 460);
|
|
SetDex(160, 250);
|
|
SetInt(150, 220);
|
|
|
|
SetHits(2500, 2600);
|
|
SetMana(1000, 1300);
|
|
|
|
SetDamage(15, 17);
|
|
|
|
SetDamageType(ResistanceType.Physical, 20);
|
|
SetDamageType(ResistanceType.Cold, 40);
|
|
SetDamageType(ResistanceType.Energy, 40);
|
|
|
|
SetResistance(ResistanceType.Physical, 65, 75);
|
|
SetResistance(ResistanceType.Fire, 55, 65);
|
|
SetResistance(ResistanceType.Cold, 55, 65);
|
|
SetResistance(ResistanceType.Poison, 100);
|
|
SetResistance(ResistanceType.Energy, 60, 75);
|
|
|
|
SetSkill(SkillName.MagicResist, 60, 80);
|
|
SetSkill(SkillName.Tactics, 60, 80.0);
|
|
SetSkill(SkillName.Wrestling, 60, 80);
|
|
SetSkill(SkillName.Magery, 60, 80);
|
|
SetSkill(SkillName.EvalInt, 60, 80);
|
|
|
|
Fame = 3500;
|
|
Karma = -3500;
|
|
}
|
|
|
|
public override void OnDeath(Container c)
|
|
{
|
|
base.OnDeath(c);
|
|
|
|
if (0.10 > Utility.RandomDouble() && Region.Find(c.Location, c.Map).IsPartOf("Shame"))
|
|
c.DropItem(new ShameCrystal());
|
|
}
|
|
|
|
public override void GenerateLoot()
|
|
{
|
|
this.AddLoot(LootPack.Rich, 2);
|
|
}
|
|
|
|
public LesserWindElemental(Serial serial)
|
|
: base(serial)
|
|
{
|
|
}
|
|
|
|
public override void Serialize(GenericWriter writer)
|
|
{
|
|
base.Serialize(writer);
|
|
writer.Write(0);
|
|
}
|
|
|
|
public override void Deserialize(GenericReader reader)
|
|
{
|
|
base.Deserialize(reader);
|
|
int version = reader.ReadInt();
|
|
}
|
|
}
|
|
|
|
[CorpseName("an eternal gazer corpse")]
|
|
public class EternalGazer : ElderGazer
|
|
{
|
|
[Constructable]
|
|
public EternalGazer()
|
|
{
|
|
Name = "an eternal gazer";
|
|
SetStr(450, 600);
|
|
SetDex(125, 165);
|
|
SetInt(350, 550);
|
|
|
|
SetHits(7250, 7600);
|
|
SetMana(2500, 2900);
|
|
SetDamage(18, 21);
|
|
|
|
SetDamageType(ResistanceType.Physical, 50);
|
|
SetDamageType(ResistanceType.Energy, 50);
|
|
|
|
SetResistance(ResistanceType.Physical, 65, 75);
|
|
SetResistance(ResistanceType.Fire, 60, 70);
|
|
SetResistance(ResistanceType.Cold, 70, 75);
|
|
SetResistance(ResistanceType.Poison, 65, 75);
|
|
SetResistance(ResistanceType.Energy, 65, 75);
|
|
|
|
SetSkill(SkillName.MagicResist, 125, 140);
|
|
SetSkill(SkillName.Tactics, 115, 130);
|
|
SetSkill(SkillName.Wrestling, 110, 130);
|
|
SetSkill(SkillName.Anatomy, 75, 90);
|
|
SetSkill(SkillName.Magery, 120, 130);
|
|
SetSkill(SkillName.EvalInt, 120, 130);
|
|
}
|
|
|
|
public override MeatType MeatType { get { return MeatType.Ribs; } }
|
|
public override int Meat { get { return 1; } }
|
|
|
|
public override void AlterSpellDamageFrom(Mobile from, ref int damage)
|
|
{
|
|
if (from is BaseCreature && (((BaseCreature)from).Summoned || ((BaseCreature)from).Controlled))
|
|
damage /= 2;
|
|
|
|
base.AlterSpellDamageFrom(from, ref damage);
|
|
}
|
|
|
|
public override void AlterMeleeDamageFrom(Mobile from, ref int damage)
|
|
{
|
|
if (from is BaseCreature && (((BaseCreature)from).Summoned || ((BaseCreature)from).Controlled))
|
|
damage /= 2;
|
|
|
|
base.AlterMeleeDamageFrom(from, ref damage);
|
|
}
|
|
|
|
public override void OnDeath(Container c)
|
|
{
|
|
base.OnDeath(c);
|
|
|
|
if(0.15 > Utility.RandomDouble() && Region.Find(c.Location, c.Map).IsPartOf("Shame"))
|
|
c.DropItem(new ShameCrystal());
|
|
}
|
|
|
|
public override void GenerateLoot()
|
|
{
|
|
this.AddLoot(LootPack.Rich, 3);
|
|
}
|
|
|
|
public EternalGazer(Serial serial)
|
|
: base(serial)
|
|
{
|
|
}
|
|
|
|
public override void Serialize(GenericWriter writer)
|
|
{
|
|
base.Serialize(writer);
|
|
writer.Write(0);
|
|
}
|
|
|
|
public override void Deserialize(GenericReader reader)
|
|
{
|
|
base.Deserialize(reader);
|
|
int version = reader.ReadInt();
|
|
}
|
|
}
|
|
|
|
[CorpseName("a burning mage corpse")]
|
|
public class BurningMage : BaseCreature
|
|
{
|
|
public static Dictionary<Mobile, Timer> Table { get; private set; }
|
|
|
|
[Constructable]
|
|
public BurningMage() : base(AIType.AI_Mage, FightMode.Weakest, 10, 1, 0.4, 0.2)
|
|
{
|
|
Name = NameList.RandomName("male");
|
|
Title = "the burning";
|
|
SetStr(100, 125);
|
|
|
|
BodyValue = 0x190;
|
|
Hue = 1281;
|
|
|
|
SetHits(3000);
|
|
SetMana(600, 800);
|
|
SetDamage(10, 15);
|
|
|
|
SetDamageType(ResistanceType.Physical, 50);
|
|
SetDamageType(ResistanceType.Fire, 50);
|
|
|
|
SetResistance(ResistanceType.Physical, 50, 60);
|
|
SetResistance(ResistanceType.Fire, 50, 60);
|
|
SetResistance(ResistanceType.Cold, 50, 60);
|
|
SetResistance(ResistanceType.Poison, 50, 60);
|
|
SetResistance(ResistanceType.Energy, 50, 60);
|
|
|
|
SetSkill(SkillName.MagicResist, 125, 140);
|
|
SetSkill(SkillName.Tactics, 100, 120);
|
|
SetSkill(SkillName.Wrestling, 110, 130);
|
|
SetSkill(SkillName.Magery, 120, 130);
|
|
SetSkill(SkillName.EvalInt, 120, 130);
|
|
|
|
AddItem(new Robe(1156));
|
|
AddItem(new Sandals());
|
|
|
|
PackReg(31);
|
|
|
|
Utility.AssignRandomHair(this);
|
|
|
|
Fame = 22000;
|
|
Karma = -22000;
|
|
|
|
SetSpecialAbility(SpecialAbility.DragonBreath);
|
|
}
|
|
|
|
public override bool CanRummageCorpses { get { return true; } }
|
|
public override bool AlwaysMurderer { get { return true; } }
|
|
|
|
public override void OnDeath(Container c)
|
|
{
|
|
base.OnDeath(c);
|
|
|
|
if (0.33 > Utility.RandomDouble() && Region.Find(c.Location, c.Map).IsPartOf("Shame"))
|
|
c.DropItem(new ShameCrystal(4));
|
|
}
|
|
|
|
public override void OnDamagedBySpell(Mobile from)
|
|
{
|
|
base.OnDamagedBySpell(from);
|
|
|
|
if (!IsUnderEffects(from) && 0.50 > Utility.RandomDouble())
|
|
{
|
|
DoEffects(from);
|
|
}
|
|
}
|
|
|
|
public static bool IsUnderEffects(Mobile from)
|
|
{
|
|
return from != null && Table != null && Table.ContainsKey(from);
|
|
}
|
|
|
|
public void DoEffects(Mobile from)
|
|
{
|
|
if (Table == null)
|
|
Table = new Dictionary<Mobile, Timer>();
|
|
|
|
if (!Table.ContainsKey(from))
|
|
{
|
|
Table[from] = Timer.DelayCall(TimeSpan.FromSeconds(1.5), TimeSpan.FromSeconds(1.5), new TimerStateCallback(SapMana), new object[] { from, this });
|
|
Table[from].Start();
|
|
|
|
from.SendLocalizedMessage(1151482); // Your mana has been tainted!
|
|
from.SendLocalizedMessage(1151485); // Your mana is being diverted.
|
|
}
|
|
}
|
|
|
|
private static void SapMana(object o)
|
|
{
|
|
object[] objs = o as object[];
|
|
Mobile from = objs[0] as Mobile;
|
|
Mobile mob = objs[1] as Mobile;
|
|
|
|
if (IsUnderEffects(from))
|
|
{
|
|
if (mob.Alive && from.Alive)
|
|
{
|
|
from.SendLocalizedMessage(1151484); // You feel extra mana being drawn from you.
|
|
from.SendLocalizedMessage(1151481); // Channeling the corrupted mana has damaged you!
|
|
|
|
int toSap = Math.Min(from.Mana, Utility.RandomMinMax(30, 40));
|
|
from.Mana -= toSap;
|
|
|
|
AOS.Damage(from, mob, Math.Max(1, toSap / 10), false, 0, 0, 0, 0, 0, 0, 100, false, false, false);
|
|
|
|
if (0.5 > Utility.RandomDouble())
|
|
EndEffects(from);
|
|
}
|
|
else
|
|
EndEffects(from);
|
|
}
|
|
}
|
|
|
|
public static void EndEffects(Mobile from)
|
|
{
|
|
if (IsUnderEffects(from))
|
|
{
|
|
Table[from].Stop();
|
|
Table.Remove(from);
|
|
|
|
from.SendLocalizedMessage(1151486); // Your mana is no longer being diverted.
|
|
from.SendLocalizedMessage(1151483); // Your mana is no longer corrupted.
|
|
}
|
|
}
|
|
|
|
public override void GenerateLoot()
|
|
{
|
|
AddLoot(LootPack.UltraRich, 2);
|
|
AddLoot(LootPack.HighScrolls, Utility.RandomMinMax(5, 20));
|
|
}
|
|
|
|
public BurningMage(Serial serial)
|
|
: base(serial)
|
|
{
|
|
}
|
|
|
|
public override void Serialize(GenericWriter writer)
|
|
{
|
|
base.Serialize(writer);
|
|
writer.Write(0);
|
|
}
|
|
|
|
public override void Deserialize(GenericReader reader)
|
|
{
|
|
base.Deserialize(reader);
|
|
int version = reader.ReadInt();
|
|
}
|
|
}
|
|
|
|
[CorpseName("a crazed corpse")]
|
|
public class CrazedMage : BaseCreature
|
|
{
|
|
public static Dictionary<Mobile, Timer> Table { get; private set; }
|
|
|
|
[Constructable]
|
|
public CrazedMage() : base(AIType.AI_Mystic, FightMode.Weakest, 10, 1, 0.4, 0.2)
|
|
{
|
|
Name = NameList.RandomName("male");
|
|
Title = "the crazed";
|
|
|
|
BodyValue = 0x190;
|
|
SetStr(225, 400);
|
|
|
|
SetHits(3500);
|
|
SetMana(600, 800);
|
|
SetDamage(15, 21);
|
|
|
|
SetDamageType(ResistanceType.Physical, 100);
|
|
|
|
SetResistance(ResistanceType.Physical, 60, 80);
|
|
SetResistance(ResistanceType.Fire, 50, 60);
|
|
SetResistance(ResistanceType.Cold, 50, 60);
|
|
SetResistance(ResistanceType.Poison, 50, 60);
|
|
SetResistance(ResistanceType.Energy, 50, 60);
|
|
|
|
SetSkill(SkillName.MagicResist, 125, 140);
|
|
SetSkill(SkillName.Tactics, 100, 120);
|
|
SetSkill(SkillName.Wrestling, 140);
|
|
SetSkill(SkillName.Anatomy, 100, 120);
|
|
SetSkill(SkillName.Magery, 100, 110);
|
|
SetSkill(SkillName.EvalInt, 100, 110);
|
|
|
|
AddItem(new Robe(1157));
|
|
AddItem(new Sandals());
|
|
|
|
Utility.AssignRandomHair(this);
|
|
Hue = this.Race.RandomSkinHue();
|
|
|
|
Fame = 15000;
|
|
Karma = -15000;
|
|
}
|
|
|
|
public override bool CanRummageCorpses { get { return true; } }
|
|
public override bool AlwaysMurderer { get { return true; } }
|
|
|
|
public override void OnDamagedBySpell(Mobile from)
|
|
{
|
|
base.OnDamagedBySpell(from);
|
|
|
|
if (!IsUnderEffects(from) && 0.50 > Utility.RandomDouble())
|
|
{
|
|
DoEffects(from);
|
|
}
|
|
}
|
|
|
|
public static bool IsUnderEffects(Mobile from)
|
|
{
|
|
return from != null && Table != null && Table.ContainsKey(from);
|
|
}
|
|
|
|
public void DoEffects(Mobile from)
|
|
{
|
|
if (Table == null)
|
|
Table = new Dictionary<Mobile, Timer>();
|
|
|
|
if (!Table.ContainsKey(from))
|
|
{
|
|
Table[from] = Timer.DelayCall(TimeSpan.FromSeconds(1.5), TimeSpan.FromSeconds(1.5), new TimerStateCallback(SapMana), new object[] { from, this });
|
|
Table[from].Start();
|
|
|
|
from.SendLocalizedMessage(1151482); // Your mana has been tainted!
|
|
from.SendLocalizedMessage(1151485); // Your mana is being diverted.
|
|
}
|
|
}
|
|
|
|
private static void SapMana(object o)
|
|
{
|
|
object[] objs = o as object[];
|
|
Mobile from = objs[0] as Mobile;
|
|
Mobile mob = objs[1] as Mobile;
|
|
|
|
if (IsUnderEffects(from))
|
|
{
|
|
if (mob.Alive && from.Alive)
|
|
{
|
|
from.SendLocalizedMessage(1151484); // You feel extra mana being drawn from you.
|
|
from.SendLocalizedMessage(1151481); // Channeling the corrupted mana has damaged you!
|
|
|
|
int toSap = Math.Min(from.Mana, Utility.RandomMinMax(30, 40));
|
|
from.Mana -= toSap;
|
|
|
|
AOS.Damage(from, mob, Math.Max(1, toSap / 10), false, 0, 0, 0, 0, 0, 0, 100, false, false, false);
|
|
|
|
if (0.5 > Utility.RandomDouble())
|
|
EndEffects(from);
|
|
}
|
|
else
|
|
EndEffects(from);
|
|
}
|
|
}
|
|
|
|
public static void EndEffects(Mobile from)
|
|
{
|
|
if (IsUnderEffects(from))
|
|
{
|
|
Table[from].Stop();
|
|
Table.Remove(from);
|
|
|
|
from.SendLocalizedMessage(1151486); // Your mana is no longer being diverted.
|
|
from.SendLocalizedMessage(1151483); // Your mana is no longer corrupted.
|
|
}
|
|
}
|
|
|
|
public override void OnDeath(Container c)
|
|
{
|
|
base.OnDeath(c);
|
|
|
|
if (0.33 > Utility.RandomDouble() && Region.Find(c.Location, c.Map).IsPartOf("Shame"))
|
|
c.DropItem(new ShameCrystal(5));
|
|
}
|
|
|
|
public override void GenerateLoot()
|
|
{
|
|
this.AddLoot(LootPack.FilthyRich, 2);
|
|
}
|
|
|
|
public CrazedMage(Serial serial)
|
|
: base(serial)
|
|
{
|
|
}
|
|
|
|
public override void Serialize(GenericWriter writer)
|
|
{
|
|
base.Serialize(writer);
|
|
writer.Write(0);
|
|
}
|
|
|
|
public override void Deserialize(GenericReader reader)
|
|
{
|
|
base.Deserialize(reader);
|
|
int version = reader.ReadInt();
|
|
}
|
|
}
|
|
|
|
[CorpseName("a corrupted mage corpse")]
|
|
public class CorruptedMage : EvilMage
|
|
{
|
|
public static Dictionary<Mobile, Timer> Table { get; private set; }
|
|
|
|
[Constructable]
|
|
public CorruptedMage()
|
|
{
|
|
Title = "the corrupted mage";
|
|
|
|
SetStr(150, 170);
|
|
SetInt(100, 120);
|
|
SetDex(110, 120);
|
|
|
|
SetHits(1200, 1250);
|
|
SetMana(800, 900);
|
|
SetDamage(14, 17);
|
|
|
|
SetDamageType(ResistanceType.Physical, 100);
|
|
|
|
SetResistance(ResistanceType.Physical, 55, 70);
|
|
SetResistance(ResistanceType.Fire, 70, 80);
|
|
SetResistance(ResistanceType.Cold, 60, 70);
|
|
SetResistance(ResistanceType.Poison, 60, 70);
|
|
SetResistance(ResistanceType.Energy, 65, 75);
|
|
|
|
SetSkill(SkillName.MagicResist, 115, 120);
|
|
SetSkill(SkillName.Tactics, 110, 120);
|
|
SetSkill(SkillName.Wrestling, 100, 110);
|
|
SetSkill(SkillName.Magery, 120, 130);
|
|
SetSkill(SkillName.EvalInt, 120, 130);
|
|
SetSkill(SkillName.Meditation, 100, 110);
|
|
}
|
|
|
|
public override bool CanRummageCorpses { get { return true; } }
|
|
public override bool AlwaysMurderer { get { return true; } }
|
|
|
|
public override void OnDamagedBySpell(Mobile from)
|
|
{
|
|
base.OnDamagedBySpell(from);
|
|
|
|
if (!IsUnderEffects(from) && 0.10 > Utility.RandomDouble())
|
|
{
|
|
DoEffects(from);
|
|
}
|
|
}
|
|
|
|
public static bool IsUnderEffects(Mobile from)
|
|
{
|
|
return from != null && Table != null && Table.ContainsKey(from);
|
|
}
|
|
|
|
public void DoEffects(Mobile from)
|
|
{
|
|
if (Table == null)
|
|
Table = new Dictionary<Mobile, Timer>();
|
|
|
|
if (!Table.ContainsKey(from))
|
|
{
|
|
Table[from] = Timer.DelayCall(TimeSpan.FromSeconds(1.5), TimeSpan.FromSeconds(1.5), new TimerStateCallback(SapMana), new object[] { from, this });
|
|
Table[from].Start();
|
|
|
|
from.SendLocalizedMessage(1151482); // Your mana has been tainted!
|
|
from.SendLocalizedMessage(1151485); // Your mana is being diverted.
|
|
}
|
|
}
|
|
|
|
private static void SapMana(object o)
|
|
{
|
|
object[] objs = o as object[];
|
|
Mobile from = objs[0] as Mobile;
|
|
Mobile mob = objs[1] as Mobile;
|
|
|
|
if (IsUnderEffects(from))
|
|
{
|
|
if (mob.Alive && from.Alive)
|
|
{
|
|
from.SendLocalizedMessage(1151484); // You feel extra mana being drawn from you.
|
|
from.SendLocalizedMessage(1151481); // Channeling the corrupted mana has damaged you!
|
|
|
|
int toSap = Math.Min(from.Mana, Utility.RandomMinMax(30, 40));
|
|
from.Mana -= toSap;
|
|
|
|
AOS.Damage(from, mob, Math.Max(1, toSap / 10), false, 0, 0, 0, 0, 0, 0, 100, false, false, false);
|
|
|
|
if (0.5 > Utility.RandomDouble())
|
|
EndEffects(from);
|
|
}
|
|
else
|
|
EndEffects(from);
|
|
}
|
|
}
|
|
|
|
public static void EndEffects(Mobile from)
|
|
{
|
|
if (IsUnderEffects(from))
|
|
{
|
|
Table[from].Stop();
|
|
Table.Remove(from);
|
|
|
|
from.SendLocalizedMessage(1151486); // Your mana is no longer being diverted.
|
|
from.SendLocalizedMessage(1151483); // Your mana is no longer corrupted.
|
|
}
|
|
}
|
|
|
|
public override void OnDeath(Container c)
|
|
{
|
|
base.OnDeath(c);
|
|
|
|
if (0.33 > Utility.RandomDouble() && Region.Find(c.Location, c.Map).IsPartOf("Shame"))
|
|
c.DropItem(new ShameCrystal(3));
|
|
}
|
|
|
|
public override int TreasureMapLevel
|
|
{
|
|
get
|
|
{
|
|
return 2;
|
|
}
|
|
}
|
|
|
|
public override void GenerateLoot()
|
|
{
|
|
this.AddLoot(LootPack.Rich, 2);
|
|
}
|
|
|
|
public CorruptedMage(Serial serial)
|
|
: base(serial)
|
|
{
|
|
}
|
|
|
|
public override void Serialize(GenericWriter writer)
|
|
{
|
|
base.Serialize(writer);
|
|
writer.Write(0);
|
|
}
|
|
|
|
public override void Deserialize(GenericReader reader)
|
|
{
|
|
base.Deserialize(reader);
|
|
int version = reader.ReadInt();
|
|
}
|
|
}
|
|
|
|
[CorpseName("a vile mage corpse")]
|
|
public class VileMage : CorruptedMage
|
|
{
|
|
[Constructable]
|
|
public VileMage()
|
|
{
|
|
Title = "the vile mage";
|
|
|
|
SetStr(150, 170);
|
|
SetInt(150, 170);
|
|
SetDex(100, 110);
|
|
|
|
SetHits(500, 900);
|
|
SetMana(550, 600);
|
|
SetDamage(11, 13);
|
|
|
|
SetDamageType(ResistanceType.Physical, 100);
|
|
|
|
SetResistance(ResistanceType.Physical, 55, 70);
|
|
SetResistance(ResistanceType.Fire, 55, 65);
|
|
SetResistance(ResistanceType.Cold, 60, 70);
|
|
SetResistance(ResistanceType.Poison, 55, 65);
|
|
SetResistance(ResistanceType.Energy, 65, 75);
|
|
|
|
SetSkill(SkillName.MagicResist, 110, 115);
|
|
SetSkill(SkillName.Tactics, 110, 115);
|
|
SetSkill(SkillName.Wrestling, 100, 110);
|
|
SetSkill(SkillName.Magery, 110, 115);
|
|
SetSkill(SkillName.EvalInt, 115, 125);
|
|
}
|
|
|
|
public override void OnDeath(Container c)
|
|
{
|
|
base.OnDeath(c);
|
|
|
|
if (0.33 > Utility.RandomDouble() && Region.Find(c.Location, c.Map).IsPartOf("Shame"))
|
|
c.DropItem(new ShameCrystal(3));
|
|
}
|
|
|
|
public override void GenerateLoot()
|
|
{
|
|
this.AddLoot(LootPack.Rich, 2);
|
|
}
|
|
|
|
public VileMage(Serial serial)
|
|
: base(serial)
|
|
{
|
|
}
|
|
|
|
public override void Serialize(GenericWriter writer)
|
|
{
|
|
base.Serialize(writer);
|
|
writer.Write(0);
|
|
}
|
|
|
|
public override void Deserialize(GenericReader reader)
|
|
{
|
|
base.Deserialize(reader);
|
|
int version = reader.ReadInt();
|
|
}
|
|
}
|
|
|
|
[CorpseName("a chaos vortex corpse")]
|
|
public class ChaosVortex : BaseCreature
|
|
{
|
|
[Constructable]
|
|
public ChaosVortex()
|
|
: base(AIType.AI_Melee, FightMode.Weakest, 10, 1, 0.4, 0.2)
|
|
{
|
|
Name = "a chaos vortex";
|
|
Body = 164;
|
|
Hue = 34212;
|
|
|
|
SetStr(450);
|
|
SetDex(200);
|
|
SetInt(100);
|
|
|
|
SetHits(27000);
|
|
SetMana(0);
|
|
|
|
SetDamage(21, 23);
|
|
|
|
SetDamageType(ResistanceType.Physical, 20);
|
|
SetDamageType(ResistanceType.Fire, 20);
|
|
SetDamageType(ResistanceType.Cold, 20);
|
|
SetDamageType(ResistanceType.Poison, 20);
|
|
SetDamageType(ResistanceType.Energy, 20);
|
|
|
|
SetResistance(ResistanceType.Physical, 65, 75);
|
|
SetResistance(ResistanceType.Fire, 65, 75);
|
|
SetResistance(ResistanceType.Cold, 65, 75);
|
|
SetResistance(ResistanceType.Poison, 65, 75);
|
|
SetResistance(ResistanceType.Energy, 65, 75);
|
|
|
|
SetSkill(SkillName.MagicResist, 100, 110);
|
|
SetSkill(SkillName.Tactics, 110, 130);
|
|
SetSkill(SkillName.Wrestling, 124, 140);
|
|
|
|
Fame = 22500;
|
|
Karma = -22500;
|
|
}
|
|
|
|
public override int GetAngerSound()
|
|
{
|
|
return 0x15;
|
|
}
|
|
|
|
public override int GetAttackSound()
|
|
{
|
|
return 0x28;
|
|
}
|
|
|
|
public override bool AlwaysMurderer { get { return true; } }
|
|
public override bool BleedImmune { get { return true; } }
|
|
public override Poison PoisonImmune { get { return Poison.Lethal; } }
|
|
|
|
private DateTime NextTeleport { get; set; }
|
|
|
|
public override void AlterSpellDamageFrom(Mobile from, ref int damage)
|
|
{
|
|
if (from is BaseCreature && (((BaseCreature)from).Summoned || ((BaseCreature)from).Controlled))
|
|
damage /= 2;
|
|
|
|
if (NextTeleport < DateTime.UtcNow)
|
|
DoTeleport(from);
|
|
|
|
base.AlterSpellDamageFrom(from, ref damage);
|
|
}
|
|
|
|
public override void AlterMeleeDamageFrom(Mobile from, ref int damage)
|
|
{
|
|
if (from is BaseCreature && (((BaseCreature)from).Summoned || ((BaseCreature)from).Controlled))
|
|
damage /= 2;
|
|
|
|
if (NextTeleport < DateTime.UtcNow)
|
|
DoTeleport(from);
|
|
|
|
base.AlterMeleeDamageFrom(from, ref damage);
|
|
}
|
|
|
|
public void DoTeleport(Mobile m)
|
|
{
|
|
if (!InRange(m.Location, 1))
|
|
{
|
|
int x, y, z = 0;
|
|
Point3D p = Point3D.Zero;
|
|
|
|
for (int i = 0; i < 25; i++)
|
|
{
|
|
x = Utility.RandomMinMax(this.X - 1, this.X + 1);
|
|
y = Utility.RandomMinMax(this.Y - 1, this.Y + 1);
|
|
z = this.Map.GetAverageZ(x, y);
|
|
|
|
if (this.Map.CanSpawnMobile(x, y, z) && (x != this.X || y != this.Y))
|
|
{
|
|
p = new Point3D(x, y, z);
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (p == Point3D.Zero)
|
|
p = this.Location;
|
|
|
|
Point3D from = m.Location;
|
|
|
|
Effects.SendLocationParticles(EffectItem.Create(from, m.Map, EffectItem.DefaultDuration), 0x3728, 10, 10, 2023);
|
|
Effects.SendLocationParticles(EffectItem.Create(p, m.Map, EffectItem.DefaultDuration), 0x3728, 10, 10, 5023);
|
|
|
|
m.MoveToWorld(p, this.Map);
|
|
|
|
m.PlaySound(0x1FE);
|
|
}
|
|
|
|
NextTeleport = DateTime.UtcNow + TimeSpan.FromSeconds(Utility.RandomMinMax(30, 60));
|
|
}
|
|
|
|
public override void OnDeath(Container c)
|
|
{
|
|
base.OnDeath(c);
|
|
|
|
if (0.33 > Utility.RandomDouble() && Region.Find(c.Location, c.Map).IsPartOf("Shame"))
|
|
c.DropItem(new ShameCrystal(5));
|
|
}
|
|
|
|
public override void GenerateLoot()
|
|
{
|
|
this.AddLoot(LootPack.FilthyRich, 2);
|
|
}
|
|
|
|
public ChaosVortex(Serial serial)
|
|
: base(serial)
|
|
{
|
|
}
|
|
|
|
public override void Serialize(GenericWriter writer)
|
|
{
|
|
base.Serialize(writer);
|
|
writer.Write(0);
|
|
}
|
|
|
|
public override void Deserialize(GenericReader reader)
|
|
{
|
|
base.Deserialize(reader);
|
|
int version = reader.ReadInt();
|
|
}
|
|
}
|
|
|
|
[CorpseName("an unbound energy vortex corpse")]
|
|
public class UnboundEnergyVortex : BaseCreature
|
|
{
|
|
[Constructable]
|
|
public UnboundEnergyVortex() : base(AIType.AI_Melee, FightMode.Weakest, 10, 1, 0.4, 0.2)
|
|
{
|
|
Name = "an unbound energy vortex";
|
|
Body = 13;
|
|
|
|
SetStr(450);
|
|
SetDex(200);
|
|
SetInt(100);
|
|
|
|
SetHits(20000);
|
|
SetMana(0);
|
|
|
|
SetDamage(21, 23);
|
|
|
|
SetDamageType(ResistanceType.Physical, 0);
|
|
SetDamageType(ResistanceType.Energy, 100);
|
|
|
|
SetResistance(ResistanceType.Physical, 65, 75);
|
|
SetResistance(ResistanceType.Fire, 65, 75);
|
|
SetResistance(ResistanceType.Cold, 65, 75);
|
|
SetResistance(ResistanceType.Poison, 65, 75);
|
|
SetResistance(ResistanceType.Energy, 100);
|
|
|
|
SetSkill(SkillName.MagicResist, 100, 110);
|
|
SetSkill(SkillName.Tactics, 110, 130);
|
|
SetSkill(SkillName.Wrestling, 124, 140);
|
|
|
|
Fame = 22500;
|
|
Karma = -22500;
|
|
}
|
|
|
|
public override bool AlwaysMurderer { get { return true; } }
|
|
public override bool BleedImmune { get { return true; } }
|
|
public override Poison PoisonImmune { get { return Poison.Lethal; } }
|
|
|
|
public override int GetAngerSound()
|
|
{
|
|
return 0x15;
|
|
}
|
|
|
|
public override int GetAttackSound()
|
|
{
|
|
return 0x28;
|
|
}
|
|
|
|
private DateTime NextTeleport { get; set; }
|
|
|
|
public override void AlterSpellDamageFrom(Mobile from, ref int damage)
|
|
{
|
|
if (from is BaseCreature && (((BaseCreature)from).Summoned || ((BaseCreature)from).Controlled))
|
|
damage /= 2;
|
|
|
|
if (NextTeleport < DateTime.UtcNow)
|
|
DoTeleport(from);
|
|
|
|
base.AlterSpellDamageFrom(from, ref damage);
|
|
}
|
|
|
|
public override void AlterMeleeDamageFrom(Mobile from, ref int damage)
|
|
{
|
|
if (from is BaseCreature && (((BaseCreature)from).Summoned || ((BaseCreature)from).Controlled))
|
|
damage /= 2;
|
|
|
|
if (NextTeleport < DateTime.UtcNow)
|
|
DoTeleport(from);
|
|
|
|
base.AlterMeleeDamageFrom(from, ref damage);
|
|
}
|
|
|
|
public void DoTeleport(Mobile m)
|
|
{
|
|
if (!InRange(m.Location, 1))
|
|
{
|
|
int x, y, z = 0;
|
|
Point3D p = Point3D.Zero;
|
|
|
|
for (int i = 0; i < 25; i++)
|
|
{
|
|
x = Utility.RandomMinMax(this.X - 1, this.X + 1);
|
|
y = Utility.RandomMinMax(this.Y - 1, this.Y + 1);
|
|
z = this.Map.GetAverageZ(x, y);
|
|
|
|
if (this.Map.CanSpawnMobile(x, y, z) && (x != this.X || y != this.Y))
|
|
{
|
|
p = new Point3D(x, y, z);
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (p == Point3D.Zero)
|
|
p = this.Location;
|
|
|
|
Point3D from = m.Location;
|
|
|
|
Effects.SendLocationParticles(EffectItem.Create(from, m.Map, EffectItem.DefaultDuration), 0x3728, 10, 10, 2023);
|
|
Effects.SendLocationParticles(EffectItem.Create(p, m.Map, EffectItem.DefaultDuration), 0x3728, 10, 10, 5023);
|
|
|
|
m.MoveToWorld(p, this.Map);
|
|
|
|
m.PlaySound(0x1FE);
|
|
}
|
|
|
|
NextTeleport = DateTime.UtcNow + TimeSpan.FromSeconds(Utility.RandomMinMax(30, 60));
|
|
}
|
|
|
|
public override void OnDeath(Container c)
|
|
{
|
|
base.OnDeath(c);
|
|
|
|
if (0.33 > Utility.RandomDouble() && Region.Find(c.Location, c.Map).IsPartOf("Shame"))
|
|
c.DropItem(new ShameCrystal(5));
|
|
|
|
if (0.2 > Utility.RandomDouble())
|
|
c.DropItem(new VoidCore());
|
|
}
|
|
|
|
public override void GenerateLoot()
|
|
{
|
|
this.AddLoot(LootPack.UltraRich, 2);
|
|
}
|
|
|
|
public UnboundEnergyVortex(Serial serial)
|
|
: base(serial)
|
|
{
|
|
}
|
|
|
|
public override void Serialize(GenericWriter writer)
|
|
{
|
|
base.Serialize(writer);
|
|
writer.Write(0);
|
|
}
|
|
|
|
public override void Deserialize(GenericReader reader)
|
|
{
|
|
base.Deserialize(reader);
|
|
int version = reader.ReadInt();
|
|
}
|
|
}
|
|
|
|
[CorpseName("a diseased blood elemental")]
|
|
public class DiseasedBloodElemental : BloodElemental
|
|
{
|
|
[Constructable]
|
|
public DiseasedBloodElemental()
|
|
{
|
|
Name = "a diseased blood elemental";
|
|
Body = 0x9F;
|
|
Hue = 1779;
|
|
|
|
SetStr(650, 750);
|
|
SetDex(70, 80);
|
|
SetInt(300, 400);
|
|
|
|
SetHits(2500, 2700);
|
|
SetMana(1400, 1600);
|
|
|
|
SetDamage(19, 27);
|
|
|
|
SetDamageType(ResistanceType.Poison, 50);
|
|
SetDamageType(ResistanceType.Energy, 50);
|
|
|
|
SetResistance(ResistanceType.Physical, 65, 75);
|
|
SetResistance(ResistanceType.Fire, 55, 65);
|
|
SetResistance(ResistanceType.Cold, 50, 60);
|
|
SetResistance(ResistanceType.Poison, 60, 70);
|
|
SetResistance(ResistanceType.Energy, 50, 60);
|
|
|
|
SetSkill(SkillName.MagicResist, 110, 125);
|
|
SetSkill(SkillName.Tactics, 130, 140);
|
|
SetSkill(SkillName.Wrestling, 120, 140);
|
|
SetSkill(SkillName.Poisoning, 100);
|
|
SetSkill(SkillName.Magery, 110, 120);
|
|
SetSkill(SkillName.EvalInt, 115, 130);
|
|
SetSkill(SkillName.Meditation, 130, 155);
|
|
SetSkill(SkillName.DetectHidden, 80.0);
|
|
SetSkill(SkillName.Parry, 90.0, 100.0);
|
|
|
|
PackReg(7, 11);
|
|
|
|
int scrolls = Utility.RandomMinMax(4, 6);
|
|
|
|
Fame = 8500;
|
|
Karma = -8500;
|
|
|
|
SetWeaponAbility(WeaponAbility.BleedAttack);
|
|
SetSpecialAbility(SpecialAbility.LifeLeech);
|
|
}
|
|
|
|
public override bool AutoDispel { get { return true; } }
|
|
public override double AutoDispelChance { get { return 1.0; } }
|
|
public override int TreasureMapLevel { get { return 5; } }
|
|
public override double TreasureMapChance { get { return 1.0; } }
|
|
public override Poison HitPoison { get { return Poison.Lethal; } }
|
|
public override Poison PoisonImmune { get { return Poison.Parasitic; } }
|
|
|
|
public override void OnDeath(Container c)
|
|
{
|
|
base.OnDeath(c);
|
|
|
|
if (0.33 > Utility.RandomDouble() && Region.Find(c.Location, c.Map).IsPartOf("Shame"))
|
|
c.DropItem(new ShameCrystal(5));
|
|
}
|
|
|
|
public override void GenerateLoot()
|
|
{
|
|
this.AddLoot(LootPack.FilthyRich, 2);
|
|
this.AddLoot(LootPack.HighScrolls, Utility.RandomMinMax(1, 8));
|
|
}
|
|
|
|
public DiseasedBloodElemental(Serial serial)
|
|
: base(serial)
|
|
{
|
|
}
|
|
|
|
public override void Serialize(GenericWriter writer)
|
|
{
|
|
base.Serialize(writer);
|
|
writer.Write(0);
|
|
}
|
|
|
|
public override void Deserialize(GenericReader reader)
|
|
{
|
|
base.Deserialize(reader);
|
|
int version = reader.ReadInt();
|
|
}
|
|
}
|
|
|
|
public class GreaterWaterElemental : WaterElemental
|
|
{
|
|
[Constructable]
|
|
public GreaterWaterElemental()
|
|
{
|
|
SetStr(400, 500);
|
|
SetDex(150, 160);
|
|
SetInt(120, 140);
|
|
|
|
SetHits(500, 600);
|
|
SetMana(600, 700);
|
|
|
|
SetDamage(14, 16);
|
|
|
|
SetDamageType(ResistanceType.Physical, 50);
|
|
SetDamageType(ResistanceType.Cold, 50);
|
|
|
|
SetResistance(ResistanceType.Physical, 60, 70);
|
|
SetResistance(ResistanceType.Fire, 40, 50);
|
|
SetResistance(ResistanceType.Cold, 50, 60);
|
|
SetResistance(ResistanceType.Poison, 70, 80);
|
|
SetResistance(ResistanceType.Energy, 40, 50);
|
|
|
|
SetSkill(SkillName.MagicResist, 100, 110);
|
|
SetSkill(SkillName.Tactics, 90, 110);
|
|
SetSkill(SkillName.Wrestling, 90, 110);
|
|
SetSkill(SkillName.Magery, 90, 110);
|
|
SetSkill(SkillName.EvalInt, 90, 100);
|
|
|
|
Fame = 3500;
|
|
Karma = -3500;
|
|
}
|
|
|
|
public override void GenerateLoot()
|
|
{
|
|
this.AddLoot(LootPack.Rich, 1);
|
|
}
|
|
|
|
public override void OnDeath(Container c)
|
|
{
|
|
base.OnDeath(c);
|
|
|
|
if (0.10 > Utility.RandomDouble() && Region.Find(c.Location, c.Map).IsPartOf("Shame"))
|
|
c.DropItem(new ShameCrystal());
|
|
}
|
|
|
|
public GreaterWaterElemental(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();
|
|
}
|
|
}
|
|
|
|
public class ShameGreaterPoisonElemental : PoisonElemental
|
|
{
|
|
[Constructable]
|
|
public ShameGreaterPoisonElemental()
|
|
{
|
|
Hue = 32854;
|
|
|
|
SetStr(400, 500);
|
|
SetDex(170, 175);
|
|
SetInt(400, 450);
|
|
|
|
SetHits(950, 1050);
|
|
|
|
SetDamage(16, 19);
|
|
|
|
SetDamageType(ResistanceType.Physical, 10);
|
|
SetDamageType(ResistanceType.Poison, 90);
|
|
|
|
SetResistance(ResistanceType.Physical, 60, 70);
|
|
SetResistance(ResistanceType.Fire, 50, 60);
|
|
SetResistance(ResistanceType.Cold, 50, 60);
|
|
SetResistance(ResistanceType.Poison, 100);
|
|
SetResistance(ResistanceType.Energy, 40, 50);
|
|
|
|
SetSkill(SkillName.MagicResist, 110, 120);
|
|
SetSkill(SkillName.Tactics, 90, 120);
|
|
SetSkill(SkillName.Wrestling, 100, 115);
|
|
SetSkill(SkillName.Magery, 90, 110);
|
|
SetSkill(SkillName.EvalInt, 90, 100);
|
|
SetSkill(SkillName.Meditation, 100, 120);
|
|
SetSkill(SkillName.DetectHidden, 85.1);
|
|
SetSkill(SkillName.Parry, 80, 100);
|
|
}
|
|
|
|
public override void GenerateLoot()
|
|
{
|
|
this.AddLoot(LootPack.UltraRich, 1);
|
|
this.AddLoot(LootPack.FilthyRich, 1);
|
|
}
|
|
|
|
public override void OnDeath(Container c)
|
|
{
|
|
base.OnDeath(c);
|
|
|
|
if (0.10 > Utility.RandomDouble() && Region.Find(c.Location, c.Map).IsPartOf("Shame"))
|
|
c.DropItem(new ShameCrystal(5));
|
|
}
|
|
|
|
public ShameGreaterPoisonElemental(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();
|
|
}
|
|
}
|
|
|
|
public class GreaterBloodElemental : BloodElemental
|
|
{
|
|
[Constructable]
|
|
public GreaterBloodElemental()
|
|
{
|
|
SetStr(500, 600);
|
|
SetDex(60, 90);
|
|
SetInt(230, 350);
|
|
|
|
SetHits(1350, 1500);
|
|
SetHits(900, 1000);
|
|
|
|
SetDamage(17, 27);
|
|
|
|
SetDamageType(ResistanceType.Poison, 50);
|
|
SetDamageType(ResistanceType.Energy, 50);
|
|
|
|
SetResistance(ResistanceType.Physical, 55, 65);
|
|
SetResistance(ResistanceType.Fire, 40, 50);
|
|
SetResistance(ResistanceType.Cold, 40, 50);
|
|
SetResistance(ResistanceType.Poison, 50, 60);
|
|
SetResistance(ResistanceType.Energy, 40, 50);
|
|
|
|
SetSkill(SkillName.MagicResist, 115, 120);
|
|
SetSkill(SkillName.Tactics, 100, 120);
|
|
SetSkill(SkillName.Wrestling, 110, 120);
|
|
SetSkill(SkillName.Magery, 80, 100);
|
|
SetSkill(SkillName.EvalInt, 110, 120);
|
|
SetSkill(SkillName.Meditation, 120, 140);
|
|
}
|
|
|
|
public override void GenerateLoot()
|
|
{
|
|
this.AddLoot(LootPack.UltraRich, 1);
|
|
this.AddLoot(LootPack.FilthyRich, 1);
|
|
}
|
|
|
|
public override void OnDeath(Container c)
|
|
{
|
|
base.OnDeath(c);
|
|
|
|
if (0.10 > Utility.RandomDouble() && Region.Find(c.Location, c.Map).IsPartOf("Shame"))
|
|
c.DropItem(new ShameCrystal(5));
|
|
}
|
|
|
|
public GreaterBloodElemental(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();
|
|
}
|
|
}
|
|
|
|
public class ShameEarthElemental : EarthElemental
|
|
{
|
|
[Constructable]
|
|
public ShameEarthElemental()
|
|
{
|
|
SetHits(300, 400);
|
|
SetDamage(11, 13);
|
|
|
|
SetDamageType(ResistanceType.Physical, 100);
|
|
|
|
SetResistance(ResistanceType.Physical, 30, 35);
|
|
SetResistance(ResistanceType.Fire, 25, 30);
|
|
SetResistance(ResistanceType.Cold, 25, 30);
|
|
SetResistance(ResistanceType.Poison, 25, 30);
|
|
SetResistance(ResistanceType.Energy, 20, 25);
|
|
|
|
SetSkill(SkillName.MagicResist, 65, 85);
|
|
SetSkill(SkillName.Tactics, 65, 90);
|
|
SetSkill(SkillName.Wrestling, 80, 85);
|
|
|
|
Fame = 3500;
|
|
Karma = -3500;
|
|
}
|
|
|
|
public override void OnDeath(Container c)
|
|
{
|
|
base.OnDeath(c);
|
|
|
|
if (0.08 > Utility.RandomDouble() && Region.Find(c.Location, c.Map).IsPartOf("Shame"))
|
|
c.DropItem(new ShameCrystal());
|
|
}
|
|
|
|
public override void GenerateLoot()
|
|
{
|
|
this.AddLoot(LootPack.Rich, 1);
|
|
}
|
|
|
|
public ShameEarthElemental(Serial serial)
|
|
: base(serial)
|
|
{
|
|
}
|
|
|
|
public override void Serialize(GenericWriter writer)
|
|
{
|
|
base.Serialize(writer);
|
|
writer.Write(0);
|
|
}
|
|
|
|
public override void Deserialize(GenericReader reader)
|
|
{
|
|
base.Deserialize(reader);
|
|
int version = reader.ReadInt();
|
|
}
|
|
}
|
|
}
|