using ModernUO.Serialization; using System; using Server.Items; namespace Server.Mobiles { [SerializationGenerator(0, false)] public partial class Leviathan : BaseCreature { [Constructible] public Leviathan(Mobile fisher = null) : base(AIType.AI_Mage) { 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()); PackItem(new Rope { ItemID = 0x14F8 }); PackItem(new Rope { ItemID = 0x14FA }); } public override string CorpseName => "a leviathan corpse"; public Mobile Fisher { get; set; } public override string DefaultName => "a leviathan"; 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) }; private static MonsterAbility[] _abilities = { new LeviathanBreath() }; public override MonsterAbility[] GetMonsterAbilities() => _abilities; public override void GenerateLoot() { AddLoot(LootPack.FilthyRich, 5); } public static void GiveArtifactTo(Mobile m) { var 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 && Utility.Random(100) < 25) { GiveArtifactTo(Fisher); } Fisher = null; } private class LeviathanBreath : FireBreath { public override int PhysicalDamage => 70; public override int ColdDamage => 30; public override int FireDamage => 0; public override int BreathEffectHue => 0x1ED; public override double BreathDamageScalar => 0.05; public override TimeSpan MinTriggerCooldown => TimeSpan.FromSeconds(5.0); public override TimeSpan MaxTriggerCooldown => TimeSpan.FromSeconds(7.5); } } }