context: using Server.Items;
  using Server.Spells;
  using System;
  using System.Linq;
  
  namespace Server.Mobiles
  {
      [CorpseName("a monstrous interred grizzle corpse")]
      public class MonstrousInterredGrizzle : BasePeerless
      {
          private static readonly int[] m_Tiles = new int[]
          {
              -2, 0,
              2, 0,
              2, -2,
              2, 2,
              -2, -2,
              -2, 2,
              0, 2,
              1, 0,
              0, -2
          };
  
          private readonly DateTime m_NextDrop = DateTime.UtcNow;
  
          [Constructable]
          public MonstrousInterredGrizzle()
              : base(AIType.AI_Spellweaving, FightMode.Closest, 10, 1, 0.2, 0.4)
          {
              Name = "a monstrous interred grizzle";
              Body = 0x103;
              BaseSoundID = 589;
  
              SetStr(1198, 1207);
              SetDex(127, 135);
              SetInt(595, 646);
  
              SetHits(50000);
  
              SetDamage(27, 31);
  
              SetDamageType(ResistanceType.Physical, 60);
              SetDamageType(ResistanceType.Fire, 20);
              SetDamageType(ResistanceType.Energy, 20);
  
              SetResistance(ResistanceType.Physical, 48, 52);
              SetResistance(ResistanceType.Fire, 77, 82);
              SetResistance(ResistanceType.Cold, 56, 61);
              SetResistance(ResistanceType.Poison, 32, 40);
              SetResistance(ResistanceType.Energy, 69, 71);
  
              SetSkill(SkillName.Wrestling, 112.6, 116.9);
              SetSkill(SkillName.Tactics, 118.5, 119.2);
              SetSkill(SkillName.MagicResist, 120);
              SetSkill(SkillName.Anatomy, 111.0, 111.7);
              SetSkill(SkillName.Magery, 100.0);
              SetSkill(SkillName.EvalInt, 100);
              SetSkill(SkillName.Meditation, 100);
              SetSkill(SkillName.Spellweaving, 100.0);
  
              Fame = 24000;
              Karma = -24000;
  
              PackResources(8);
              PackTalismans(5);
  
              for (int i = 0; i < Utility.RandomMinMax(1, 6); i++)
              {
                  PackItem(Loot.RandomScroll(0, Loot.ArcanistScrollTypes.Length, SpellbookType.Arcanist));
              }
  
              SetSpecialAbility(SpecialAbility.HowlOfCacophony);
          }
  
          public MonstrousInterredGrizzle(Serial serial)
              : base(serial)
          {
          }
  
          public override bool GivesMLMinorArtifact => true;
          public override int TreasureMapLevel => 5;
  
          public override void GenerateLoot()
          {
              AddLoot(LootPack.SuperBoss, 8);
          }
  
          public override void OnDeath(Container c)
          {
              base.OnDeath(c);
  
              c.DropItem(new GrizzledBones());
  
              switch (Utility.Random(4))
              {
                  case 0:
                      c.DropItem(new TombstoneOfTheDamned());
                      break;
                  case 1:
                      c.DropItem(new GlobOfMonstreousInterredGrizzle());
                      break;
                  case 2:
                      c.DropItem(new MonsterousInterredGrizzleMaggots());
                      break;
                  case 3:
                      c.DropItem(new GrizzledSkullCollection());
                      break;
              }
  
              if (Utility.RandomDouble() < 0.6)
                  c.DropItem(new ParrotItem());
  
              if (Utility.RandomDouble() < 0.05)
                  c.DropItem(new GrizzledMareStatuette());
  
              if (Utility.RandomDouble() < 0.05)
              {
                  switch (Utility.Random(5))
                  {
                      case 0:
                          c.DropItem(new GrizzleGauntlets());
                          break;
                      case 1:
                          c.DropItem(new GrizzleGreaves());
                          break;
                      case 2:
                          c.DropItem(new GrizzleHelm());
                          break;
                      case 3:
                          c.DropItem(new GrizzleTunic());
                          break;
                      case 4:
                          c.DropItem(new GrizzleVambraces());
                          break;
                  }
              }
          }
  
          public override int GetDeathSound()
          {
              return 0x57F;
          }
  
          public override int GetAttackSound()
          {
              return 0x580;
          }
  
          public override int GetIdleSound()
          {
              return 0x581;
          }
  
          public override int GetAngerSound()
          {
              return 0x582;
          }
  
          public override int GetHurtSound()
          {
              return 0x583;
          }
  
          public override void Serialize(GenericWriter writer)
          {
              base.Serialize(writer);
  
              writer.Write(0); // version
          }
  
          public override void Deserialize(GenericReader reader)
          {
              base.Deserialize(reader);
  
              int version = reader.ReadInt();
          }
  
          public override void OnDamage(int amount, Mobile from, bool willKill)
          {
              if (Utility.RandomDouble() < 0.06)
                  SpillAcid(null, Utility.RandomMinMax(1, 3));
  
              base.OnDamage(amount, from, willKill);
          }
  
          public override Item NewHarmfulItem()
          {
              return new InfernalOoze(this, Utility.RandomBool());
          }
      }
  
      public class InfernalOoze : Item
      {
          private bool m_Corrosive;
          private readonly int m_Damage;
          private readonly Mobile m_Owner;
          private Timer m_Timer;
  
          private readonly DateTime m_StartTime;
  
          public InfernalOoze(Mobile owner)
              : this(owner, false)
          {
          }
  
          [Constructable]
          public InfernalOoze(Mobile owner, bool corrosive, int damage = 40)
              : base(0x122A)
          {
              Movable = false;
              m_Owner = owner;
              Hue = 0x95;
  
              m_Damage = damage;
  
              m_Corrosive = corrosive;
              m_StartTime = DateTime.UtcNow;
  
              m_Timer = Timer.DelayCall(TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(1), OnTick);
          }
  
          [CommandProperty(AccessLevel.GameMaster)]
          public bool Corrosive
          {
              get { return m_Corrosive; }
              set { m_Corrosive = value; }
          }
  
          private void OnTick()
          {
              if (ItemID == 0x122A && m_StartTime + TimeSpan.FromSeconds(30) < DateTime.UtcNow)
              {
                  ItemID++;
              }
              else if (m_StartTime + TimeSpan.FromSeconds(35) < DateTime.UtcNow)
              {
                  Delete();
                  return;
              }
  
  
gt:             if (m_Owner == null)