Reorganizes Project (#41)

This commit is contained in:
Kamron Batman 2019-08-02 18:13:40 -07:00 • committed by GitHub
parent 08bf44af9a
commit 3614a66aee
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3499 changed files with 79 additions and 55 deletions

View file

@ -0,0 +1,89 @@
namespace Server.Mobiles
{
public class AncientWyrm : BaseCreature
{
[Constructible]
public AncientWyrm() : base(AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4)
{
Body = 46;
BaseSoundID = 362;
SetStr(1096, 1185);
SetDex(86, 175);
SetInt(686, 775);
SetHits(658, 711);
SetDamage(29, 35);
SetDamageType(ResistanceType.Physical, 75);
SetDamageType(ResistanceType.Fire, 25);
SetResistance(ResistanceType.Physical, 65, 75);
SetResistance(ResistanceType.Fire, 80, 90);
SetResistance(ResistanceType.Cold, 70, 80);
SetResistance(ResistanceType.Poison, 60, 70);
SetResistance(ResistanceType.Energy, 60, 70);
SetSkill(SkillName.EvalInt, 80.1, 100.0);
SetSkill(SkillName.Magery, 80.1, 100.0);
SetSkill(SkillName.Meditation, 52.5, 75.0);
SetSkill(SkillName.MagicResist, 100.5, 150.0);
SetSkill(SkillName.Tactics, 97.6, 100.0);
SetSkill(SkillName.Wrestling, 97.6, 100.0);
Fame = 22500;
Karma = -22500;
VirtualArmor = 70;
}
public AncientWyrm(Serial serial) : base(serial)
{
}
public override string CorpseName => "a dragon corpse";
public override string DefaultName => "an ancient wyrm";
public override bool ReacquireOnMovement => true;
public override bool HasBreath => true; // fire breath enabled
public override bool AutoDispel => true;
public override HideType HideType => HideType.Barbed;
public override int Hides => 40;
public override int Meat => 19;
public override int Scales => 12;
public override ScaleType ScaleType => (ScaleType)Utility.Random(4);
public override Poison PoisonImmune => Poison.Regular;
public override Poison HitPoison => Utility.RandomBool() ? Poison.Lesser : Poison.Regular;
public override int TreasureMapLevel => 5;
public override bool CanFly => true;
public override void GenerateLoot()
{
AddLoot(LootPack.FilthyRich, 3);
AddLoot(LootPack.Gems, 5);
}
public override int GetIdleSound()
{
return 0x2D3;
}
public override int GetHurtSound()
{
return 0x2D1;
}
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();
}
}
}

View file

@ -0,0 +1,79 @@
using Server.Items;
namespace Server.Mobiles
{
public class DeepSeaSerpent : BaseCreature
{
[Constructible]
public DeepSeaSerpent() : base(AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4)
{
Body = 150;
BaseSoundID = 447;
Hue = Utility.Random(0x8A0, 5);
SetStr(251, 425);
SetDex(87, 135);
SetInt(87, 155);
SetHits(151, 255);
SetDamage(6, 14);
SetDamageType(ResistanceType.Physical, 100);
SetResistance(ResistanceType.Physical, 30, 40);
SetResistance(ResistanceType.Fire, 70, 80);
SetResistance(ResistanceType.Cold, 40, 50);
SetResistance(ResistanceType.Poison, 30, 40);
SetResistance(ResistanceType.Energy, 15, 20);
SetSkill(SkillName.MagicResist, 60.1, 75.0);
SetSkill(SkillName.Tactics, 60.1, 70.0);
SetSkill(SkillName.Wrestling, 60.1, 70.0);
Fame = 6000;
Karma = -6000;
VirtualArmor = 60;
CanSwim = true;
CantWalk = true;
if (Utility.RandomBool())
PackItem(new SulfurousAsh(4));
else
PackItem(new BlackPearl(4));
//PackItem( new SpecialFishingNet() );
}
public DeepSeaSerpent(Serial serial) : base(serial)
{
}
public override string CorpseName => "a deep sea serpents corpse";
public override string DefaultName => "a deep sea serpent";
public override bool HasBreath => true;
public override int Meat => 1;
public override int Scales => 8;
public override ScaleType ScaleType => ScaleType.Blue;
public override void GenerateLoot()
{
AddLoot(LootPack.Meager);
}
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();
}
}
}

View file

@ -0,0 +1,81 @@
namespace Server.Mobiles
{
public class Dragon : BaseCreature
{
[Constructible]
public Dragon() : base(AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4)
{
Body = Utility.RandomList(12, 59);
BaseSoundID = 362;
SetStr(796, 825);
SetDex(86, 105);
SetInt(436, 475);
SetHits(478, 495);
SetDamage(16, 22);
SetDamageType(ResistanceType.Physical, 100);
SetResistance(ResistanceType.Physical, 55, 65);
SetResistance(ResistanceType.Fire, 60, 70);
SetResistance(ResistanceType.Cold, 30, 40);
SetResistance(ResistanceType.Poison, 25, 35);
SetResistance(ResistanceType.Energy, 35, 45);
SetSkill(SkillName.EvalInt, 30.1, 40.0);
SetSkill(SkillName.Magery, 30.1, 40.0);
SetSkill(SkillName.MagicResist, 99.1, 100.0);
SetSkill(SkillName.Tactics, 97.6, 100.0);
SetSkill(SkillName.Wrestling, 90.1, 92.5);
Fame = 15000;
Karma = -15000;
VirtualArmor = 60;
Tamable = true;
ControlSlots = 3;
MinTameSkill = 93.9;
}
public Dragon(Serial serial) : base(serial)
{
}
public override string CorpseName => "a dragon corpse";
public override string DefaultName => "a dragon";
public override bool ReacquireOnMovement => !Controlled;
public override bool HasBreath => true; // fire breath enabled
public override bool AutoDispel => !Controlled;
public override int TreasureMapLevel => 4;
public override int Meat => 19;
public override int Hides => 20;
public override HideType HideType => HideType.Barbed;
public override int Scales => 7;
public override ScaleType ScaleType => Body == 12 ? ScaleType.Yellow : ScaleType.Red;
public override FoodType FavoriteFood => FoodType.Meat;
public override bool CanAngerOnTame => true;
public override bool CanFly => true;
public override void GenerateLoot()
{
AddLoot(LootPack.FilthyRich, 2);
AddLoot(LootPack.Gems, 8);
}
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();
}
}
}

