context: using System;
  using System.Collections;
  using Server;
  using Server.Gumps;
  using Server.Multis;
  using Server.Network;
  using Server.ContextMenus;
  using Server.Engines.PartySystem;
  
  namespace Server.Items
  {
      [Flipable]
      public class MasterCoinBundle : LockableContainer
      {
          private static int[] m_ItemIDs = new int[]
  		{
  			0x9AB, 0xE40, 0xE41, 0xE7C
  		};
  
          private static int[] m_Hues = new int[]
  		{
  			0x0, 0x455, 0x47E, 0x89F, 0x8A5, 0x8AB, 
  			0x966, 0x96D, 0x972, 0x973, 0x979
  		};
  
          private string m_Name;
  
          [Constructable]
          public MasterCoinBundle(string name, int level)
              : base(Utility.RandomList(m_ItemIDs))
          {
              m_Name = name;
              Name = "an old master's chest";
              Hue = Utility.RandomList(m_Hues);
              Fill(level);
          }
  
          public override void OnSingleClick(Mobile from)
          {
              LabelTo(from, m_Name);
          }
  
          public override void GetProperties(ObjectPropertyList list)
          {
              base.GetProperties(list);
  
              list.Add(m_Name);
          }
  
          private static void GetRandomAOSStats(out int attributeCount, out int min, out int max)
          {
              int rnd = Utility.Random(15);
  
              if (rnd < 1)
              {
                  attributeCount = Utility.RandomMinMax(2, 6);
                  min = 20; max = 70;
              }
              else if (rnd < 3)
              {
                  attributeCount = Utility.RandomMinMax(2, 4);
                  min = 20; max = 50;
              }
              else if (rnd < 6)
              {
                  attributeCount = Utility.RandomMinMax(2, 3);
                  min = 20; max = 40;
              }
              else if (rnd < 10)
              {
                  attributeCount = Utility.RandomMinMax(1, 2);
                  min = 10; max = 30;
              }
              else
              {
                  attributeCount = 1;
                  min = 10; max = 20;
              }
          }
  
          public void Flip()
          {
              switch (ItemID)
              {
                  case 0x9AB: ItemID = 0xE7C; break;
                  case 0xE7C: ItemID = 0x9AB; break;
  
                  case 0xE40: ItemID = 0xE41; break;
                  case 0xE41: ItemID = 0xE40; break;
              }
          }
  
          private void Fill(int level)
          {
              TrapType = TrapType.ExplosionTrap;
              TrapPower = level * 25;
              TrapLevel = level;
              Locked = true;
  
              switch (level)
              {
                  case 1: RequiredSkill = 36; break;
                  case 2: RequiredSkill = 76; break;
                  case 3: RequiredSkill = 84; break;
                  case 4: RequiredSkill = 92; break;
                  case 5: RequiredSkill = 100; break;
              }
  
              LockLevel = RequiredSkill - 10;
              MaxLockLevel = RequiredSkill + 40;
  
              DropItem(new Gold(5000));
  
              DropItem(new MasterCoin(level * 3));
  
              for (int i = 0; i < level; ++i)
                  DropItem(Loot.RandomScroll(0, 63, SpellbookType.Regular));
  
              for (int i = 0; i < level * 2; ++i)
              {
                  Item item;
  
                  if (Core.AOS)
                      item = Loot.RandomArmorOrShieldOrWeaponOrJewelry();
                  else
                      item = Loot.RandomArmorOrShieldOrWeapon();
  
                  if (item is BaseWeapon)
                  {
                      BaseWeapon weapon = (BaseWeapon)item;
  
                      if (Core.AOS)
                      {
                          int attributeCount;
                          int min, max;
  
                          GetRandomAOSStats(out attributeCount, out min, out max);
  
                          BaseRunicTool.ApplyAttributesTo(weapon, attributeCount, min, max);
                      }
                      else
                      {
                          weapon.DamageLevel = (WeaponDamageLevel)Utility.Random(6);
                          weapon.AccuracyLevel = (WeaponAccuracyLevel)Utility.Random(6);
                          weapon.DurabilityLevel = (WeaponDurabilityLevel)Utility.Random(6);
                      }
  
                      DropItem(item);
                  }
                  else if (item is BaseArmor)
                  {
                      BaseArmor armor = (BaseArmor)item;
  
                      if (Core.AOS)
                      {
                          int attributeCount;
                          int min, max;
  
                          GetRandomAOSStats(out attributeCount, out min, out max);
  
                          BaseRunicTool.ApplyAttributesTo(armor, attributeCount, min, max);
                      }
                      else
                      {
                          armor.ProtectionLevel = (ArmorProtectionLevel)Utility.Random(6);
                          armor.Durability = (ArmorDurabilityLevel)Utility.Random(6);
                      }
  
                      DropItem(item);
                  }
                  else if (item is BaseHat)
                  {
                      BaseHat hat = (BaseHat)item;
  
                      if (Core.AOS)
                      {
                          int attributeCount;
                          int min, max;
  
                          GetRandomAOSStats(out attributeCount, out min, out  max);
  
                          BaseRunicTool.ApplyAttributesTo(hat, attributeCount, min, max);
                      }
  
                      DropItem(item);
                  }
                  else if (item is BaseJewel)
                  {
                      int attributeCount;
                      int min, max;
  
                      GetRandomAOSStats(out attributeCount, out min, out max);
  
                      BaseRunicTool.ApplyAttributesTo((BaseJewel)item, attributeCount, min, max);
  
                      DropItem(item);
                  }
              }
  
              for (int i = 0; i < level; i++)
              {
                  Item item = Loot.RandomPossibleReagent();
                  item.Amount = Utility.RandomMinMax(40, 60);
                  DropItem(item);
              }
  
              for (int i = 0; i < level; i++)
              {
  
gt:                 Item item = Loot.RandomGem();