View file

@ -0,0 +1,170 @@
using System;
using Server.Items;
namespace Server.Mobiles
{
public class Leviathan : BaseCreature
{
[Constructible]
public Leviathan(Mobile fisher = null) :
base(AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4)
{
Fisher = fisher;
// May not be OSI accurate; mostly copied from krakens
Body = 77;
BaseSoundID = 353;
Hue = 0x481;
SetStr(1000);
SetDex(501, 520);
SetInt(501, 515);
SetHits(1500);
SetDamage(25, 33);
SetDamageType(ResistanceType.Physical, 70);
SetDamageType(ResistanceType.Cold, 30);
SetResistance(ResistanceType.Physical, 55, 65);
SetResistance(ResistanceType.Fire, 45, 55);
SetResistance(ResistanceType.Cold, 45, 55);
SetResistance(ResistanceType.Poison, 35, 45);
SetResistance(ResistanceType.Energy, 25, 35);
SetSkill(SkillName.EvalInt, 97.6, 107.5);
SetSkill(SkillName.Magery, 97.6, 107.5);
SetSkill(SkillName.MagicResist, 97.6, 107.5);
SetSkill(SkillName.Meditation, 97.6, 107.5);
SetSkill(SkillName.Tactics, 97.6, 107.5);
SetSkill(SkillName.Wrestling, 97.6, 107.5);
Fame = 24000;
Karma = -24000;
VirtualArmor = 50;
CanSwim = true;
CantWalk = true;
PackItem(new MessageInABottle());
Rope rope = new Rope();
rope.ItemID = 0x14F8;
PackItem(rope);
rope = new Rope();
rope.ItemID = 0x14FA;
PackItem(rope);
}
public Leviathan(Serial serial) : base(serial)
{
}
public override string CorpseName => "a leviathan corpse";
public Mobile Fisher{ get; set; }
public override string DefaultName => "a leviathan";
public override bool HasBreath => true;
public override int BreathPhysicalDamage => 70; // TODO: Verify damage type
public override int BreathColdDamage => 30;
public override int BreathFireDamage => 0;
public override int BreathEffectHue => 0x1ED;
public override double BreathDamageScalar => 0.05;
public override double BreathMinDelay => 5.0;
public override double BreathMaxDelay => 7.5;
public override int TreasureMapLevel => 5;
public static Type[] Artifacts{ get; } =
{
// Decorations
typeof(CandelabraOfSouls),
typeof(GhostShipAnchor),
typeof(GoldBricks),
typeof(PhillipsWoodenSteed),
typeof(SeahorseStatuette),
typeof(ShipModelOfTheHMSCape),
typeof(AdmiralsHeartyRum),
// Equipment
typeof(AlchemistsBauble),
typeof(ArcticDeathDealer),
typeof(BlazeOfDeath),
typeof(BurglarsBandana),
typeof(CaptainQuacklebushsCutlass),
typeof(CavortingClub),
typeof(DreadPirateHat),
typeof(EnchantedTitanLegBone),
typeof(GwennosHarp),
typeof(IolosLute),
typeof(LunaLance),
typeof(NightsKiss),
typeof(NoxRangersHeavyCrossbow),
typeof(PolarBearMask),
typeof(VioletCourage)
};
public override void GenerateLoot()
{
AddLoot(LootPack.FilthyRich, 5);
}
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 static void GiveArtifactTo(Mobile m)
{
Item item = Loot.Construct(Artifacts);
if (item == null)
return;
// TODO: Confirm messages
if (m.AddToBackpack(item))
m.SendMessage("As a reward for slaying the mighty leviathan, an artifact has been placed in your backpack.");
else
m.SendMessage(
"As your backpack is full, your reward for destroying the legendary leviathan has been placed at your feet.");
}
public override void OnKilledBy(Mobile mob)
{
base.OnKilledBy(mob);
if (Paragon.CheckArtifactChance(mob, this))
{
GiveArtifactTo(mob);
if (mob == Fisher)
Fisher = null;
}
}
public override void OnDeath(Container c)
{
base.OnDeath(c);
if (Fisher != null && 25 > Utility.Random(100))
GiveArtifactTo(Fisher);
Fisher = null;
}
}
}

View file

@ -0,0 +1,79 @@
namespace Server.Mobiles
{
[TypeAlias("Server.Mobiles.OphidianJusticar", "Server.Mobiles.OphidianZealot")]
public class OphidianArchmage : BaseCreature
{
private static string[] m_Names =
{
"an ophidian justicar",
"an ophidian zealot"
};
[Constructible]
public OphidianArchmage() : base(AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4)
{
Name = m_Names[Utility.Random(m_Names.Length)];
Body = 85;
BaseSoundID = 639;
SetStr(281, 305);
SetDex(191, 215);
SetInt(226, 250);
SetHits(169, 183);
SetStam(36, 45);
SetDamage(5, 10);
SetDamageType(ResistanceType.Physical, 100);
SetResistance(ResistanceType.Physical, 40, 45);
SetResistance(ResistanceType.Fire, 20, 30);
SetResistance(ResistanceType.Cold, 25, 35);
SetResistance(ResistanceType.Poison, 35, 40);
SetResistance(ResistanceType.Energy, 25, 35);
SetSkill(SkillName.EvalInt, 95.1, 100.0);
SetSkill(SkillName.Magery, 95.1, 100.0);
SetSkill(SkillName.MagicResist, 75.0, 97.5);
SetSkill(SkillName.Tactics, 65.0, 87.5);
SetSkill(SkillName.Wrestling, 20.2, 60.0);
Fame = 11500;
Karma = -11500;
VirtualArmor = 44;
PackReg(5, 15);
PackNecroReg(5, 15);
}
public OphidianArchmage(Serial serial) : base(serial)
{
}
public override string CorpseName => "an ophidian corpse";
public override int Meat => 1;
public override OppositionGroup OppositionGroup => OppositionGroup.TerathansAndOphidians;
public override void GenerateLoot()
{
AddLoot(LootPack.Rich);
AddLoot(LootPack.MedScrolls, 2);
}
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();
}
}
}

View file

@ -0,0 +1,80 @@
namespace Server.Mobiles
{
[TypeAlias("Server.Mobiles.OphidianShaman")]
public class OphidianMage : BaseCreature
{
private static string[] m_Names =
{
"an ophidian apprentice mage",
"an ophidian shaman"
};
[Constructible]
public OphidianMage() : base(AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4)
{
Name = m_Names[Utility.Random(m_Names.Length)];
Body = 85;
BaseSoundID = 639;
SetStr(181, 205);
SetDex(191, 215);
SetInt(96, 120);
SetHits(109, 123);
SetDamage(5, 10);
SetDamageType(ResistanceType.Physical, 100);
SetResistance(ResistanceType.Physical, 25, 35);
SetResistance(ResistanceType.Fire, 30, 40);
SetResistance(ResistanceType.Cold, 35, 45);
SetResistance(ResistanceType.Poison, 40, 50);
SetResistance(ResistanceType.Energy, 35, 45);
SetSkill(SkillName.EvalInt, 85.1, 100.0);
SetSkill(SkillName.Magery, 85.1, 100.0);
SetSkill(SkillName.MagicResist, 75.0, 97.5);
SetSkill(SkillName.Tactics, 65.0, 87.5);
SetSkill(SkillName.Wrestling, 20.2, 60.0);
Fame = 4000;
Karma = -4000;
VirtualArmor = 30;
PackReg(10);
}
public OphidianMage(Serial serial) : base(serial)
{
}
public override string CorpseName => "an ophidian corpse";
public override int Meat => 1;
public override int TreasureMapLevel => 2;
public override OppositionGroup OppositionGroup => OppositionGroup.TerathansAndOphidians;
public override void GenerateLoot()
{
AddLoot(LootPack.Average);
AddLoot(LootPack.LowScrolls);
AddLoot(LootPack.MedScrolls);
AddLoot(LootPack.Potions);
}
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();
}
}
}

View file

@ -0,0 +1,71 @@
namespace Server.Mobiles
{
public class OphidianMatriarch : BaseCreature
{
[Constructible]
public OphidianMatriarch() : base(AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4)
{
Body = 87;
BaseSoundID = 644;
SetStr(416, 505);
SetDex(96, 115);
SetInt(366, 455);
SetHits(250, 303);
SetDamage(11, 13);
SetDamageType(ResistanceType.Physical, 100);
SetResistance(ResistanceType.Physical, 45, 55);
SetResistance(ResistanceType.Fire, 30, 40);
SetResistance(ResistanceType.Cold, 35, 45);
SetResistance(ResistanceType.Poison, 40, 50);
SetResistance(ResistanceType.Energy, 35, 45);
SetSkill(SkillName.EvalInt, 90.1, 100.0);
SetSkill(SkillName.Magery, 90.1, 100.0);
SetSkill(SkillName.Meditation, 5.4, 25.0);
SetSkill(SkillName.MagicResist, 90.1, 100.0);
SetSkill(SkillName.Tactics, 50.1, 70.0);
SetSkill(SkillName.Wrestling, 60.1, 80.0);
Fame = 16000;
Karma = -16000;
VirtualArmor = 50;
}
public OphidianMatriarch(Serial serial) : base(serial)
{
}
public override string CorpseName => "an ophidian corpse";
public override string DefaultName => "an ophidian matriarch";
public override Poison PoisonImmune => Poison.Greater;
public override int TreasureMapLevel => 4;
public override OppositionGroup OppositionGroup => OppositionGroup.TerathansAndOphidians;
public override void GenerateLoot()
{
AddLoot(LootPack.Rich);
AddLoot(LootPack.Average, 2);
AddLoot(LootPack.MedScrolls, 2);
}
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();
}
}
}

View file

@ -0,0 +1,85 @@
using Server.Items;
namespace Server.Mobiles
{
[TypeAlias("Server.Mobiles.Seaserpant")]
public class SeaSerpent : BaseCreature
{
[Constructible]
public SeaSerpent() : base(AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4)
{
Body = 150;
BaseSoundID = 447;
Hue = Utility.Random(0x530, 9);
SetStr(168, 225);
SetDex(58, 85);
SetInt(53, 95);
SetHits(110, 127);
SetDamage(7, 13);
SetDamageType(ResistanceType.Physical, 100);
SetResistance(ResistanceType.Physical, 25, 35);
SetResistance(ResistanceType.Fire, 50, 60);
SetResistance(ResistanceType.Cold, 30, 40);
SetResistance(ResistanceType.Poison, 30, 40);
SetResistance(ResistanceType.Energy, 15, 20);
SetSkill(SkillName.MagicResist, 60.1, 75.0);
SetSkill(SkillName.Tactics, 60.1, 70.0);
SetSkill(SkillName.Wrestling, 60.1, 70.0);
Fame = 6000;
Karma = -6000;
VirtualArmor = 30;
CanSwim = true;
CantWalk = true;
if (Utility.RandomBool())
PackItem(new SulfurousAsh(4));
else
PackItem(new BlackPearl(4));
PackItem(new RawFishSteak());
//PackItem( new SpecialFishingNet() );
}
public SeaSerpent(Serial serial) : base(serial)
{
}
public override string CorpseName => "a sea serpents corpse";
public override string DefaultName => "a sea serpent";
public override bool HasBreath => true;
public override int TreasureMapLevel => 2;
public override int Hides => 10;
public override HideType HideType => HideType.Horned;
public override int Scales => 8;
public override ScaleType ScaleType => ScaleType.Blue;
public override void GenerateLoot()
{
AddLoot(LootPack.Meager);
}
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();
}
}
}

View file

@ -0,0 +1,121 @@
using Server.Engines.Plants;
namespace Server.Mobiles
{
public class SerpentineDragon : BaseCreature
{
[Constructible]
public SerpentineDragon() : base(AIType.AI_Mage, FightMode.Evil, 10, 1, 0.2, 0.4)
{
Body = 103;
BaseSoundID = 362;
SetStr(111, 140);
SetDex(201, 220);
SetInt(1001, 1040);
SetHits(480);
SetDamage(5, 12);
SetDamageType(ResistanceType.Physical, 75);
SetDamageType(ResistanceType.Poison, 25);
SetResistance(ResistanceType.Physical, 35, 40);
SetResistance(ResistanceType.Fire, 25, 35);
SetResistance(ResistanceType.Cold, 25, 35);
SetResistance(ResistanceType.Poison, 25, 35);
SetResistance(ResistanceType.Energy, 25, 35);
SetSkill(SkillName.EvalInt, 100.1, 110.0);
SetSkill(SkillName.Magery, 110.1, 120.0);
SetSkill(SkillName.Meditation, 100.0);
SetSkill(SkillName.MagicResist, 100.0);
SetSkill(SkillName.Tactics, 50.1, 60.0);
SetSkill(SkillName.Wrestling, 30.1, 100.0);
Fame = 15000;
Karma = 15000;
VirtualArmor = 36;
if (Core.ML && Utility.RandomDouble() < .33)
PackItem(Seed.RandomPeculiarSeed(2));
}
public SerpentineDragon(Serial serial) : base(serial)
{
}
public override string CorpseName => "a dragon corpse";
public override string DefaultName => "a serpentine dragon";
public override bool ReacquireOnMovement => true;
public override bool HasBreath => true; // fire breath enabled
public override double BonusPetDamageScalar => Core.SE ? 3.0 : 1.0;
public override bool AutoDispel => true;
public override HideType HideType => HideType.Barbed;
public override int Hides => 20;
public override int Meat => 19;
public override int Scales => 6;
public override ScaleType ScaleType => Utility.RandomBool() ? ScaleType.Black : ScaleType.White;
public override int TreasureMapLevel => 4;
public override void GenerateLoot()
{
AddLoot(LootPack.FilthyRich, 2);
AddLoot(LootPack.Gems, 2);
}
public override int GetIdleSound()
{
return 0x2C4;
}
public override int GetAttackSound()
{
return 0x2C0;
}
public override int GetDeathSound()
{
return 0x2C1;
}
public override int GetAngerSound()
{
return 0x2C4;
}
public override int GetHurtSound()
{
return 0x2C3;
}
public override void OnGotMeleeAttack(Mobile attacker)
{
base.OnGotMeleeAttack(attacker);
if (!Core.SE && 0.2 > Utility.RandomDouble() && attacker is BaseCreature c && c.Controlled &&
c.ControlMaster != null)
{
c.ControlTarget = c.ControlMaster;
c.ControlOrder = OrderType.Attack;
c.Combatant = c.ControlMaster;
}
}
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();
}
}
}

View file

@ -0,0 +1,90 @@
namespace Server.Mobiles
{
public class ShadowWyrm : BaseCreature
{
[Constructible]
public ShadowWyrm() : base(AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4)
{
Body = 106;
BaseSoundID = 362;
SetStr(898, 1030);
SetDex(68, 200);
SetInt(488, 620);
SetHits(558, 599);
SetDamage(29, 35);
SetDamageType(ResistanceType.Physical, 75);
SetDamageType(ResistanceType.Cold, 25);
SetResistance(ResistanceType.Physical, 65, 75);
SetResistance(ResistanceType.Fire, 50, 60);
SetResistance(ResistanceType.Cold, 45, 55);
SetResistance(ResistanceType.Poison, 20, 30);
SetResistance(ResistanceType.Energy, 50, 60);
SetSkill(SkillName.EvalInt, 80.1, 100.0);
SetSkill(SkillName.Magery, 80.1, 100.0);
SetSkill(SkillName.Meditation, 52.5, 75.0);
SetSkill(SkillName.MagicResist, 100.3, 130.0);
SetSkill(SkillName.Tactics, 97.6, 100.0);
SetSkill(SkillName.Wrestling, 97.6, 100.0);
Fame = 22500;
Karma = -22500;
VirtualArmor = 70;
}
public ShadowWyrm(Serial serial) : base(serial)
{
}
public override string CorpseName => "a shadow wyrm corpse";
public override string DefaultName => "a shadow wyrm";
public override bool ReacquireOnMovement => true;
public override bool HasBreath => true; // fire breath enabled
public override bool AutoDispel => true;
public override Poison PoisonImmune => Poison.Deadly;
public override Poison HitPoison => Poison.Deadly;
public override int TreasureMapLevel => 5;
public override int Meat => 19;
public override int Hides => 20;
public override int Scales => 10;
public override ScaleType ScaleType => ScaleType.Black;
public override HideType HideType => HideType.Barbed;
public override bool CanFly => true;
public override void GenerateLoot()
{
AddLoot(LootPack.FilthyRich, 3);
AddLoot(LootPack.Gems, 5);
}
public override int GetIdleSound()
{
return 0x2D5;
}
public override int GetHurtSound()
{
return 0x2D1;
}
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();
}
}
}

View file

@ -0,0 +1,83 @@
namespace Server.Mobiles
{
public class SkeletalDragon : BaseCreature
{
[Constructible]
public SkeletalDragon() : base(AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4)
{
Body = 104;
BaseSoundID = 0x488;
SetStr(898, 1030);
SetDex(68, 200);
SetInt(488, 620);
SetHits(558, 599);
SetDamage(29, 35);
SetDamageType(ResistanceType.Physical, 75);
SetDamageType(ResistanceType.Fire, 25);
SetResistance(ResistanceType.Physical, 75, 80);
SetResistance(ResistanceType.Fire, 40, 60);
SetResistance(ResistanceType.Cold, 40, 60);
SetResistance(ResistanceType.Poison, 70, 80);
SetResistance(ResistanceType.Energy, 40, 60);
SetSkill(SkillName.EvalInt, 80.1, 100.0);
SetSkill(SkillName.Magery, 80.1, 100.0);
SetSkill(SkillName.MagicResist, 100.3, 130.0);
SetSkill(SkillName.Tactics, 97.6, 100.0);
SetSkill(SkillName.Wrestling, 97.6, 100.0);
SetSkill(SkillName.Necromancy, 120.1, 130.0);
SetSkill(SkillName.SpiritSpeak, 120.1, 130.0);
Fame = 22500;
Karma = -22500;
VirtualArmor = 80;
}
public SkeletalDragon(Serial serial) : base(serial)
{
}
public override string CorpseName => "a skeletal dragon corpse";
public override string DefaultName => "a skeletal dragon";
public override bool ReacquireOnMovement => true;
public override bool HasBreath => true; // fire breath enabled
public override int BreathFireDamage => 0;
public override int BreathColdDamage => 100;
public override int BreathEffectHue => 0x480;
public override double BonusPetDamageScalar => Core.SE ? 3.0 : 1.0;
// TODO: Undead summoning?
public override bool AutoDispel => true;
public override Poison PoisonImmune => Poison.Lethal;
public override bool BleedImmune => true;
public override int Meat => 19; // where's it hiding these? :)
public override int Hides => 20;
public override HideType HideType => HideType.Barbed;
public override void GenerateLoot()
{
AddLoot(LootPack.FilthyRich, 4);
AddLoot(LootPack.Gems, 5);
}
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();
}
}
}

View file

@ -0,0 +1,81 @@
namespace Server.Mobiles
{
public class WhiteWyrm : BaseCreature
{
[Constructible]
public WhiteWyrm() : base(AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4)
{
Body = Utility.RandomBool() ? 180 : 49;
BaseSoundID = 362;
SetStr(721, 760);
SetDex(101, 130);
SetInt(386, 425);
SetHits(433, 456);
SetDamage(17, 25);
SetDamageType(ResistanceType.Physical, 50);
SetDamageType(ResistanceType.Cold, 50);
SetResistance(ResistanceType.Physical, 55, 70);
SetResistance(ResistanceType.Fire, 15, 25);
SetResistance(ResistanceType.Cold, 80, 90);
SetResistance(ResistanceType.Poison, 40, 50);
SetResistance(ResistanceType.Energy, 40, 50);
SetSkill(SkillName.EvalInt, 99.1, 100.0);
SetSkill(SkillName.Magery, 99.1, 100.0);
SetSkill(SkillName.MagicResist, 99.1, 100.0);
SetSkill(SkillName.Tactics, 97.6, 100.0);
SetSkill(SkillName.Wrestling, 90.1, 100.0);
Fame = 18000;
Karma = -18000;
VirtualArmor = 64;
Tamable = true;
ControlSlots = 3;
MinTameSkill = 96.3;
}
public WhiteWyrm(Serial serial) : base(serial)
{
}
public override string CorpseName => "a white wyrm corpse";
public override string DefaultName => "a white wyrm";
public override bool ReacquireOnMovement => true;
public override int TreasureMapLevel => 4;
public override int Meat => 19;
public override int Hides => 20;
public override HideType HideType => HideType.Barbed;
public override int Scales => 9;
public override ScaleType ScaleType => ScaleType.White;
public override FoodType FavoriteFood => FoodType.Meat | FoodType.Gold;
public override bool CanAngerOnTame => true;
public override bool CanFly => true;
public override void GenerateLoot()
{
AddLoot(LootPack.FilthyRich, 2);
AddLoot(LootPack.Average);
AddLoot(LootPack.Gems, Utility.Random(1, 5));
}
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();
}
}
}

View file

@ -0,0 +1,80 @@
namespace Server.Mobiles
{
public class Drake : BaseCreature
{
[Constructible]
public Drake() : base(AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4)
{
Body = Utility.RandomList(60, 61);
BaseSoundID = 362;
SetStr(401, 430);
SetDex(133, 152);
SetInt(101, 140);
SetHits(241, 258);
SetDamage(11, 17);
SetDamageType(ResistanceType.Physical, 80);
SetDamageType(ResistanceType.Fire, 20);
SetResistance(ResistanceType.Physical, 45, 50);
SetResistance(ResistanceType.Fire, 50, 60);
SetResistance(ResistanceType.Cold, 40, 50);
SetResistance(ResistanceType.Poison, 20, 30);
SetResistance(ResistanceType.Energy, 30, 40);
SetSkill(SkillName.MagicResist, 65.1, 80.0);
SetSkill(SkillName.Tactics, 65.1, 90.0);
SetSkill(SkillName.Wrestling, 65.1, 80.0);
Fame = 5500;
Karma = -5500;
VirtualArmor = 46;
Tamable = true;
ControlSlots = 2;
MinTameSkill = 84.3;
PackReg(3);
}
public Drake(Serial serial) : base(serial)
{
}
public override string CorpseName => "a drake corpse";
public override string DefaultName => "a drake";
public override bool ReacquireOnMovement => true;
public override bool HasBreath => true; // fire breath enabled
public override int TreasureMapLevel => 2;
public override int Meat => 10;
public override int Hides => 20;
public override HideType HideType => HideType.Horned;
public override int Scales => 2;
public override ScaleType ScaleType => Body == 60 ? ScaleType.Yellow : ScaleType.Red;
public override FoodType FavoriteFood => FoodType.Meat | FoodType.Fish;
public override bool CanFly => true;
public override void GenerateLoot()
{
AddLoot(LootPack.Rich);
AddLoot(LootPack.MedScrolls, 2);
}
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();
}
}
}

View file

@ -0,0 +1,92 @@
namespace Server.Mobiles
{
public class Harpy : BaseCreature
{
[Constructible]
public Harpy() : base(AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4)
{
Body = 30;
BaseSoundID = 402;
SetStr(96, 120);
SetDex(86, 110);
SetInt(51, 75);
SetHits(58, 72);
SetDamage(5, 7);
SetDamageType(ResistanceType.Physical, 100);
SetResistance(ResistanceType.Physical, 25, 30);
SetResistance(ResistanceType.Fire, 10, 20);
SetResistance(ResistanceType.Cold, 10, 30);
SetResistance(ResistanceType.Poison, 20, 30);
SetResistance(ResistanceType.Energy, 10, 20);
SetSkill(SkillName.MagicResist, 50.1, 65.0);
SetSkill(SkillName.Tactics, 70.1, 100.0);
SetSkill(SkillName.Wrestling, 60.1, 90.0);
Fame = 2500;
Karma = -2500;
VirtualArmor = 28;
}
public Harpy(Serial serial) : base(serial)
{
}
public override string CorpseName => "a harpy corpse";
public override string DefaultName => "a harpy";
public override bool CanRummageCorpses => true;
public override int Meat => 4;
public override MeatType MeatType => MeatType.Bird;
public override int Feathers => 50;
public override bool CanFly => true;
public override void GenerateLoot()
{
AddLoot(LootPack.Meager, 2);
}
public override int GetAttackSound()
{
return 916;
}
public override int GetAngerSound()
{
return 916;
}
public override int GetDeathSound()
{
return 917;
}
public override int GetHurtSound()
{
return 919;
}
public override int GetIdleSound()
{
return 918;
}
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();
}
}
}

View file

@ -0,0 +1,79 @@
using Server.Items;
namespace Server.Mobiles
{
public class Kraken : BaseCreature
{
[Constructible]
public Kraken() : base(AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4)
{
Body = 77;
BaseSoundID = 353;
SetStr(756, 780);
SetDex(226, 245);
SetInt(26, 40);
SetHits(454, 468);
SetMana(0);
SetDamage(19, 33);
SetDamageType(ResistanceType.Physical, 70);
SetDamageType(ResistanceType.Cold, 30);
SetResistance(ResistanceType.Physical, 45, 55);
SetResistance(ResistanceType.Fire, 30, 40);
SetResistance(ResistanceType.Cold, 30, 40);
SetResistance(ResistanceType.Poison, 20, 30);
SetResistance(ResistanceType.Energy, 10, 20);
SetSkill(SkillName.MagicResist, 15.1, 20.0);
SetSkill(SkillName.Tactics, 45.1, 60.0);
SetSkill(SkillName.Wrestling, 45.1, 60.0);
Fame = 11000;
Karma = -11000;
VirtualArmor = 50;
CanSwim = true;
CantWalk = true;
Rope rope = new Rope();
rope.ItemID = 0x14F8;
PackItem(rope);
if (Utility.RandomDouble() < .05)
PackItem(new MessageInABottle());
PackItem(new SpecialFishingNet()); //Confirm?
}
public Kraken(Serial serial) : base(serial)
{
}
public override string CorpseName => "a krakens corpse";
public override string DefaultName => "a kraken";
public override int TreasureMapLevel => 4;
public override void GenerateLoot()
{
AddLoot(LootPack.Rich);
}
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();
}
}
}

View file

@ -0,0 +1,69 @@
using Server.Misc;
namespace Server.Mobiles
{
public class Lizardman : BaseCreature
{
[Constructible]
public Lizardman() : base(AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4)
{
Name = NameList.RandomName("lizardman");
Body = Utility.RandomList(35, 36);
BaseSoundID = 417;
SetStr(96, 120);
SetDex(86, 105);
SetInt(36, 60);
SetHits(58, 72);
SetDamage(5, 7);
SetDamageType(ResistanceType.Physical, 100);
SetResistance(ResistanceType.Physical, 25, 30);
SetResistance(ResistanceType.Fire, 5, 10);
SetResistance(ResistanceType.Cold, 5, 10);
SetResistance(ResistanceType.Poison, 10, 20);
SetSkill(SkillName.MagicResist, 35.1, 60.0);
SetSkill(SkillName.Tactics, 55.1, 80.0);
SetSkill(SkillName.Wrestling, 50.1, 70.0);
Fame = 1500;
Karma = -1500;
VirtualArmor = 28;
}
public Lizardman(Serial serial) : base(serial)
{
}
public override string CorpseName => "a lizardman corpse";
public override InhumanSpeech SpeechType => InhumanSpeech.Lizardman;
public override bool CanRummageCorpses => true;
public override int Meat => 1;
public override int Hides => 12;
public override HideType HideType => HideType.Spined;
public override void GenerateLoot()
{
AddLoot(LootPack.Meager);
// TODO: weapon
}
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();
}
}
}

View file

@ -0,0 +1,82 @@
using Server.Items;
namespace Server.Mobiles
{
[TypeAlias("Server.Mobiles.OphidianAvenger")]
public class OphidianKnight : BaseCreature
{
private static string[] m_Names =
{
"an ophidian knight-errant",
"an ophidian avenger"
};
[Constructible]
public OphidianKnight() : base(AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4)
{
Name = m_Names[Utility.Random(m_Names.Length)];
Body = 86;
BaseSoundID = 634;
SetStr(417, 595);
SetDex(166, 175);
SetInt(46, 70);
SetHits(266, 342);
SetMana(0);
SetDamage(16, 19);
SetDamageType(ResistanceType.Physical, 100);
SetResistance(ResistanceType.Physical, 35, 40);
SetResistance(ResistanceType.Fire, 30, 40);
SetResistance(ResistanceType.Cold, 35, 45);
SetResistance(ResistanceType.Poison, 90, 100);
SetResistance(ResistanceType.Energy, 35, 45);
SetSkill(SkillName.Poisoning, 60.1, 80.0);
SetSkill(SkillName.MagicResist, 65.1, 80.0);
SetSkill(SkillName.Tactics, 90.1, 100.0);
SetSkill(SkillName.Wrestling, 90.1, 100.0);
Fame = 10000;
Karma = -10000;
VirtualArmor = 40;
PackItem(new LesserPoisonPotion());
}
public OphidianKnight(Serial serial) : base(serial)
{
}
public override string CorpseName => "an ophidian corpse";
public override int Meat => 2;
public override Poison PoisonImmune => Poison.Lethal;
public override Poison HitPoison => Poison.Lethal;
public override int TreasureMapLevel => 3;
public override OppositionGroup OppositionGroup => OppositionGroup.TerathansAndOphidians;
public override void GenerateLoot()
{
AddLoot(LootPack.Rich, 2);
}
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();
}
}
}

View file

@ -0,0 +1,75 @@
namespace Server.Mobiles
{
public class OphidianWarrior : BaseCreature
{
private static string[] m_Names =
{
"an ophidian warrior",
"an ophidian enforcer"
};
[Constructible]
public OphidianWarrior() : base(AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4)
{
Name = m_Names[Utility.Random(m_Names.Length)];
Body = 86;
BaseSoundID = 634;
SetStr(150, 320);
SetDex(94, 190);
SetInt(64, 160);
SetHits(128, 155);
SetMana(0);
SetDamage(5, 11);
SetDamageType(ResistanceType.Physical, 100);
SetResistance(ResistanceType.Physical, 35, 40);
SetResistance(ResistanceType.Fire, 20, 30);
SetResistance(ResistanceType.Cold, 25, 35);
SetResistance(ResistanceType.Poison, 30, 40);
SetResistance(ResistanceType.Energy, 25, 35);
SetSkill(SkillName.MagicResist, 70.1, 85.0);
SetSkill(SkillName.Swords, 60.1, 85.0);
SetSkill(SkillName.Tactics, 75.1, 90.0);
Fame = 4500;
Karma = -4500;
VirtualArmor = 36;
}
public OphidianWarrior(Serial serial) : base(serial)
{
}
public override string CorpseName => "an ophidian corpse";
public override int Meat => 1;
public override int TreasureMapLevel => 1;
public override OppositionGroup OppositionGroup => OppositionGroup.TerathansAndOphidians;
public override void GenerateLoot()
{
AddLoot(LootPack.Meager);
AddLoot(LootPack.Average);
AddLoot(LootPack.Gems);
}
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();
}
}
}

View file

@ -0,0 +1,78 @@
using Server.Items;
namespace Server.Mobiles
{
public class Scorpion : BaseCreature
{
[Constructible]
public Scorpion() : base(AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4)
{
Body = 48;
BaseSoundID = 397;
SetStr(73, 115);
SetDex(76, 95);
SetInt(16, 30);
SetHits(50, 63);
SetMana(0);
SetDamage(5, 10);
SetDamageType(ResistanceType.Physical, 60);
SetDamageType(ResistanceType.Poison, 40);
SetResistance(ResistanceType.Physical, 20, 25);
SetResistance(ResistanceType.Fire, 10, 15);
SetResistance(ResistanceType.Cold, 20, 25);
SetResistance(ResistanceType.Poison, 40, 50);
SetResistance(ResistanceType.Energy, 10, 15);
SetSkill(SkillName.Poisoning, 80.1, 100.0);
SetSkill(SkillName.MagicResist, 30.1, 35.0);
SetSkill(SkillName.Tactics, 60.3, 75.0);
SetSkill(SkillName.Wrestling, 50.3, 65.0);
Fame = 2000;
Karma = -2000;
VirtualArmor = 28;
Tamable = true;
ControlSlots = 1;
MinTameSkill = 47.1;
PackItem(new LesserPoisonPotion());
}
public Scorpion(Serial serial) : base(serial)
{
}
public override string CorpseName => "a scorpion corpse";
public override string DefaultName => "a scorpion";
public override int Meat => 1;
public override FoodType FavoriteFood => FoodType.Meat;
public override PackInstinct PackInstinct => PackInstinct.Arachnid;
public override Poison PoisonImmune => Poison.Greater;
public override Poison HitPoison => 0.8 >= Utility.RandomDouble() ? Poison.Greater : Poison.Deadly;
public override void GenerateLoot()
{
AddLoot(LootPack.Meager);
}
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();
}
}
}

View file

@ -0,0 +1,93 @@
namespace Server.Mobiles
{
public class StoneHarpy : BaseCreature
{
[Constructible]
public StoneHarpy() : base(AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4)
{
Body = 73;
BaseSoundID = 402;
SetStr(296, 320);
SetDex(86, 110);
SetInt(51, 75);
SetHits(178, 192);
SetMana(0);
SetDamage(8, 16);
SetDamageType(ResistanceType.Physical, 75);
SetDamageType(ResistanceType.Poison, 25);
SetResistance(ResistanceType.Physical, 45, 55);
SetResistance(ResistanceType.Fire, 20, 30);
SetResistance(ResistanceType.Cold, 10, 20);
SetResistance(ResistanceType.Poison, 30, 40);
SetResistance(ResistanceType.Energy, 30, 40);
SetSkill(SkillName.MagicResist, 50.1, 65.0);
SetSkill(SkillName.Tactics, 70.1, 100.0);
SetSkill(SkillName.Wrestling, 70.1, 100.0);
Fame = 4500;
Karma = -4500;
VirtualArmor = 50;
}
public StoneHarpy(Serial serial) : base(serial)
{
}
public override string CorpseName => "a stone harpy corpse";
public override string DefaultName => "a stone harpy";
public override int Meat => 1;
public override int Feathers => 50;
public override bool CanFly => true;
public override void GenerateLoot()
{
AddLoot(LootPack.Average, 2);
AddLoot(LootPack.Gems, 2);
}
public override int GetAttackSound()
{
return 916;
}
public override int GetAngerSound()
{
return 916;
}
public override int GetDeathSound()
{
return 917;
}
public override int GetHurtSound()
{
return 919;
}
public override int GetIdleSound()
{
return 918;
}
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();
}
}
}

View file

@ -0,0 +1,105 @@
using Server.Items;
namespace Server.Mobiles
{
public class Wyvern : BaseCreature
{
[Constructible]
public Wyvern() : base(AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4)
{
Body = 62;
BaseSoundID = 362;
SetStr(202, 240);
SetDex(153, 172);
SetInt(51, 90);
SetHits(125, 141);
SetDamage(8, 19);
SetDamageType(ResistanceType.Physical, 50);
SetDamageType(ResistanceType.Poison, 50);
SetResistance(ResistanceType.Physical, 35, 45);
SetResistance(ResistanceType.Fire, 30, 40);
SetResistance(ResistanceType.Cold, 20, 30);
SetResistance(ResistanceType.Poison, 90, 100);
SetResistance(ResistanceType.Energy, 30, 40);
SetSkill(SkillName.Poisoning, 60.1, 80.0);
SetSkill(SkillName.MagicResist, 65.1, 80.0);
SetSkill(SkillName.Tactics, 65.1, 90.0);
SetSkill(SkillName.Wrestling, 65.1, 80.0);
Fame = 4000;
Karma = -4000;
VirtualArmor = 40;
PackItem(new LesserPoisonPotion());
}
public Wyvern(Serial serial) : base(serial)
{
}
public override string CorpseName => "a wyvern corpse";
public override string DefaultName => "a wyvern";
public override bool ReacquireOnMovement => true;
public override Poison PoisonImmune => Poison.Deadly;
public override Poison HitPoison => Poison.Deadly;
public override int TreasureMapLevel => 2;
public override int Meat => 10;
public override int Hides => 20;
public override HideType HideType => HideType.Horned;
public override bool CanFly => true;
public override void GenerateLoot()
{
AddLoot(LootPack.Average);
AddLoot(LootPack.Meager);
AddLoot(LootPack.MedScrolls);
}
public override int GetAttackSound()
{
return 713;
}
public override int GetAngerSound()
{
return 718;
}
public override int GetDeathSound()
{
return 716;
}
public override int GetHurtSound()
{
return 721;
}
public override int GetIdleSound()
{
return 725;
}
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();
}
}
}