public static void MountHorse(CLRScriptBase script, uint Character, uint Horse)
        {
            if (!isWarhorse.ContainsKey(Character)) isWarhorse.Add(Character, true);

            string cloakResRef;
            switch(script.GetTag(Horse))
            {
                case "abr_cr_an_horse01":
                    cloakResRef = "acr_ooc_horse01";
                    isWarhorse[Character] = true;
                    break;
                case "abr_cr_an_horse02":
                    cloakResRef = "acr_ooc_horse02";
                    isWarhorse[Character] = true;
                    break;
                case "abr_cr_an_horse03":
                    cloakResRef = "acr_ooc_horse03";
                    isWarhorse[Character] = true;
                    break;
                default:
                    cloakResRef = "acr_ooc_horse03";
                    isWarhorse[Character] = true;
                    break;
            }
            
            uint horseCloak = script.CreateItemOnObject(cloakResRef, Character, 1, "", CLRScriptBase.FALSE);
            if (script.GetLocalInt(Horse, ACR_IS_WARHORSE) == 1)
            {
                script.RemoveHenchman(Character, Horse);
                script.SetLocalInt(horseCloak, ACR_IS_WARHORSE, 1);
            }
            script.SetLocalInt(horseCloak, ACR_HORSE_ID, script.GetLocalInt(Horse, ACR_HORSE_ID));
            script.SetLocalInt(horseCloak, ACR_HORSE_HP, script.GetCurrentHitPoints(Horse));

            uint equippedCloak = script.GetItemInSlot(CLRScriptBase.INVENTORY_SLOT_CLOAK, Character);
            
            if (script.GetIsObjectValid(equippedCloak) == CLRScriptBase.TRUE)
            {
                foreach (NWItemProperty prop in script.GetItemPropertiesOnItem(equippedCloak))
                {
                    // copying property duration type prevents us from turning temporary properties into
                    // permanent ones. But because we don't know how long the non-permanent ones have left,
                    // we pretty much have to assign them with the expectation that they immediately expire.
                    script.AddItemProperty(script.GetItemPropertyDurationType(prop), prop, horseCloak, 0.0f);
                }
                script.SetFirstName(horseCloak, script.GetName(equippedCloak) + "(( Horse Appearance ))");
                script.AddItemProperty(CLRScriptBase.DURATION_TYPE_PERMANENT, script.ItemPropertyWeightReduction(CLRScriptBase.IP_CONST_REDUCEDWEIGHT_80_PERCENT), horseCloak, 0.0f);
            }
            script.SetPlotFlag(horseCloak, CLRScriptBase.TRUE);
            script.SetPlotFlag(Horse, CLRScriptBase.FALSE);
            
            script.AssignCommand(Horse, delegate { script.SetIsDestroyable(CLRScriptBase.TRUE, CLRScriptBase.FALSE, CLRScriptBase.FALSE); });
            script.AssignCommand(Horse, delegate { script.DestroyObject(Horse, 0.0f, CLRScriptBase.FALSE); });
            script.AssignCommand(Character, delegate { script.ActionEquipItem(horseCloak, CLRScriptBase.INVENTORY_SLOT_CLOAK); });

            if (!isWarhorse[Character]) script.DelayCommand(6.0f, delegate { RidingHeartbeat(script, Character); });
        }
        public static int NewWand(CLRScriptBase script, int maxValue)
        {
            if (maxValue < 375)
            {
                return 0;
            }
            int wandValue = 0;
            uint scrollSource = OBJECT_INVALID;
            if (maxValue >= 21000)
            {
                switch (Generation.rand.Next(5))
                {
                    case 0:
                        wandNumber++;
                        scrollSource = script.CreateItemOnObject(GenerateScroll.Level4Scrolls[Generation.rand.Next(GenerateScroll.Level4Scrolls.Count)], script.OBJECT_SELF, 1, "soonwand" + wandNumber.ToString(), FALSE);
                        wandValue = 21000;
                        break;
                    case 1:
                        wandNumber++;
                        scrollSource = script.CreateItemOnObject(GenerateScroll.Level3Scrolls[Generation.rand.Next(GenerateScroll.Level3Scrolls.Count)], script.OBJECT_SELF, 1, "soonwand" + wandNumber.ToString(), FALSE);
                        wandValue = 11250;
                        break;
                    case 2:
                        wandNumber++;
                        scrollSource = script.CreateItemOnObject(GenerateScroll.Level2Scrolls[Generation.rand.Next(GenerateScroll.Level2Scrolls.Count)], script.OBJECT_SELF, 1, "soonwand" + wandNumber.ToString(), FALSE);
                        wandValue = 4500;
                        break;
                    case 3:
                        wandNumber++;
                        scrollSource = script.CreateItemOnObject(GenerateScroll.Level1Scrolls[Generation.rand.Next(GenerateScroll.Level1Scrolls.Count)], script.OBJECT_SELF, 1, "soonwand" + wandNumber.ToString(), FALSE);
                        wandValue = 750;
                        break;
                    case 4:
                        wandNumber++;
                        scrollSource = script.CreateItemOnObject(GenerateScroll.Level0Scrolls[Generation.rand.Next(GenerateScroll.Level0Scrolls.Count)], script.OBJECT_SELF, 1, "soonwand" + wandNumber.ToString(), FALSE);
                        wandValue = 375;
                        break;
                }
            }
            else if (maxValue >= 11250)
            {
                switch (Generation.rand.Next(4))
                {
                    case 0:
                        wandNumber++;
                        scrollSource = script.CreateItemOnObject(GenerateScroll.Level3Scrolls[Generation.rand.Next(GenerateScroll.Level3Scrolls.Count)], script.OBJECT_SELF, 1, "soonwand" + wandNumber.ToString(), FALSE);
                        wandValue = 11250;
                        break;
                    case 1:
                        wandNumber++;
                        scrollSource = script.CreateItemOnObject(GenerateScroll.Level2Scrolls[Generation.rand.Next(GenerateScroll.Level2Scrolls.Count)], script.OBJECT_SELF, 1, "soonwand" + wandNumber.ToString(), FALSE);
                        wandValue = 4500;
                        break;
                    case 2:
                        wandNumber++;
                        scrollSource = script.CreateItemOnObject(GenerateScroll.Level1Scrolls[Generation.rand.Next(GenerateScroll.Level1Scrolls.Count)], script.OBJECT_SELF, 1, "soonwand" + wandNumber.ToString(), FALSE);
                        wandValue = 750;
                        break;
                    case 3:
                        wandNumber++;
                        scrollSource = script.CreateItemOnObject(GenerateScroll.Level0Scrolls[Generation.rand.Next(GenerateScroll.Level0Scrolls.Count)], script.OBJECT_SELF, 1, "soonwand" + wandNumber.ToString(), FALSE);
                        wandValue = 375;
                        break;
                }
            }
            else if (maxValue >= 4500)
            {
                switch (Generation.rand.Next(3))
                {
                    case 0:
                        wandNumber++;
                        scrollSource = script.CreateItemOnObject(GenerateScroll.Level2Scrolls[Generation.rand.Next(GenerateScroll.Level2Scrolls.Count)], script.OBJECT_SELF, 1, "soonwand" + wandNumber.ToString(), FALSE);
                        wandValue = 4500;
                        break;
                    case 1:
                        wandNumber++;
                        scrollSource = script.CreateItemOnObject(GenerateScroll.Level1Scrolls[Generation.rand.Next(GenerateScroll.Level1Scrolls.Count)], script.OBJECT_SELF, 1, "soonwand" + wandNumber.ToString(), FALSE);
                        wandValue = 750;
                        break;
                    case 2:
                        wandNumber++;
                        scrollSource = script.CreateItemOnObject(GenerateScroll.Level0Scrolls[Generation.rand.Next(GenerateScroll.Level0Scrolls.Count)], script.OBJECT_SELF, 1, "soonwand" + wandNumber.ToString(), FALSE);
                        wandValue = 375;
                        break;
                }
            }
            else if (maxValue >= 750)
            {
                switch (Generation.rand.Next(2))
                {
                    case 0:
                        wandNumber++;
                        scrollSource = script.CreateItemOnObject(GenerateScroll.Level1Scrolls[Generation.rand.Next(GenerateScroll.Level1Scrolls.Count)], script.OBJECT_SELF, 1, "soonwand" + wandNumber.ToString(), FALSE);
                        wandValue = 750;
                        break;
                    case 1:
                        wandNumber++;
                        scrollSource = script.CreateItemOnObject(GenerateScroll.Level0Scrolls[Generation.rand.Next(GenerateScroll.Level0Scrolls.Count)], script.OBJECT_SELF, 1, "soonwand" + wandNumber.ToString(), FALSE);
                        wandValue = 375;
                        break;
                }
            }
            else if (maxValue >= 375)
            {
                wandNumber++;
                scrollSource = script.CreateItemOnObject(GenerateScroll.Level0Scrolls[Generation.rand.Next(GenerateScroll.Level0Scrolls.Count)], script.OBJECT_SELF, 1, "soonwand" + wandNumber.ToString(), FALSE);
                wandValue = 375;
            }

            uint wandItem = script.CreateItemOnObject(wandResRef, script.OBJECT_SELF, 1, script.GetTag(scrollSource) + wandNumber.ToString(), FALSE);
            script.SetItemCharges(wandItem, 50);
            string wandName = script.GetFirstName(scrollSource);
            wandName.Replace("Scroll", "Wand");
            script.SetFirstName(wandItem, wandName);
            foreach (NWItemProperty prop in script.GetItemPropertiesOnItem(scrollSource))
            {
                if (script.GetItemPropertyType(prop) == ITEM_PROPERTY_CAST_SPELL)
                {
                    script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyCastSpell(script.GetItemPropertySubType(prop), IP_CONST_CASTSPELL_NUMUSES_1_CHARGE_PER_USE), wandItem, 0.0f);
                }
                else if (script.GetItemPropertyType(prop) == ITEM_PROPERTY_USE_LIMITATION_CLASS)
                {
                    script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyLimitUseByClass(script.GetItemPropertySubType(prop)), wandItem, 0.0f);
                }
            }
            script.DestroyObject(scrollSource, 0.0f, FALSE);
            return wandValue;
        }
        public static int NewStaff(CLRScriptBase script, int maxValue)
        {
            #region Check if collections need to be loaded. Load them if so
            if (FireSpells[IP_CONST_CASTSPELL_BURNING_HANDS_2] == 0)
            {
                FireSpells = convertToStaffPrice(FireSpells);
                ColdSpells = convertToStaffPrice(ColdSpells);
                AcidSpells = convertToStaffPrice(AcidSpells);
                ElectricSpells = convertToStaffPrice(ElectricSpells);
                SoundSpells = convertToStaffPrice(SoundSpells);
                PhysicalAttackSpells = convertToStaffPrice(PhysicalAttackSpells);
                ForceSpells = convertToStaffPrice(ForceSpells);
                MoraleSpells = convertToStaffPrice(MoraleSpells);
                AntimoraleSpells = convertToStaffPrice(AntimoraleSpells);
                MindControlSpells = convertToStaffPrice(MindControlSpells);
                PerceptionSpells = convertToStaffPrice(PerceptionSpells);
                PhysicalSpells = convertToStaffPrice(PhysicalSpells);
                MentalSpells = convertToStaffPrice(MentalSpells);
                Transmutations = convertToStaffPrice(Transmutations);
                AntiMagicSpells = convertToStaffPrice(AntiMagicSpells);
                IllusionSpells = convertToStaffPrice(IllusionSpells);
                DeathSpells = convertToStaffPrice(DeathSpells);
                EvilSpells = convertToStaffPrice(EvilSpells);
                GoodSpells = convertToStaffPrice(GoodSpells);
                ProtectionSpells = convertToStaffPrice(ProtectionSpells);
                HealingSpells = convertToStaffPrice(HealingSpells);
                SummonSpells = convertToStaffPrice(SummonSpells);
            }
            #endregion

            Dictionary<int, int> currentAvailableSpells = new Dictionary<int,int>();
            List<string> possibleNames = new List<string>();
            #region Get Starting Collections
            switch (Generation.rand.Next(22))
            {
                case 0:
                    copyDictionary(FireSpells, currentAvailableSpells);
                    copyList(FireNames, possibleNames);
                    break;
                case 1:
                    copyDictionary(ColdSpells, currentAvailableSpells);
                    copyList(ColdNames, possibleNames);
                    break;
                case 2:
                    copyDictionary(AcidSpells, currentAvailableSpells);
                    copyList(AcidNames, possibleNames);
                    break;
                case 3:
                    copyDictionary(ElectricSpells, currentAvailableSpells);
                    copyList(ElectricNames, possibleNames);
                    break;
                case 4:
                    copyDictionary(SoundSpells, currentAvailableSpells);
                    copyList(SoundNames, possibleNames);
                    break;
                case 5:
                    copyDictionary(PhysicalAttackSpells, currentAvailableSpells);
                    copyList(PhysicalAttackNames, possibleNames);
                    break;
                case 6:
                    copyDictionary(ForceSpells, currentAvailableSpells);
                    copyList(ForceNames, possibleNames);
                    break;
                case 7: 
                    copyDictionary(MoraleSpells, currentAvailableSpells);
                    copyList(MoraleNames, possibleNames);
                    break;
                case 8:
                    copyDictionary(AntimoraleSpells, currentAvailableSpells);
                    copyList(AntimoraleNames, possibleNames);
                    break;
                case 9:
                    copyDictionary(MindControlSpells, currentAvailableSpells);
                    copyList(MindControlNames, possibleNames);
                    break;
                case 10:
                    copyDictionary(PerceptionSpells, currentAvailableSpells);
                    copyList(PerceptionNames, possibleNames);
                    break;
                case 11:
                    copyDictionary(PhysicalSpells, currentAvailableSpells);
                    copyList(PhysicalNames, possibleNames);
                    break;
                case 12:
                    copyDictionary(MentalSpells, currentAvailableSpells);
                    copyList(MentalNames, possibleNames);
                    break;
                case 13:
                    copyDictionary(Transmutations, currentAvailableSpells);
                    copyList(TransmutNames, possibleNames);
                    break;
                case 14:
                    copyDictionary(AntiMagicSpells, currentAvailableSpells);
                    copyList(AntiMagicNames, possibleNames);
                    break;
                case 15:
                    copyDictionary(IllusionSpells, currentAvailableSpells);
                    copyList(IllusionNames, possibleNames);
                    break;
                case 16:
                    copyDictionary(DeathSpells, currentAvailableSpells);
                    copyList(DeathNames, possibleNames);
                    break;
                case 17:
                    copyDictionary(EvilSpells, currentAvailableSpells);
                    copyList(EvilNames, possibleNames);
                    break;
                case 18:
                    copyDictionary(GoodSpells, currentAvailableSpells);
                    copyList(GoodNames, possibleNames);
                    break;
                case 19:
                    copyDictionary(ProtectionSpells, currentAvailableSpells);
                    copyList(ProtectionNames, possibleNames);
                    break;
                case 20:
                    copyDictionary(HealingSpells, currentAvailableSpells);
                    copyList(HealingNames, possibleNames);
                    break;
                case 21:
                    copyDictionary(SummonSpells, currentAvailableSpells);
                    copyList(SummonNames, possibleNames);
                    break;
            }
            if (currentAvailableSpells.Count == 0 || possibleNames.Count == 0)
            {
                return 0;
            }
            #endregion

            #region Select Spells from Collections Based on Price
            Dictionary<int, int> SelectedSpells = new Dictionary<int, int>();
            List<int> SelectedPrices = new List<int>();
            int currentCharges = 5;
            int maxSpellValue = maxValue;
            while (true)
            {
                List<int> spellsToRemove = new List<int>();
                foreach (int spell in currentAvailableSpells.Keys)
                {
                    if (((currentAvailableSpells[spell] * 50) / currentCharges) > maxValue ||
                        currentAvailableSpells[spell] > maxSpellValue)
                    {
                        spellsToRemove.Add(spell);
                    }
                }
                foreach (int spell in spellsToRemove)
                {
                    currentAvailableSpells.Remove(spell);
                }
                if (currentAvailableSpells.Count == 0)
                {
                    if(SelectedSpells.Count == 0)
                    {
                        return 0;
                    }
                    else
                    {
                        break;
                    }
                }
                List<int> spellOptions = new List<int>();
                foreach (int key in currentAvailableSpells.Keys)
                {
                    spellOptions.Add(key);
                }
                int spellSelection = spellOptions[Generation.rand.Next(spellOptions.Count)];
                switch (currentCharges)
                {
                    case 1:
                        SelectedSpells.Add(spellSelection, IP_CONST_CASTSPELL_NUMUSES_1_CHARGE_PER_USE);
                        SelectedPrices.Add(currentAvailableSpells[spellSelection] * 50);
                        currentCharges--;
                        break;
                    case 2:
                        SelectedSpells.Add(spellSelection, IP_CONST_CASTSPELL_NUMUSES_2_CHARGES_PER_USE);
                        SelectedPrices.Add(currentAvailableSpells[spellSelection] * 25);
                        maxSpellValue = currentAvailableSpells[spellSelection] - 1;
                        maxValue -= currentAvailableSpells[spellSelection] * 25;
                        currentCharges--;
                        break;
                    case 3:
                        SelectedSpells.Add(spellSelection, IP_CONST_CASTSPELL_NUMUSES_3_CHARGES_PER_USE);
                        SelectedPrices.Add(currentAvailableSpells[spellSelection] * 16);
                        maxSpellValue = currentAvailableSpells[spellSelection] - 1;
                        maxValue -= currentAvailableSpells[spellSelection] * 16;
                        currentCharges--;
                        break;
                    case 4:
                        SelectedSpells.Add(spellSelection, IP_CONST_CASTSPELL_NUMUSES_4_CHARGES_PER_USE);
                        SelectedPrices.Add(currentAvailableSpells[spellSelection] * 12);
                        maxSpellValue = currentAvailableSpells[spellSelection] - 1;
                        maxValue -= currentAvailableSpells[spellSelection] * 12;
                        currentCharges--;
                        break;
                    case 5:
                        SelectedSpells.Add(spellSelection, IP_CONST_CASTSPELL_NUMUSES_5_CHARGES_PER_USE);
                        SelectedPrices.Add(currentAvailableSpells[spellSelection] * 10);
                        maxSpellValue = currentAvailableSpells[spellSelection] - 1;
                        maxValue -= currentAvailableSpells[spellSelection] * 10;
                        currentCharges--;
                        break;
                }
                if (currentCharges == 0)
                {
                    break;
                }
            }
            #endregion

            #region Sum Predicted Values of Properties
            SelectedPrices.Sort();
            int value = SelectedPrices[0];
            if (SelectedPrices.Count > 1)
            {
                value += (SelectedPrices[1] * 3 / 4);
            }
            if (SelectedPrices.Count > 2)
            {
                value += (SelectedPrices[2] / 2);
            }
            if (SelectedPrices.Count > 3)
            {
                value += (SelectedPrices[3] / 2);
            }
            if (SelectedPrices.Count > 4)
            {
                value += (SelectedPrices[4] / 2);
            }
            #endregion

            #region Build the Actual Staff
            uint staff = script.CreateItemOnObject(GenerateWeapon.WeaponResrefs[BASE_ITEM_QUARTERSTAFF], script.OBJECT_SELF, 1, "", FALSE);
            script.SetItemCharges(staff, 50);
            List<int> classRestrictions = new List<int>();
            foreach (KeyValuePair<int, int> Spell in SelectedSpells)
            {
                script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyCastSpell(Spell.Key, Spell.Value), staff, 0.0f);
                if (ALFA.Shared.Modules.InfoStore.IPCastSpells[Spell.Key].Spell.BardLevel >= 0 &&
                    !classRestrictions.Contains(IP_CONST_CLASS_BARD))
                {
                    script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyLimitUseByClass(IP_CONST_CLASS_BARD), staff, 0.0f);
                    classRestrictions.Add(IP_CONST_CLASS_BARD);
                }
                if (ALFA.Shared.Modules.InfoStore.IPCastSpells[Spell.Key].Spell.ClericLevel >= 0 &&
                    !classRestrictions.Contains(IP_CONST_CLASS_CLERIC))
                {
                    script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyLimitUseByClass(IP_CONST_CLASS_CLERIC), staff, 0.0f);
                    script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyLimitUseByClass(IP_CONST_CLASS_FAVORED_SOUL), staff, 0.0f);
                    classRestrictions.Add(IP_CONST_CLASS_CLERIC);
                }
                if (ALFA.Shared.Modules.InfoStore.IPCastSpells[Spell.Key].Spell.DruidLevel >= 0 &&
                    !classRestrictions.Contains(IP_CONST_CLASS_DRUID))
                {
                    script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyLimitUseByClass(IP_CONST_CLASS_DRUID), staff, 0.0f);
                    script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyLimitUseByClass(IP_CONST_CLASS_SPIRIT_SHAMAN), staff, 0.0f);
                    classRestrictions.Add(IP_CONST_CLASS_DRUID);
                }
                if (ALFA.Shared.Modules.InfoStore.IPCastSpells[Spell.Key].Spell.WizardLevel >= 0 &&
                    !classRestrictions.Contains(IP_CONST_CLASS_WIZARD))
                {
                    script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyLimitUseByClass(IP_CONST_CLASS_WIZARD), staff, 0.0f);
                    script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyLimitUseByClass(IP_CONST_CLASS_SORCERER), staff, 0.0f);
                    classRestrictions.Add(IP_CONST_CLASS_WIZARD);
                }
                if (ALFA.Shared.Modules.InfoStore.IPCastSpells[Spell.Key].Spell.PaladinLevel >= 0 &&
                    !classRestrictions.Contains(IP_CONST_CLASS_PALADIN))
                {
                    script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyLimitUseByClass(IP_CONST_CLASS_PALADIN), staff, 0.0f);
                    classRestrictions.Add(IP_CONST_CLASS_PALADIN);
                }
                if (ALFA.Shared.Modules.InfoStore.IPCastSpells[Spell.Key].Spell.RangerLevel >= 0 &&
                    !classRestrictions.Contains(IP_CONST_CLASS_RANGER))
                {
                    script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyLimitUseByClass(IP_CONST_CLASS_RANGER), staff, 0.0f);
                    classRestrictions.Add(IP_CONST_CLASS_RANGER);
                }
            }
            script.SetFirstName(staff, String.Format(possibleNames[Generation.rand.Next(possibleNames.Count)], "Staff"));
            Pricing.CalculatePrice(script, staff);
            #endregion
            return value;
        }
 public static int NewBelt(CLRScriptBase script, int maxValue)
 {
     List<int> selectableAbilities = new List<int>();
     foreach (KeyValuePair<int, int> prop in PrimaryAmuletAbility)
     {
         if (prop.Value <= maxValue)
         {
             selectableAbilities.Add(prop.Key);
         }
     }
     if (selectableAbilities.Count == 0)
     {
         return 0;
     }
     int selectedAbility = selectableAbilities[Generation.rand.Next(selectableAbilities.Count)];
     uint belt = script.CreateItemOnObject("zitem_belt", script.OBJECT_SELF, 1, "", FALSE);
     switch (selectedAbility)
     {
         #region Belt of Shielding
         case ITEM_PROPERTY_AC_BONUS:
             {
                 if (maxValue >= 50000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyACBonus(5), belt, 0.0f);
                     script.SetFirstName(belt, "Belt of Shielding +5");
                     Pricing.CalculatePrice(script, belt);
                     return 50000;
                 }
                 else if (maxValue >= 32000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyACBonus(4), belt, 0.0f);
                     script.SetFirstName(belt, "Belt of Shielding +4");
                     Pricing.CalculatePrice(script, belt);
                     return 32000;
                 }
                 else if (maxValue >= 18000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyACBonus(3), belt, 0.0f);
                     script.SetFirstName(belt, "Belt of Shielding +3");
                     Pricing.CalculatePrice(script, belt);
                     return 18000;
                 }
                 else if (maxValue >= 8000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyACBonus(2), belt, 0.0f);
                     script.SetFirstName(belt, "Belt of Shielding +2");
                     Pricing.CalculatePrice(script, belt);
                     return 8000;
                 }
                 else if (maxValue >= 2000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyACBonus(1), belt, 0.0f);
                     script.SetFirstName(belt, "Belt of Shielding +1");
                     Pricing.CalculatePrice(script, belt);
                     return 2000;
                 }
                 else
                 {
                     return 0;
                 }
             }
         #endregion
         #region Ability Bonus
         case ITEM_PROPERTY_ABILITY_BONUS:
             {
                 int ability = AbilityScores[Generation.rand.Next(AbilityScores.Count)];
                 if (maxValue >= 36000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyAbilityBonus(ability, 6), belt, 0.0f);
                     script.SetFirstName(belt, AbilityScoreNames[ability] + " +6");
                     Pricing.CalculatePrice(script, belt);
                     return 36000;
                 }
                 else if (maxValue >= 25000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyAbilityBonus(ability, 5), belt, 0.0f);
                     script.SetFirstName(belt, AbilityScoreNames[ability] + " +5");
                     Pricing.CalculatePrice(script, belt);
                     return 25000;
                 }
                 else if (maxValue >= 16000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyAbilityBonus(ability, 4), belt, 0.0f);
                     script.SetFirstName(belt, AbilityScoreNames[ability] + " +4");
                     Pricing.CalculatePrice(script, belt);
                     return 16000;
                 }
                 else if (maxValue >= 9000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyAbilityBonus(ability, 3), belt, 0.0f);
                     script.SetFirstName(belt, AbilityScoreNames[ability] + " +3");
                     Pricing.CalculatePrice(script, belt);
                     return 9000;
                 }
                 else if (maxValue >= 4000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyAbilityBonus(ability, 2), belt, 0.0f);
                     script.SetFirstName(belt, AbilityScoreNames[ability] + " +2");
                     Pricing.CalculatePrice(script, belt);
                     return 4000;
                 }
                 else if (maxValue >= 1000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyAbilityBonus(ability, 1), belt, 0.0f);
                     script.SetFirstName(belt, AbilityScoreNames[ability] + " +1");
                     Pricing.CalculatePrice(script, belt);
                     return 1000;
                 }
                 else
                 {
                     return 0;
                 }
             }
         #endregion
         #region Immunities
         case ITEM_PROPERTY_IMMUNITY_MISCELLANEOUS:
             {
                 List<int> possibleImmunities = new List<int>();
                 foreach (KeyValuePair<int, int> immunity in AvailableImmunities)
                 {
                     if (immunity.Value <= maxValue)
                     {
                         possibleImmunities.Add(immunity.Key);
                     }
                 }
                 if (possibleImmunities.Count == 0)
                 {
                     return 0;
                 }
                 int selectedImmunity = possibleImmunities[Generation.rand.Next(possibleImmunities.Count)];
                 script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyImmunityMisc(selectedImmunity), belt, 0.0f);
                 script.SetFirstName(belt, ImmunityNames[selectedImmunity]);
                 Pricing.CalculatePrice(script, belt);
                 return AvailableImmunities[selectedImmunity];
             }
         #endregion
         #region Skill Bonuses
         case ITEM_PROPERTY_SKILL_BONUS:
             {
                 int skillBonus = AvailableSkills[Generation.rand.Next(AvailableSkills.Count)];
                 script.SetFirstName(belt, SkillNames[skillBonus]);
                 if (maxValue >= 10000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertySkillBonus(skillBonus, 10), belt, 0.0f);
                     script.SetFirstName(belt, script.GetName(belt) + " +10");
                     Pricing.CalculatePrice(script, belt);
                     return 10000;
                 }
                 else if (maxValue >= 8100)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertySkillBonus(skillBonus, 9), belt, 0.0f);
                     script.SetFirstName(belt, script.GetName(belt) + " +9");
                     Pricing.CalculatePrice(script, belt);
                     return 8100;
                 }
                 else if (maxValue >= 6400)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertySkillBonus(skillBonus, 8), belt, 0.0f);
                     script.SetFirstName(belt, script.GetName(belt) + " +8");
                     Pricing.CalculatePrice(script, belt);
                     return 6400;
                 }
                 else if (maxValue >= 4900)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertySkillBonus(skillBonus, 7), belt, 0.0f);
                     script.SetFirstName(belt, script.GetName(belt) + " +7");
                     Pricing.CalculatePrice(script, belt);
                     return 4900;
                 }
                 else if (maxValue >= 3600)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertySkillBonus(skillBonus, 6), belt, 0.0f);
                     script.SetFirstName(belt, script.GetName(belt) + " +6");
                     Pricing.CalculatePrice(script, belt);
                     return 3600;
                 }
                 else if (maxValue >= 2500)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertySkillBonus(skillBonus, 5), belt, 0.0f);
                     script.SetFirstName(belt, script.GetName(belt) + " +5");
                     Pricing.CalculatePrice(script, belt);
                     return 2500;
                 }
                 else if (maxValue >= 1600)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertySkillBonus(skillBonus, 4), belt, 0.0f);
                     script.SetFirstName(belt, script.GetName(belt) + " +4");
                     Pricing.CalculatePrice(script, belt);
                     return 1600;
                 }
                 else if (maxValue >= 900)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertySkillBonus(skillBonus, 3), belt, 0.0f);
                     script.SetFirstName(belt, script.GetName(belt) + " +3");
                     Pricing.CalculatePrice(script, belt);
                     return 900;
                 }
                 else if (maxValue >= 400)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertySkillBonus(skillBonus, 2), belt, 0.0f);
                     script.SetFirstName(belt, script.GetName(belt) + " +2");
                     Pricing.CalculatePrice(script, belt);
                     return 400;
                 }
                 else if (maxValue >= 100)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertySkillBonus(skillBonus, 1), belt, 0.0f);
                     script.SetFirstName(belt, script.GetName(belt) + " +1");
                     Pricing.CalculatePrice(script, belt);
                     return 100;
                 }
                 break;
             }
         #endregion
     }
     script.DestroyObject(belt, 0.0f, FALSE);
     return 0;
 }
        public static int NewRod(CLRScriptBase script, int maxValue)
        {
            #region Check if collections need to be loaded. Load them if so
            if (FireSpells.Count == 0)
            {
                convertToRodPrice(GenerateStaff.FireSpells, FireSpells);
                convertToRodPrice(GenerateStaff.ColdSpells, ColdSpells);
                convertToRodPrice(GenerateStaff.AcidSpells, AcidSpells);
                convertToRodPrice(GenerateStaff.ElectricSpells, ElectricSpells);
                convertToRodPrice(GenerateStaff.SoundSpells, SoundSpells);
                convertToRodPrice(GenerateStaff.PhysicalAttackSpells, PhysicalAttackSpells);
                convertToRodPrice(GenerateStaff.ForceSpells, ForceSpells);
                convertToRodPrice(GenerateStaff.MoraleSpells, MoraleSpells);
                convertToRodPrice(GenerateStaff.AntimoraleSpells, AntimoraleSpells);
                convertToRodPrice(GenerateStaff.MindControlSpells, MindControlSpells);
                convertToRodPrice(GenerateStaff.PerceptionSpells, PerceptionSpells);
                convertToRodPrice(GenerateStaff.PhysicalSpells, PhysicalSpells);
                convertToRodPrice(GenerateStaff.MentalSpells, MentalSpells);
                convertToRodPrice(GenerateStaff.Transmutations, Transmutations);
                convertToRodPrice(GenerateStaff.AntiMagicSpells, AntiMagicSpells);
                convertToRodPrice(GenerateStaff.IllusionSpells, IllusionSpells);
                convertToRodPrice(GenerateStaff.DeathSpells, DeathSpells);
                convertToRodPrice(GenerateStaff.EvilSpells, EvilSpells);
                convertToRodPrice(GenerateStaff.GoodSpells, GoodSpells);
                convertToRodPrice(GenerateStaff.ProtectionSpells, ProtectionSpells);
                convertToRodPrice(GenerateStaff.HealingSpells, HealingSpells);
                convertToRodPrice(GenerateStaff.SummonSpells, SummonSpells);
            }
            #endregion

            Dictionary<int, int> currentAvailableSpells = new Dictionary<int,int>();
            List<string> possibleNames = new List<string>();
            #region Get Starting Collections
            switch (Generation.rand.Next(22))
            {
                case 0:
                    GenerateStaff.copyDictionary(FireSpells, currentAvailableSpells);
                    GenerateStaff.copyList(GenerateStaff.FireNames, possibleNames);
                    break;
                case 1:
                    GenerateStaff.copyDictionary(ColdSpells, currentAvailableSpells);
                    GenerateStaff.copyList(GenerateStaff.ColdNames, possibleNames);
                    break;
                case 2:
                    GenerateStaff.copyDictionary(AcidSpells, currentAvailableSpells);
                    GenerateStaff.copyList(GenerateStaff.AcidNames, possibleNames);
                    break;
                case 3:
                    GenerateStaff.copyDictionary(ElectricSpells, currentAvailableSpells);
                    GenerateStaff.copyList(GenerateStaff.ElectricNames, possibleNames);
                    break;
                case 4:
                    GenerateStaff.copyDictionary(SoundSpells, currentAvailableSpells);
                    GenerateStaff.copyList(GenerateStaff.SoundNames, possibleNames);
                    break;
                case 5:
                    GenerateStaff.copyDictionary(PhysicalAttackSpells, currentAvailableSpells);
                    GenerateStaff.copyList(GenerateStaff.PhysicalAttackNames, possibleNames);
                    break;
                case 6:
                    GenerateStaff.copyDictionary(ForceSpells, currentAvailableSpells);
                    GenerateStaff.copyList(GenerateStaff.ForceNames, possibleNames);
                    break;
                case 7: 
                    GenerateStaff.copyDictionary(MoraleSpells, currentAvailableSpells);
                    GenerateStaff.copyList(GenerateStaff.MoraleNames, possibleNames);
                    break;
                case 8:
                    GenerateStaff.copyDictionary(AntimoraleSpells, currentAvailableSpells);
                    GenerateStaff.copyList(GenerateStaff.AntimoraleNames, possibleNames);
                    break;
                case 9:
                    GenerateStaff.copyDictionary(MindControlSpells, currentAvailableSpells);
                    GenerateStaff.copyList(GenerateStaff.MindControlNames, possibleNames);
                    break;
                case 10:
                    GenerateStaff.copyDictionary(PerceptionSpells, currentAvailableSpells);
                    GenerateStaff.copyList(GenerateStaff.PerceptionNames, possibleNames);
                    break;
                case 11:
                    GenerateStaff.copyDictionary(PhysicalSpells, currentAvailableSpells);
                    GenerateStaff.copyList(GenerateStaff.PhysicalNames, possibleNames);
                    break;
                case 12:
                    GenerateStaff.copyDictionary(MentalSpells, currentAvailableSpells);
                    GenerateStaff.copyList(GenerateStaff.MentalNames, possibleNames);
                    break;
                case 13:
                    GenerateStaff.copyDictionary(Transmutations, currentAvailableSpells);
                    GenerateStaff.copyList(GenerateStaff.TransmutNames, possibleNames);
                    break;
                case 14:
                    GenerateStaff.copyDictionary(AntiMagicSpells, currentAvailableSpells);
                    GenerateStaff.copyList(GenerateStaff.AntiMagicNames, possibleNames);
                    break;
                case 15:
                    GenerateStaff.copyDictionary(IllusionSpells, currentAvailableSpells);
                    GenerateStaff.copyList(GenerateStaff.IllusionNames, possibleNames);
                    break;
                case 16:
                    GenerateStaff.copyDictionary(DeathSpells, currentAvailableSpells);
                    GenerateStaff.copyList(GenerateStaff.DeathNames, possibleNames);
                    break;
                case 17:
                    GenerateStaff.copyDictionary(EvilSpells, currentAvailableSpells);
                    GenerateStaff.copyList(GenerateStaff.EvilNames, possibleNames);
                    break;
                case 18:
                    GenerateStaff.copyDictionary(GoodSpells, currentAvailableSpells);
                    GenerateStaff.copyList(GenerateStaff.GoodNames, possibleNames);
                    break;
                case 19:
                    GenerateStaff.copyDictionary(ProtectionSpells, currentAvailableSpells);
                    GenerateStaff.copyList(GenerateStaff.ProtectionNames, possibleNames);
                    break;
                case 20:
                    GenerateStaff.copyDictionary(HealingSpells, currentAvailableSpells);
                    GenerateStaff.copyList(GenerateStaff.HealingNames, possibleNames);
                    break;
                case 21:
                    GenerateStaff.copyDictionary(SummonSpells, currentAvailableSpells);
                    GenerateStaff.copyList(GenerateStaff.SummonNames, possibleNames);
                    break;
            }
            if (currentAvailableSpells.Count == 0 || possibleNames.Count == 0)
            {
                return 0;
            }
            #endregion

            #region Select Spells from Collections Based on Price
            Dictionary<int, int> SelectedSpells = new Dictionary<int, int>();
            List<int> SelectedPrices = new List<int>();
            int currentCharges = 5;
            int maxSpellValue = maxValue;
            while (true)
            {
                List<int> spellsToRemove = new List<int>();
                foreach (int spell in currentAvailableSpells.Keys)
                {
                    if (((currentAvailableSpells[spell] * 50) / currentCharges) > maxValue ||
                        currentAvailableSpells[spell] > maxSpellValue)
                    {
                        spellsToRemove.Add(spell);
                    }
                }
                foreach (int spell in spellsToRemove)
                {
                    currentAvailableSpells.Remove(spell);
                }
                if (currentAvailableSpells.Count == 0)
                {
                    if(SelectedSpells.Count == 0)
                    {
                        return 0;
                    }
                    else
                    {
                        break;
                    }
                }
                List<int> spellOptions = new List<int>();
                foreach (int key in currentAvailableSpells.Keys)
                {
                    spellOptions.Add(key);
                }
                int spellSelection = spellOptions[Generation.rand.Next(spellOptions.Count)];
                switch (currentCharges)
                {
                    case 1:
                        SelectedSpells.Add(spellSelection, IP_CONST_CASTSPELL_NUMUSES_1_CHARGE_PER_USE);
                        SelectedPrices.Add(currentAvailableSpells[spellSelection] * 50);
                        currentCharges--;
                        break;
                    case 2:
                        SelectedSpells.Add(spellSelection, IP_CONST_CASTSPELL_NUMUSES_2_CHARGES_PER_USE);
                        SelectedPrices.Add(currentAvailableSpells[spellSelection] * 25);
                        maxSpellValue = currentAvailableSpells[spellSelection] - 1;
                        maxValue -= currentAvailableSpells[spellSelection] * 25;
                        currentCharges--;
                        break;
                    case 3:
                        SelectedSpells.Add(spellSelection, IP_CONST_CASTSPELL_NUMUSES_3_CHARGES_PER_USE);
                        SelectedPrices.Add(currentAvailableSpells[spellSelection] * 16);
                        maxSpellValue = currentAvailableSpells[spellSelection] - 1;
                        maxValue -= currentAvailableSpells[spellSelection] * 16;
                        currentCharges--;
                        break;
                    case 4:
                        SelectedSpells.Add(spellSelection, IP_CONST_CASTSPELL_NUMUSES_4_CHARGES_PER_USE);
                        SelectedPrices.Add(currentAvailableSpells[spellSelection] * 12);
                        maxSpellValue = currentAvailableSpells[spellSelection] - 1;
                        maxValue -= currentAvailableSpells[spellSelection] * 12;
                        currentCharges--;
                        break;
                    case 5:
                        SelectedSpells.Add(spellSelection, IP_CONST_CASTSPELL_NUMUSES_5_CHARGES_PER_USE);
                        SelectedPrices.Add(currentAvailableSpells[spellSelection] * 10);
                        maxSpellValue = currentAvailableSpells[spellSelection] - 1;
                        maxValue -= currentAvailableSpells[spellSelection] * 10;
                        currentCharges--;
                        break;
                }
                if (currentCharges == 0)
                {
                    break;
                }
            }
            #endregion

            #region Sum Predicted Values of Properties
            SelectedPrices.Sort();
            int value = SelectedPrices[0];
            if (SelectedPrices.Count > 1)
            {
                value += (SelectedPrices[1] * 3 / 4);
            }
            if (SelectedPrices.Count > 2)
            {
                value += (SelectedPrices[2] / 2);
            }
            if (SelectedPrices.Count > 3)
            {
                value += (SelectedPrices[3] / 2);
            }
            if (SelectedPrices.Count > 4)
            {
                value += (SelectedPrices[4] / 2);
            }
            #endregion

            #region Build the Actual Staff
            uint staff = script.CreateItemOnObject(GenerateWeapon.WeaponResrefs[BASE_ITEM_LIGHTMACE], script.OBJECT_SELF, 1, "", FALSE);
            script.SetItemCharges(staff, 50);
            foreach (KeyValuePair<int, int> Spell in SelectedSpells)
            {
                script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyCastSpell(Spell.Key, Spell.Value), staff, 0.0f);
            }
            script.SetFirstName(staff, String.Format(possibleNames[Generation.rand.Next(possibleNames.Count)], "Rod"));
            Pricing.CalculatePrice(script, staff);
            #endregion
            return value;
        }
        private static int GetArmorPrice(CLRScriptBase script, uint target)
        {
            #region Initialize commonly-used variables
            int rulesType = script.GetArmorRulesType(target);
            int value = ArmorRulesTypeValues[rulesType];
            int itemType = script.GetBaseItemType(target);
            int enchantmentPenalty = 0;
            int specialMat = script.GetItemBaseMaterialType(target);
            #endregion

            #region Load item properties into the price calculation collection
            List<PricedItemProperty> itProps = new List<PricedItemProperty>();
            foreach (NWItemProperty prop in script.GetItemPropertiesOnItem(target))
            {
                if (script.GetItemPropertyDurationType(prop) == DURATION_TYPE_PERMANENT)
                {
                    itProps.Add(new PricedItemProperty() { Property = prop, Price = 0 });
                }
            }
            #endregion

            #region Check for Mundane Items
            if (itProps.Count == 0 &&
                (specialMat == GMATERIAL_METAL_IRON || specialMat == GMATERIAL_NONSPECIFIC))
            {
                // No item properties. This is just worth the base item.
                return value;
            }
            #endregion

            #region Check for Rules Type Mismatches
            if (rulesType == ARMOR_RULES_TYPE_SHIELD_HEAVY ||
                rulesType == ARMOR_RULES_TYPE_SHIELD_HEAVY_DARKWOOD ||
                rulesType == ARMOR_RULES_TYPE_SHIELD_HEAVY_MASTERWORK ||
                rulesType == ARMOR_RULES_TYPE_SHIELD_HEAVY_DRAGON ||
                rulesType == ARMOR_RULES_TYPE_SHIELD_HEAVY_MITHRAL)
            {
                if (itemType != BASE_ITEM_LARGESHIELD)
                {
                    return -1;
                }
            }
            else if (rulesType == ARMOR_RULES_TYPE_SHIELD_LIGHT ||
                rulesType == ARMOR_RULES_TYPE_SHIELD_LIGHT_DARKWOOD ||
                rulesType == ARMOR_RULES_TYPE_SHIELD_LIGHT_MASTERWORK ||
                rulesType == ARMOR_RULES_TYPE_SHIELD_LIGHT_DRAGON ||
                rulesType == ARMOR_RULES_TYPE_SHIELD_LIGHT_MITHRAL)
            {
                if (itemType != BASE_ITEM_SMALLSHIELD)
                {
                    return -1;
                }
            }
            else if (rulesType == ARMOR_RULES_TYPE_SHIELD_TOWER ||
                rulesType == ARMOR_RULES_TYPE_SHIELD_TOWER_DARKWOOD ||
                rulesType == ARMOR_RULES_TYPE_SHIELD_TOWER_MASTERWORK ||
                rulesType == ARMOR_RULES_TYPE_SHIELD_TOWER_DRAGON ||
                rulesType == ARMOR_RULES_TYPE_SHIELD_TOWER_MITHRAL)
            {
                if (itemType != BASE_ITEM_TOWERSHIELD)
                {
                    return -1;
                }
            }
            else
            {
                if (itemType != BASE_ITEM_ARMOR)
                {
                    return -1;
                }
            }
            #endregion

            #region Correct Armor Rules Types and Properties for Materials
            switch (specialMat)
            {
                #region Adamantine
                case GMATERIAL_METAL_ADAMANTINE:
                    {
                        int damageReduction = 1;
                        switch (rulesType)
                        {
                            case ARMOR_RULES_TYPE_BANDED:
                            case ARMOR_RULES_TYPE_BANDED_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_BANDED_MITHRAL:
                            case ARMOR_RULES_TYPE_BANDED_LIVING:
                            case ARMOR_RULES_TYPE_BANDED_DRAGON:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_BANDED_MASTERWORK);
                                    value = 15000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_BANDED];
                                    damageReduction = 3;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_BANDED_MASTERWORK:
                                {
                                    value = 15000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_BANDED];
                                    damageReduction = 3;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_BREASTPLATE:
                            case ARMOR_RULES_TYPE_BREASTPLATE_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_BREASTPLATE_MITHRAL:
                            case ARMOR_RULES_TYPE_BREASTPLATE_LIVING:
                            case ARMOR_RULES_TYPE_BREASTPLATE_DUSKWOOD:
                            case ARMOR_RULES_TYPE_BREASTPLATE_DRAGON:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_BREASTPLATE_MASTERWORK);
                                    value = 10000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_BREASTPLATE];
                                    damageReduction = 2;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_BREASTPLATE_MASTERWORK:
                                {
                                    value = 10000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_BREASTPLATE];
                                    damageReduction = 2;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_CHAIN_SHIRT:
                            case ARMOR_RULES_TYPE_CHAIN_SHIRT_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_CHAIN_SHIRT_MITHRAL:
                            case ARMOR_RULES_TYPE_CHAIN_SHIRT_LIVING:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_CHAIN_SHIRT_MASTERWORK);
                                    value = 5000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_CHAIN_SHIRT];
                                    damageReduction = 1;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_CHAIN_SHIRT_MASTERWORK:
                                {
                                    value = 5000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_CHAIN_SHIRT];
                                    damageReduction = 1;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_CHAINMAIL:
                            case ARMOR_RULES_TYPE_CHAINMAIL_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_CHAINMAIL_MITHRAL:
                            case ARMOR_RULES_TYPE_CHAINMAIL_LIVING:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_CHAINMAIL_MASTERWORK);
                                    value = 10000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_CHAINMAIL];
                                    damageReduction = 2;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_CHAINMAIL_MASTERWORK:
                                {
                                    value = 10000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_CHAINMAIL];
                                    damageReduction = 2;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_FULL_PLATE:
                            case ARMOR_RULES_TYPE_FULL_PLATE_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_FULL_PLATE_MITHRAL:
                            case ARMOR_RULES_TYPE_FULL_PLATE_LIVING:
                            case ARMOR_RULES_TYPE_FULL_PLATE_DRAGON:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_FULL_PLATE_MASTERWORK);
                                    value = 15000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_FULL_PLATE];
                                    damageReduction = 3;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_FULL_PLATE_MASTERWORK:
                                {
                                    value = 15000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_FULL_PLATE];
                                    damageReduction = 3;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_HALF_PLATE:
                            case ARMOR_RULES_TYPE_HALF_PLATE_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_HALF_PLATE_MITHRAL:
                            case ARMOR_RULES_TYPE_HALF_PLATE_LIVING:
                            case ARMOR_RULES_TYPE_HALF_PLATE_DRAGON:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_HALF_PLATE_MASTERWORK);
                                    value = 15000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_HALF_PLATE];
                                    damageReduction = 3;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_HALF_PLATE_MASTERWORK:
                                {
                                    value = 15000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_HALF_PLATE];
                                    damageReduction = 3;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SCALE:
                            case ARMOR_RULES_TYPE_SCALE_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_SCALE_MITHRAL:
                            case ARMOR_RULES_TYPE_SCALE_LIVING:
                            case ARMOR_RULES_TYPE_SCALE_DRAGON:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_SCALE_MASTERWORK);
                                    value = 10000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_SCALE];
                                    damageReduction = 2;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SCALE_MASTERWORK:
                                {
                                    value = 10000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_SCALE];
                                    damageReduction = 2;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SHIELD_HEAVY:
                            case ARMOR_RULES_TYPE_SHIELD_HEAVY_DARKWOOD:
                            case ARMOR_RULES_TYPE_SHIELD_HEAVY_MITHRAL:
                            case ARMOR_RULES_TYPE_SHIELD_HEAVY_DRAGON:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_SHIELD_HEAVY_MASTERWORK);
                                    value = 5000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_SHIELD_HEAVY];
                                    damageReduction = 1;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SHIELD_HEAVY_MASTERWORK:
                                {
                                    value = 5000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_SHIELD_HEAVY];
                                    damageReduction = 1;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SHIELD_LIGHT:
                            case ARMOR_RULES_TYPE_SHIELD_LIGHT_DARKWOOD:
                            case ARMOR_RULES_TYPE_SHIELD_LIGHT_MITHRAL:
                            case ARMOR_RULES_TYPE_SHIELD_LIGHT_DRAGON:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_SHIELD_LIGHT_MASTERWORK);
                                    value = 5000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_SHIELD_LIGHT];
                                    damageReduction = 1;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SHIELD_LIGHT_MASTERWORK:
                                {
                                    value = 5000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_SHIELD_LIGHT];
                                    damageReduction = 1;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SHIELD_TOWER:
                            case ARMOR_RULES_TYPE_SHIELD_TOWER_DARKWOOD:
                            case ARMOR_RULES_TYPE_SHIELD_TOWER_MITHRAL:
                            case ARMOR_RULES_TYPE_SHIELD_TOWER_DRAGON:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_SHIELD_TOWER_MASTERWORK);
                                    value = 5000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_SHIELD_TOWER];
                                    damageReduction = 1;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SHIELD_TOWER_MASTERWORK:
                                {
                                    value = 5000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_SHIELD_TOWER];
                                    damageReduction = 1;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SPLINT:
                            case ARMOR_RULES_TYPE_SPLINT_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_SPLINT_MITHREAL:
                            case ARMOR_RULES_TYPE_SPLINT_LIVING:
                            case ARMOR_RULES_TYPE_SPLINT_DRAGON:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_SPLINT_MASTERWORK);
                                    value = 15000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_SPLINT];
                                    damageReduction = 1;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SPLINT_MASTERWORK:
                                {
                                    value = 15000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_SPLINT];
                                    damageReduction = 1;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_CLOTH:
                            case ARMOR_RULES_TYPE_HIDE:
                            case ARMOR_RULES_TYPE_HIDE_MASTERWORK:
                            case ARMOR_RULES_TYPE_LEATHER:
                            case ARMOR_RULES_TYPE_LEATHER_MASTERWORK:
                            case ARMOR_RULES_TYPE_PADDED:
                            case ARMOR_RULES_TYPE_PADDED_MASTERWORK:
                            case ARMOR_RULES_TYPE_STUDDED_LEATHER:
                            case ARMOR_RULES_TYPE_STUDDED_LEATHER_MASTERWORK:
                            case ARMOR_RULES_TYPE_PADDED_DRAGON:
                            case ARMOR_RULES_TYPE_LEATHER_DRAGON:
                            case ARMOR_RULES_TYPE_HIDE_DRAGON:
                            case ARMOR_RULES_TYPE_LEATHER_STUDDED_DRAGON:
                                {
                                    return -1;
                                }
                        }
                        script.StoreCampaignObject(ItemChangeDBName, PriceChangeVarName, target, script.OBJECT_SELF);
                        if (ALFA.Shared.Modules.InfoStore.ModifiedGff.Keys.Contains(PriceChangeVarName))
                        {
                            int dmgRedctMembers = ALFA.Shared.Modules.InfoStore.ModifiedGff[PriceChangeVarName].TopLevelStruct["DmgReduction"].ValueList.StructList.Count;
                            GFFShortField DmgRedctFlags = new GFFShortField();
                            GFFShortField DmgRedctAmt = new GFFShortField();
                            GFFShortField DmgRedctType = new GFFShortField();
                            GFFShortField DmgRedctSubType = new GFFShortField();
                            DmgRedctFlags.ValueInt = 0;
                            DmgRedctFlags.StringLabel = "DmgRedctFlags";
                            DmgRedctAmt.ValueInt = damageReduction;
                            DmgRedctAmt.StringLabel = "DmgRedctAmt";
                            DmgRedctType.ValueInt = 0;
                            DmgRedctType.StringLabel = "DmgRedctType";
                            DmgRedctSubType.ValueInt = 0;
                            DmgRedctSubType.StringLabel = "DmgRedctSubType";

                            GFFStruct dmgRedct = new GFFStruct();
                            dmgRedct.StructType = 2;

                            dmgRedct.Fields.Add("DmgRedctFlags", DmgRedctFlags);
                            dmgRedct.Fields.Add("DmgRedctAmt", DmgRedctAmt);
                            GFFListField dmgRedctTypeList = new GFFListField();
                            GFFList dmgRedctType = new GFFList();
                            GFFStruct dmgRedctTypeStruct = new GFFStruct();
                            dmgRedctTypeStruct.StructType = 2;
                            dmgRedctType.StructList.Add(dmgRedctTypeStruct);
                            dmgRedctType[0].Fields.Add("DmgRedctType", DmgRedctType);
                            dmgRedctType[0].Fields.Add("DmgRedctSubType", DmgRedctSubType);
                            dmgRedctTypeList.ValueList = dmgRedctType;
                            dmgRedctTypeList.StringLabel = "DmgRedctSubList";
                            dmgRedct.Fields.Add("DmgRedctSubList", dmgRedctTypeList);

                            if (dmgRedctMembers == 0)
                            {
                                ALFA.Shared.Modules.InfoStore.ModifiedGff[PriceChangeVarName].TopLevelStruct["DmgReduction"].ValueList.StructList.Add(dmgRedct);
                                script.DestroyObject(target, 0.0f, FALSE);
                                target = script.RetrieveCampaignObject(ItemChangeDBName, PriceChangeVarName, script.GetLocation(script.OBJECT_SELF), script.OBJECT_SELF, script.OBJECT_SELF);
                                if (script.GetObjectType(script.OBJECT_SELF) != OBJECT_TYPE_PLACEABLE)
                                {
                                    script.DelayCommand(0.5f, delegate()
                                    {
                                        script.CopyItem(target, script.OBJECT_SELF, TRUE);
                                    });
                                }
                            }
                            else
                            {
                                if (dmgRedctMembers > 1)
                                {
                                    for (int count = 1; count < dmgRedctMembers; count++)
                                    {
                                        ALFA.Shared.Modules.InfoStore.ModifiedGff[PriceChangeVarName].TopLevelStruct["DmgReduction"].ValueList.StructList.Remove(count);
                                    }
                                }
                                if (ALFA.Shared.Modules.InfoStore.ModifiedGff[PriceChangeVarName].TopLevelStruct["DmgReduction"].ValueList[0]["DmgRedctAmt"].ValueInt != damageReduction)
                                {
                                    ALFA.Shared.Modules.InfoStore.ModifiedGff[PriceChangeVarName].TopLevelStruct["DmgReduction"].ValueList[0] = dmgRedct;
                                    script.DestroyObject(target, 0.0f, FALSE);
                                    target = script.RetrieveCampaignObject(ItemChangeDBName, PriceChangeVarName, script.GetLocation(script.OBJECT_SELF), script.OBJECT_SELF, script.OBJECT_SELF);
                                    if (script.GetObjectType(script.OBJECT_SELF) != OBJECT_TYPE_PLACEABLE)
                                    {
                                        script.DelayCommand(0.5f, delegate()
                                        {
                                            script.CopyItem(target, script.OBJECT_SELF, TRUE);
                                        });
                                    }
                                }
                            }
                        }
                        List<PricedItemProperty> removingProps = new List<PricedItemProperty>();
                        foreach (PricedItemProperty prop in itProps)
                        {
                            if (script.GetItemPropertyType(prop.Property) == ITEM_PROPERTY_DAMAGE_REDUCTION)
                            {
                                script.RemoveItemProperty(target, prop.Property);
                                removingProps.Add(prop);
                            }
                        }
                        foreach (PricedItemProperty prop in removingProps)
                        {
                            itProps.Remove(prop);
                        }
                        break;
                    }
                #endregion
                #region Arandur
                case GMATERIAL_ARANDUR:
                    {
                        int resistQuantity = IP_CONST_DAMAGERESIST_2;
                        switch (rulesType)
                        {
                            case ARMOR_RULES_TYPE_BANDED:
                            case ARMOR_RULES_TYPE_BANDED_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_BANDED_MITHRAL:
                            case ARMOR_RULES_TYPE_BANDED_LIVING:
                            case ARMOR_RULES_TYPE_BANDED_DRAGON:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_BANDED_MASTERWORK);
                                    value = 5000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_BANDED];
                                    resistQuantity = IP_CONST_DAMAGERESIST_6;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_BANDED_MASTERWORK:
                                {
                                    value = 5000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_BANDED];
                                    resistQuantity = IP_CONST_DAMAGERESIST_6;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_BREASTPLATE:
                            case ARMOR_RULES_TYPE_BREASTPLATE_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_BREASTPLATE_MITHRAL:
                            case ARMOR_RULES_TYPE_BREASTPLATE_LIVING:
                            case ARMOR_RULES_TYPE_BREASTPLATE_DUSKWOOD:
                            case ARMOR_RULES_TYPE_BREASTPLATE_DRAGON:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_BREASTPLATE_MASTERWORK);
                                    value = 3000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_BREASTPLATE];
                                    resistQuantity = IP_CONST_DAMAGERESIST_4;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_BREASTPLATE_MASTERWORK:
                                {
                                    value = 3000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_BREASTPLATE];
                                    resistQuantity = IP_CONST_DAMAGERESIST_4;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_CHAIN_SHIRT:
                            case ARMOR_RULES_TYPE_CHAIN_SHIRT_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_CHAIN_SHIRT_MITHRAL:
                            case ARMOR_RULES_TYPE_CHAIN_SHIRT_LIVING:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_CHAIN_SHIRT_MASTERWORK);
                                    value = 1500 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_CHAIN_SHIRT];
                                    resistQuantity = IP_CONST_DAMAGERESIST_2;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_CHAIN_SHIRT_MASTERWORK:
                                {
                                    value = 1500 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_CHAIN_SHIRT];
                                    resistQuantity = IP_CONST_DAMAGERESIST_2;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_CHAINMAIL:
                            case ARMOR_RULES_TYPE_CHAINMAIL_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_CHAINMAIL_MITHRAL:
                            case ARMOR_RULES_TYPE_CHAINMAIL_LIVING:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_CHAINMAIL_MASTERWORK);
                                    value = 3000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_CHAINMAIL];
                                    resistQuantity = IP_CONST_DAMAGERESIST_4;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_CHAINMAIL_MASTERWORK:
                                {
                                    value = 3000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_CHAINMAIL];
                                    resistQuantity = IP_CONST_DAMAGERESIST_4;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_FULL_PLATE:
                            case ARMOR_RULES_TYPE_FULL_PLATE_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_FULL_PLATE_MITHRAL:
                            case ARMOR_RULES_TYPE_FULL_PLATE_LIVING:
                            case ARMOR_RULES_TYPE_FULL_PLATE_DRAGON:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_FULL_PLATE_MASTERWORK);
                                    value = 5000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_FULL_PLATE];
                                    resistQuantity = IP_CONST_DAMAGERESIST_6;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_FULL_PLATE_MASTERWORK:
                                {
                                    value = 5000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_FULL_PLATE];
                                    resistQuantity = IP_CONST_DAMAGERESIST_6;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_HALF_PLATE:
                            case ARMOR_RULES_TYPE_HALF_PLATE_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_HALF_PLATE_MITHRAL:
                            case ARMOR_RULES_TYPE_HALF_PLATE_LIVING:
                            case ARMOR_RULES_TYPE_HALF_PLATE_DRAGON:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_HALF_PLATE_MASTERWORK);
                                    value = 5000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_HALF_PLATE];
                                    resistQuantity = IP_CONST_DAMAGERESIST_6;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_HALF_PLATE_MASTERWORK:
                                {
                                    value = 5000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_HALF_PLATE];
                                    resistQuantity = IP_CONST_DAMAGERESIST_6;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SCALE:
                            case ARMOR_RULES_TYPE_SCALE_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_SCALE_MITHRAL:
                            case ARMOR_RULES_TYPE_SCALE_LIVING:
                            case ARMOR_RULES_TYPE_SCALE_DRAGON:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_SCALE_MASTERWORK);
                                    value = 3000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_SCALE];
                                    resistQuantity = IP_CONST_DAMAGERESIST_4;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SCALE_MASTERWORK:
                                {
                                    value = 3000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_SCALE];
                                    resistQuantity = IP_CONST_DAMAGERESIST_4;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SHIELD_HEAVY:
                            case ARMOR_RULES_TYPE_SHIELD_HEAVY_DARKWOOD:
                            case ARMOR_RULES_TYPE_SHIELD_HEAVY_MITHRAL:
                            case ARMOR_RULES_TYPE_SHIELD_HEAVY_DRAGON:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_SHIELD_HEAVY_MASTERWORK);
                                    value = 1500 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_SHIELD_HEAVY];
                                    resistQuantity = IP_CONST_DAMAGERESIST_2;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SHIELD_HEAVY_MASTERWORK:
                                {
                                    value = 1500 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_SHIELD_HEAVY];
                                    resistQuantity = IP_CONST_DAMAGERESIST_2;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SHIELD_LIGHT:
                            case ARMOR_RULES_TYPE_SHIELD_LIGHT_DARKWOOD:
                            case ARMOR_RULES_TYPE_SHIELD_LIGHT_MITHRAL:
                            case ARMOR_RULES_TYPE_SHIELD_LIGHT_DRAGON:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_SHIELD_LIGHT_MASTERWORK);
                                    value = 1500 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_SHIELD_LIGHT];
                                    resistQuantity = IP_CONST_DAMAGERESIST_2;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SHIELD_LIGHT_MASTERWORK:
                                {
                                    value = 1500 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_SHIELD_LIGHT];
                                    resistQuantity = IP_CONST_DAMAGERESIST_2;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SHIELD_TOWER:
                            case ARMOR_RULES_TYPE_SHIELD_TOWER_DARKWOOD:
                            case ARMOR_RULES_TYPE_SHIELD_TOWER_MITHRAL:
                            case ARMOR_RULES_TYPE_SHIELD_TOWER_DRAGON:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_SHIELD_TOWER_MASTERWORK);
                                    value = 1500 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_SHIELD_TOWER];
                                    resistQuantity = IP_CONST_DAMAGERESIST_2;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SHIELD_TOWER_MASTERWORK:
                                {
                                    value = 1500 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_SHIELD_TOWER];
                                    resistQuantity = IP_CONST_DAMAGERESIST_2;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SPLINT:
                            case ARMOR_RULES_TYPE_SPLINT_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_SPLINT_MITHREAL:
                            case ARMOR_RULES_TYPE_SPLINT_LIVING:
                            case ARMOR_RULES_TYPE_SPLINT_DRAGON:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_SPLINT_MASTERWORK);
                                    value = 5000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_SPLINT];
                                    resistQuantity = IP_CONST_DAMAGERESIST_6;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SPLINT_MASTERWORK:
                                {
                                    value = 5000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_SPLINT];
                                    resistQuantity = IP_CONST_DAMAGERESIST_6;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_STUDDED_LEATHER:
                            case ARMOR_RULES_TYPE_STUDDED_LEATHER_MASTERWORK:
                            case ARMOR_RULES_TYPE_HIDE:
                            case ARMOR_RULES_TYPE_HIDE_MASTERWORK:
                            case ARMOR_RULES_TYPE_LEATHER:
                            case ARMOR_RULES_TYPE_LEATHER_MASTERWORK:
                            case ARMOR_RULES_TYPE_PADDED:
                            case ARMOR_RULES_TYPE_PADDED_MASTERWORK:
                            case ARMOR_RULES_TYPE_CLOTH:
                            case ARMOR_RULES_TYPE_PADDED_DRAGON:
                            case ARMOR_RULES_TYPE_LEATHER_DRAGON:
                            case ARMOR_RULES_TYPE_HIDE_DRAGON:
                            case ARMOR_RULES_TYPE_LEATHER_STUDDED_DRAGON:
                                {
                                    // Arandur is a metal.
                                    return -1;
                                }
                        }
                        if (!GetHasElementalArmorBonus(script, itProps, IP_CONST_DAMAGETYPE_SONIC, resistQuantity))
                        {
                            script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyDamageResistance(IP_CONST_DAMAGETYPE_SONIC, resistQuantity), target, 0.0f);
                        }
                        break;
                    }
                #endregion
                #region Bluewood
                case GMATERIAL_BLUEWOOD:
                    {
                        switch (rulesType)
                        {
                            case ARMOR_RULES_TYPE_BANDED:
                            case ARMOR_RULES_TYPE_BANDED_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_BANDED_MITHRAL:
                            case ARMOR_RULES_TYPE_BANDED_LIVING:
                            case ARMOR_RULES_TYPE_BANDED_DRAGON:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_BANDED_MASTERWORK);
                                    value = 1200 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_BANDED];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_BANDED_MASTERWORK:
                                {
                                    value = 1200 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_BANDED];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_BREASTPLATE:
                            case ARMOR_RULES_TYPE_BREASTPLATE_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_BREASTPLATE_MITHRAL:
                            case ARMOR_RULES_TYPE_BREASTPLATE_LIVING:
                            case ARMOR_RULES_TYPE_BREASTPLATE_DUSKWOOD:
                            case ARMOR_RULES_TYPE_BREASTPLATE_DRAGON:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_BREASTPLATE_MASTERWORK);
                                    value = 600 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_BREASTPLATE];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_BREASTPLATE_MASTERWORK:
                                {
                                    value = 600 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_BREASTPLATE];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_CHAIN_SHIRT:
                            case ARMOR_RULES_TYPE_CHAIN_SHIRT_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_CHAIN_SHIRT_MITHRAL:
                            case ARMOR_RULES_TYPE_CHAIN_SHIRT_LIVING:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_CHAIN_SHIRT_MASTERWORK);
                                    value = 300 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_CHAIN_SHIRT];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_CHAIN_SHIRT_MASTERWORK:
                                {
                                    value = 300 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_CHAIN_SHIRT];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_CHAINMAIL:
                            case ARMOR_RULES_TYPE_CHAINMAIL_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_CHAINMAIL_MITHRAL:
                            case ARMOR_RULES_TYPE_CHAINMAIL_LIVING:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_CHAINMAIL_MASTERWORK);
                                    value = 600 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_CHAINMAIL];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_CHAINMAIL_MASTERWORK:
                                {
                                    value = 600 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_CHAINMAIL];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_FULL_PLATE:
                            case ARMOR_RULES_TYPE_FULL_PLATE_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_FULL_PLATE_MITHRAL:
                            case ARMOR_RULES_TYPE_FULL_PLATE_LIVING:
                            case ARMOR_RULES_TYPE_FULL_PLATE_DRAGON:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_FULL_PLATE_MASTERWORK);
                                    value = 1200 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_FULL_PLATE];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_FULL_PLATE_MASTERWORK:
                                {
                                    value = 1200 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_FULL_PLATE];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_HALF_PLATE:
                            case ARMOR_RULES_TYPE_HALF_PLATE_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_HALF_PLATE_MITHRAL:
                            case ARMOR_RULES_TYPE_HALF_PLATE_LIVING:
                            case ARMOR_RULES_TYPE_HALF_PLATE_DRAGON:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_HALF_PLATE_MASTERWORK);
                                    value = 1200 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_HALF_PLATE];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_HALF_PLATE_MASTERWORK:
                                {
                                    value = 1200 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_HALF_PLATE];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SCALE:
                            case ARMOR_RULES_TYPE_SCALE_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_SCALE_MITHRAL:
                            case ARMOR_RULES_TYPE_SCALE_LIVING:
                            case ARMOR_RULES_TYPE_SCALE_DRAGON:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_SCALE_MASTERWORK);
                                    value = 600 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_SCALE];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SCALE_MASTERWORK:
                                {
                                    value = 600 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_SCALE];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SHIELD_HEAVY:
                            case ARMOR_RULES_TYPE_SHIELD_HEAVY_DARKWOOD:
                            case ARMOR_RULES_TYPE_SHIELD_HEAVY_MITHRAL:
                            case ARMOR_RULES_TYPE_SHIELD_HEAVY_DRAGON:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_SHIELD_HEAVY_MASTERWORK);
                                    value = 300 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_SHIELD_HEAVY];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SHIELD_HEAVY_MASTERWORK:
                                {
                                    value = 300 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_SHIELD_HEAVY];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SHIELD_LIGHT:
                            case ARMOR_RULES_TYPE_SHIELD_LIGHT_DARKWOOD:
                            case ARMOR_RULES_TYPE_SHIELD_LIGHT_MITHRAL:
                            case ARMOR_RULES_TYPE_SHIELD_LIGHT_DRAGON:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_SHIELD_LIGHT_MASTERWORK);
                                    value = 300 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_SHIELD_LIGHT];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SHIELD_LIGHT_MASTERWORK:
                                {
                                    value = 300 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_SHIELD_LIGHT];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SHIELD_TOWER:
                            case ARMOR_RULES_TYPE_SHIELD_TOWER_DARKWOOD:
                            case ARMOR_RULES_TYPE_SHIELD_TOWER_MITHRAL:
                            case ARMOR_RULES_TYPE_SHIELD_TOWER_DRAGON:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_SHIELD_TOWER_MASTERWORK);
                                    value = 300 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_SHIELD_TOWER];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SHIELD_TOWER_MASTERWORK:
                                {
                                    value = 300 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_SHIELD_TOWER];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SPLINT:
                            case ARMOR_RULES_TYPE_SPLINT_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_SPLINT_MITHREAL:
                            case ARMOR_RULES_TYPE_SPLINT_LIVING:
                            case ARMOR_RULES_TYPE_SPLINT_DRAGON:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_SPLINT_MASTERWORK);
                                    value = 1200 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_SPLINT];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SPLINT_MASTERWORK:
                                {
                                    value = 1200 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_SPLINT];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_STUDDED_LEATHER:
                            case ARMOR_RULES_TYPE_STUDDED_LEATHER_MASTERWORK:
                            case ARMOR_RULES_TYPE_HIDE:
                            case ARMOR_RULES_TYPE_HIDE_MASTERWORK:
                            case ARMOR_RULES_TYPE_LEATHER:
                            case ARMOR_RULES_TYPE_LEATHER_MASTERWORK:
                            case ARMOR_RULES_TYPE_PADDED:
                            case ARMOR_RULES_TYPE_PADDED_MASTERWORK:
                            case ARMOR_RULES_TYPE_CLOTH:
                            case ARMOR_RULES_TYPE_PADDED_DRAGON:
                            case ARMOR_RULES_TYPE_LEATHER_DRAGON:
                            case ARMOR_RULES_TYPE_HIDE_DRAGON:
                            case ARMOR_RULES_TYPE_LEATHER_STUDDED_DRAGON:
                                {
                                    // Bluewood emulates metal.
                                    return -1;
                                }
                        }
                        if (!GetIsHalfWeight(script, itProps))
                        {
                            script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyWeightReduction(IP_CONST_REDUCEDWEIGHT_50_PERCENT), target, 0.0f);
                        }
                        break;
                    }
                #endregion
                #region Cold Iron
                case GMATERIAL_METAL_COLD_IRON:
                    {
                        int saveBonus = 1;
                        switch (rulesType)
                        {
                            case ARMOR_RULES_TYPE_BANDED:
                            case ARMOR_RULES_TYPE_BANDED_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_BANDED_MITHRAL:
                            case ARMOR_RULES_TYPE_BANDED_LIVING:
                            case ARMOR_RULES_TYPE_BANDED_DRAGON:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_BANDED_MASTERWORK);
                                    value = 9000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_BANDED];
                                    saveBonus = 3;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_BANDED_MASTERWORK:
                                {
                                    value = 9000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_BANDED];
                                    saveBonus = 3;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_BREASTPLATE:
                            case ARMOR_RULES_TYPE_BREASTPLATE_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_BREASTPLATE_MITHRAL:
                            case ARMOR_RULES_TYPE_BREASTPLATE_LIVING:
                            case ARMOR_RULES_TYPE_BREASTPLATE_DUSKWOOD:
                            case ARMOR_RULES_TYPE_BREASTPLATE_DRAGON:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_BREASTPLATE_MASTERWORK);
                                    value = 4000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_BREASTPLATE];
                                    saveBonus = 2;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_BREASTPLATE_MASTERWORK:
                                {
                                    value = 4000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_BREASTPLATE];
                                    saveBonus = 2;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_CHAIN_SHIRT:
                            case ARMOR_RULES_TYPE_CHAIN_SHIRT_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_CHAIN_SHIRT_MITHRAL:
                            case ARMOR_RULES_TYPE_CHAIN_SHIRT_LIVING:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_CHAIN_SHIRT_MASTERWORK);
                                    value = 1000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_CHAIN_SHIRT];
                                    saveBonus = 1;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_CHAIN_SHIRT_MASTERWORK:
                                {
                                    value = 1000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_CHAIN_SHIRT];
                                    saveBonus = 1;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_CHAINMAIL:
                            case ARMOR_RULES_TYPE_CHAINMAIL_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_CHAINMAIL_MITHRAL:
                            case ARMOR_RULES_TYPE_CHAINMAIL_LIVING:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_CHAINMAIL_MASTERWORK);
                                    value = 4000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_CHAINMAIL];
                                    saveBonus = 2;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_CHAINMAIL_MASTERWORK:
                                {
                                    value = 4000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_CHAINMAIL];
                                    saveBonus = 2;                                    
                                    break;
                                }
                            case ARMOR_RULES_TYPE_FULL_PLATE:
                            case ARMOR_RULES_TYPE_FULL_PLATE_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_FULL_PLATE_MITHRAL:
                            case ARMOR_RULES_TYPE_FULL_PLATE_LIVING:
                            case ARMOR_RULES_TYPE_FULL_PLATE_DRAGON:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_FULL_PLATE_MASTERWORK);
                                    value = 9000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_FULL_PLATE];
                                    saveBonus = 3;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_FULL_PLATE_MASTERWORK:
                                {
                                    value = 9000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_FULL_PLATE];
                                    saveBonus = 3;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_HALF_PLATE:
                            case ARMOR_RULES_TYPE_HALF_PLATE_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_HALF_PLATE_MITHRAL:
                            case ARMOR_RULES_TYPE_HALF_PLATE_LIVING:
                            case ARMOR_RULES_TYPE_HALF_PLATE_DRAGON:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_HALF_PLATE_MASTERWORK);
                                    value = 9000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_HALF_PLATE];
                                    saveBonus = 3;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_HALF_PLATE_MASTERWORK:
                                {
                                    value = 9000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_HALF_PLATE];
                                    saveBonus = 3;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SCALE:
                            case ARMOR_RULES_TYPE_SCALE_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_SCALE_MITHRAL:
                            case ARMOR_RULES_TYPE_SCALE_LIVING:
                            case ARMOR_RULES_TYPE_SCALE_DRAGON:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_SCALE_MASTERWORK);
                                    value = 4000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_SCALE];
                                    saveBonus = 2;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SCALE_MASTERWORK:
                                {
                                    value = 4000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_SCALE];
                                    saveBonus = 2;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SHIELD_HEAVY:
                            case ARMOR_RULES_TYPE_SHIELD_HEAVY_DARKWOOD:
                            case ARMOR_RULES_TYPE_SHIELD_HEAVY_MITHRAL:
                            case ARMOR_RULES_TYPE_SHIELD_HEAVY_DRAGON:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_SHIELD_HEAVY_MASTERWORK);
                                    value = 1000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_SHIELD_HEAVY];
                                    saveBonus = 1;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SHIELD_HEAVY_MASTERWORK:
                                {
                                    value = 1000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_SHIELD_HEAVY];
                                    saveBonus = 1;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SHIELD_LIGHT:
                            case ARMOR_RULES_TYPE_SHIELD_LIGHT_DARKWOOD:
                            case ARMOR_RULES_TYPE_SHIELD_LIGHT_MITHRAL:
                            case ARMOR_RULES_TYPE_SHIELD_LIGHT_DRAGON:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_SHIELD_LIGHT_MASTERWORK);
                                    value = 1000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_SHIELD_LIGHT];
                                    saveBonus = 1;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SHIELD_LIGHT_MASTERWORK:
                                {
                                    value = 1000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_SHIELD_LIGHT];
                                    saveBonus = 1;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SHIELD_TOWER:
                            case ARMOR_RULES_TYPE_SHIELD_TOWER_DARKWOOD:
                            case ARMOR_RULES_TYPE_SHIELD_TOWER_MITHRAL:
                            case ARMOR_RULES_TYPE_SHIELD_TOWER_DRAGON:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_SHIELD_TOWER_MASTERWORK);
                                    value = 1000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_SHIELD_TOWER];
                                    saveBonus = 1;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SHIELD_TOWER_MASTERWORK:
                                {
                                    value = 1000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_SHIELD_TOWER];
                                    saveBonus = 1;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SPLINT:
                            case ARMOR_RULES_TYPE_SPLINT_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_SPLINT_MITHREAL:
                            case ARMOR_RULES_TYPE_SPLINT_LIVING:
                            case ARMOR_RULES_TYPE_SPLINT_DRAGON:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_SPLINT_MASTERWORK);
                                    value = 4000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_SPLINT];
                                    saveBonus = 2;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SPLINT_MASTERWORK:
                                {
                                    value = 4000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_SPLINT];
                                    saveBonus = 2;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_STUDDED_LEATHER:
                            case ARMOR_RULES_TYPE_STUDDED_LEATHER_MASTERWORK:
                            case ARMOR_RULES_TYPE_HIDE:
                            case ARMOR_RULES_TYPE_HIDE_MASTERWORK:
                            case ARMOR_RULES_TYPE_LEATHER:
                            case ARMOR_RULES_TYPE_LEATHER_MASTERWORK:
                            case ARMOR_RULES_TYPE_PADDED:
                            case ARMOR_RULES_TYPE_PADDED_MASTERWORK:
                            case ARMOR_RULES_TYPE_CLOTH:
                            case ARMOR_RULES_TYPE_PADDED_DRAGON:
                            case ARMOR_RULES_TYPE_LEATHER_DRAGON:
                            case ARMOR_RULES_TYPE_HIDE_DRAGON:
                            case ARMOR_RULES_TYPE_LEATHER_STUDDED_DRAGON:
                                {
                                    return -1;
                                }
                        }
                        enchantmentPenalty = 2000;
                        if (!GetHasSavingThrowBonus(script, itProps, saveBonus))
                        {
                            script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyBonusSavingThrowVsX(IP_CONST_SAVEVS_UNIVERSAL, saveBonus), target, 0.0f);
                        }
                        break;
                    }
                #endregion
                #region Copper
                case GMATERIAL_COPPER:
                    {
                        switch (rulesType)
                        {
                            case ARMOR_RULES_TYPE_BANDED:
                            case ARMOR_RULES_TYPE_BANDED_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_BANDED_MITHRAL:
                            case ARMOR_RULES_TYPE_BANDED_LIVING:
                            case ARMOR_RULES_TYPE_BANDED_DRAGON:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_BANDED_MASTERWORK);
                                    value = 1500 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_BANDED];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_BANDED_MASTERWORK:
                                {
                                    value = 1500 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_BANDED];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_BREASTPLATE:
                            case ARMOR_RULES_TYPE_BREASTPLATE_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_BREASTPLATE_MITHRAL:
                            case ARMOR_RULES_TYPE_BREASTPLATE_LIVING:
                            case ARMOR_RULES_TYPE_BREASTPLATE_DUSKWOOD:
                            case ARMOR_RULES_TYPE_BREASTPLATE_DRAGON:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_BREASTPLATE_MASTERWORK);
                                    value = 1500 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_BREASTPLATE];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_BREASTPLATE_MASTERWORK:
                                {
                                    value = 1500 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_BREASTPLATE];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_CHAIN_SHIRT:
                            case ARMOR_RULES_TYPE_CHAIN_SHIRT_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_CHAIN_SHIRT_MITHRAL:
                            case ARMOR_RULES_TYPE_CHAIN_SHIRT_LIVING:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_CHAIN_SHIRT_MASTERWORK);
                                    value = 1500 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_CHAIN_SHIRT];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_CHAIN_SHIRT_MASTERWORK:
                                {
                                    value = 1500 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_CHAIN_SHIRT];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_CHAINMAIL:
                            case ARMOR_RULES_TYPE_CHAINMAIL_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_CHAINMAIL_MITHRAL:
                            case ARMOR_RULES_TYPE_CHAINMAIL_LIVING:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_CHAINMAIL_MASTERWORK);
                                    value = 1500 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_CHAINMAIL];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_CHAINMAIL_MASTERWORK:
                                {
                                    value = 1500 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_CHAINMAIL];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_FULL_PLATE:
                            case ARMOR_RULES_TYPE_FULL_PLATE_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_FULL_PLATE_MITHRAL:
                            case ARMOR_RULES_TYPE_FULL_PLATE_LIVING:
                            case ARMOR_RULES_TYPE_FULL_PLATE_DRAGON:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_FULL_PLATE_MASTERWORK);
                                    value = 1500 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_FULL_PLATE];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_FULL_PLATE_MASTERWORK:
                                {
                                    value = 1500 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_FULL_PLATE];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_HALF_PLATE:
                            case ARMOR_RULES_TYPE_HALF_PLATE_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_HALF_PLATE_MITHRAL:
                            case ARMOR_RULES_TYPE_HALF_PLATE_LIVING:
                            case ARMOR_RULES_TYPE_HALF_PLATE_DRAGON:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_HALF_PLATE_MASTERWORK);
                                    value = 1500 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_HALF_PLATE];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_HALF_PLATE_MASTERWORK:
                                {
                                    value = 1500 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_HALF_PLATE];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SCALE:
                            case ARMOR_RULES_TYPE_SCALE_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_SCALE_MITHRAL:
                            case ARMOR_RULES_TYPE_SCALE_LIVING:
                            case ARMOR_RULES_TYPE_SCALE_DRAGON:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_SCALE_MASTERWORK);
                                    value = 1500 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_SCALE];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SCALE_MASTERWORK:
                                {
                                    value = 1500 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_SCALE];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SHIELD_HEAVY:
                            case ARMOR_RULES_TYPE_SHIELD_HEAVY_DARKWOOD:
                            case ARMOR_RULES_TYPE_SHIELD_HEAVY_MITHRAL:
                            case ARMOR_RULES_TYPE_SHIELD_HEAVY_DRAGON:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_SHIELD_HEAVY_MASTERWORK);
                                    value = 1500 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_SHIELD_HEAVY];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SHIELD_HEAVY_MASTERWORK:
                                {
                                    value = 1500 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_SHIELD_HEAVY];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SHIELD_LIGHT:
                            case ARMOR_RULES_TYPE_SHIELD_LIGHT_DARKWOOD:
                            case ARMOR_RULES_TYPE_SHIELD_LIGHT_MITHRAL:
                            case ARMOR_RULES_TYPE_SHIELD_LIGHT_DRAGON:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_SHIELD_LIGHT_MASTERWORK);
                                    value = 1500 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_SHIELD_LIGHT];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SHIELD_LIGHT_MASTERWORK:
                                {
                                    value = 1500 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_SHIELD_LIGHT];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SHIELD_TOWER:
                            case ARMOR_RULES_TYPE_SHIELD_TOWER_DARKWOOD:
                            case ARMOR_RULES_TYPE_SHIELD_TOWER_MITHRAL:
                            case ARMOR_RULES_TYPE_SHIELD_TOWER_DRAGON:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_SHIELD_TOWER_MASTERWORK);
                                    value = 1500 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_SHIELD_TOWER];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SHIELD_TOWER_MASTERWORK:
                                {
                                    value = 1500 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_SHIELD_TOWER];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SPLINT:
                            case ARMOR_RULES_TYPE_SPLINT_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_SPLINT_MITHREAL:
                            case ARMOR_RULES_TYPE_SPLINT_LIVING:
                            case ARMOR_RULES_TYPE_SPLINT_DRAGON:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_SPLINT_MASTERWORK);
                                    value = 1500 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_SPLINT];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SPLINT_MASTERWORK:
                                {
                                    value = 1500 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_SPLINT];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_STUDDED_LEATHER:
                            case ARMOR_RULES_TYPE_STUDDED_LEATHER_MASTERWORK:
                            case ARMOR_RULES_TYPE_HIDE:
                            case ARMOR_RULES_TYPE_HIDE_MASTERWORK:
                            case ARMOR_RULES_TYPE_LEATHER:
                            case ARMOR_RULES_TYPE_LEATHER_MASTERWORK:
                            case ARMOR_RULES_TYPE_PADDED:
                            case ARMOR_RULES_TYPE_PADDED_MASTERWORK:
                            case ARMOR_RULES_TYPE_CLOTH:
                            case ARMOR_RULES_TYPE_PADDED_DRAGON:
                            case ARMOR_RULES_TYPE_LEATHER_DRAGON:
                            case ARMOR_RULES_TYPE_HIDE_DRAGON:
                            case ARMOR_RULES_TYPE_LEATHER_STUDDED_DRAGON:
                                {
                                    return -1;
                                }
                        }
                        if (!GetHasSpecificSavingThrowBonus(script, itProps, IP_CONST_SAVEVS_POISON, 2))
                        {
                            script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyBonusSavingThrowVsX(IP_CONST_SAVEVS_POISON, 2), target, 0.0f);
                        }
                        if (!GetHasSpecificSavingThrowBonus(script, itProps, IP_CONST_SAVEVS_DISEASE, 2))
                        {
                            script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyBonusSavingThrowVsX(IP_CONST_SAVEVS_DISEASE, 2), target, 0.0f);
                        }
                        if (!GetHasSpecificSavingThrowPenalty(script, itProps, IP_CONST_SAVEVS_ELECTRICAL, 2))
                        {
                            script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyReducedSavingThrowVsX(IP_CONST_SAVEVS_ELECTRICAL, 2), target, 0.0f);
                        }
                        break;
                    }
                #endregion
                #region Darksteel
                case GMATERIAL_METAL_DARKSTEEL:
                    {
                        int resistQuantity = IP_CONST_DAMAGERESIST_2;
                        switch (rulesType)
                        {
                            case ARMOR_RULES_TYPE_BANDED:
                            case ARMOR_RULES_TYPE_BANDED_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_BANDED_MITHRAL:
                            case ARMOR_RULES_TYPE_BANDED_LIVING:
                            case ARMOR_RULES_TYPE_BANDED_DRAGON:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_BANDED_MASTERWORK);
                                    value = 5000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_BANDED];
                                    resistQuantity = IP_CONST_DAMAGERESIST_6;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_BANDED_MASTERWORK:
                                {
                                    value = 5000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_BANDED];
                                    resistQuantity = IP_CONST_DAMAGERESIST_6;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_BREASTPLATE:
                            case ARMOR_RULES_TYPE_BREASTPLATE_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_BREASTPLATE_MITHRAL:
                            case ARMOR_RULES_TYPE_BREASTPLATE_LIVING:
                            case ARMOR_RULES_TYPE_BREASTPLATE_DUSKWOOD:
                            case ARMOR_RULES_TYPE_BREASTPLATE_DRAGON:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_BREASTPLATE_MASTERWORK);
                                    value = 3000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_BREASTPLATE];
                                    resistQuantity = IP_CONST_DAMAGERESIST_4;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_BREASTPLATE_MASTERWORK:
                                {
                                    value = 3000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_BREASTPLATE];
                                    resistQuantity = IP_CONST_DAMAGERESIST_4;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_CHAIN_SHIRT:
                            case ARMOR_RULES_TYPE_CHAIN_SHIRT_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_CHAIN_SHIRT_MITHRAL:
                            case ARMOR_RULES_TYPE_CHAIN_SHIRT_LIVING:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_CHAIN_SHIRT_MASTERWORK);
                                    value = 1500 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_CHAIN_SHIRT];
                                    resistQuantity = IP_CONST_DAMAGERESIST_2;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_CHAIN_SHIRT_MASTERWORK:
                                {
                                    value = 1500 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_CHAIN_SHIRT];
                                    resistQuantity = IP_CONST_DAMAGERESIST_2;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_CHAINMAIL:
                            case ARMOR_RULES_TYPE_CHAINMAIL_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_CHAINMAIL_MITHRAL:
                            case ARMOR_RULES_TYPE_CHAINMAIL_LIVING:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_CHAINMAIL_MASTERWORK);
                                    value = 3000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_CHAINMAIL];
                                    resistQuantity = IP_CONST_DAMAGERESIST_4;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_CHAINMAIL_MASTERWORK:
                                {
                                    value = 3000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_CHAINMAIL];
                                    resistQuantity = IP_CONST_DAMAGERESIST_4;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_FULL_PLATE:
                            case ARMOR_RULES_TYPE_FULL_PLATE_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_FULL_PLATE_MITHRAL:
                            case ARMOR_RULES_TYPE_FULL_PLATE_LIVING:
                            case ARMOR_RULES_TYPE_FULL_PLATE_DRAGON:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_FULL_PLATE_MASTERWORK);
                                    value = 5000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_FULL_PLATE];
                                    resistQuantity = IP_CONST_DAMAGERESIST_6;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_FULL_PLATE_MASTERWORK:
                                {
                                    value = 5000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_FULL_PLATE];
                                    resistQuantity = IP_CONST_DAMAGERESIST_6;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_HALF_PLATE:
                            case ARMOR_RULES_TYPE_HALF_PLATE_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_HALF_PLATE_MITHRAL:
                            case ARMOR_RULES_TYPE_HALF_PLATE_LIVING:
                            case ARMOR_RULES_TYPE_HALF_PLATE_DRAGON:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_HALF_PLATE_MASTERWORK);
                                    value = 5000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_HALF_PLATE];
                                    resistQuantity = IP_CONST_DAMAGERESIST_6;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_HALF_PLATE_MASTERWORK:
                                {
                                    value = 5000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_HALF_PLATE];
                                    resistQuantity = IP_CONST_DAMAGERESIST_6;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SCALE:
                            case ARMOR_RULES_TYPE_SCALE_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_SCALE_MITHRAL:
                            case ARMOR_RULES_TYPE_SCALE_LIVING:
                            case ARMOR_RULES_TYPE_SCALE_DRAGON:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_SCALE_MASTERWORK);
                                    value = 3000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_SCALE];
                                    resistQuantity = IP_CONST_DAMAGERESIST_4;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SCALE_MASTERWORK:
                                {
                                    value = 3000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_SCALE];
                                    resistQuantity = IP_CONST_DAMAGERESIST_4;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SHIELD_HEAVY:
                            case ARMOR_RULES_TYPE_SHIELD_HEAVY_DARKWOOD:
                            case ARMOR_RULES_TYPE_SHIELD_HEAVY_MITHRAL:
                            case ARMOR_RULES_TYPE_SHIELD_HEAVY_DRAGON:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_SHIELD_HEAVY_MASTERWORK);
                                    value = 1500 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_SHIELD_HEAVY];
                                    resistQuantity = IP_CONST_DAMAGERESIST_2;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SHIELD_HEAVY_MASTERWORK:
                                {
                                    value = 1500 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_SHIELD_HEAVY];
                                    resistQuantity = IP_CONST_DAMAGERESIST_2;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SHIELD_LIGHT:
                            case ARMOR_RULES_TYPE_SHIELD_LIGHT_DARKWOOD:
                            case ARMOR_RULES_TYPE_SHIELD_LIGHT_MITHRAL:
                            case ARMOR_RULES_TYPE_SHIELD_LIGHT_DRAGON:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_SHIELD_LIGHT_MASTERWORK);
                                    value = 1500 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_SHIELD_LIGHT];
                                    resistQuantity = IP_CONST_DAMAGERESIST_2;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SHIELD_LIGHT_MASTERWORK:
                                {
                                    value = 1500 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_SHIELD_LIGHT];
                                    resistQuantity = IP_CONST_DAMAGERESIST_2;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SHIELD_TOWER:
                            case ARMOR_RULES_TYPE_SHIELD_TOWER_DARKWOOD:
                            case ARMOR_RULES_TYPE_SHIELD_TOWER_MITHRAL:
                            case ARMOR_RULES_TYPE_SHIELD_TOWER_DRAGON:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_SHIELD_TOWER_MASTERWORK);
                                    value = 1500 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_SHIELD_TOWER];
                                    resistQuantity = IP_CONST_DAMAGERESIST_2;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SHIELD_TOWER_MASTERWORK:
                                {
                                    value = 1500 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_SHIELD_TOWER];
                                    resistQuantity = IP_CONST_DAMAGERESIST_2;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SPLINT:
                            case ARMOR_RULES_TYPE_SPLINT_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_SPLINT_MITHREAL:
                            case ARMOR_RULES_TYPE_SPLINT_LIVING:
                            case ARMOR_RULES_TYPE_SPLINT_DRAGON:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_SPLINT_MASTERWORK);
                                    value = 5000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_SPLINT];
                                    resistQuantity = IP_CONST_DAMAGERESIST_6;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SPLINT_MASTERWORK:
                                {
                                    value = 5000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_SPLINT];
                                    resistQuantity = IP_CONST_DAMAGERESIST_6;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_STUDDED_LEATHER:
                            case ARMOR_RULES_TYPE_STUDDED_LEATHER_MASTERWORK:
                            case ARMOR_RULES_TYPE_HIDE:
                            case ARMOR_RULES_TYPE_HIDE_MASTERWORK:
                            case ARMOR_RULES_TYPE_LEATHER:
                            case ARMOR_RULES_TYPE_LEATHER_MASTERWORK:
                            case ARMOR_RULES_TYPE_PADDED:
                            case ARMOR_RULES_TYPE_PADDED_MASTERWORK:
                            case ARMOR_RULES_TYPE_CLOTH:
                            case ARMOR_RULES_TYPE_PADDED_DRAGON:
                            case ARMOR_RULES_TYPE_LEATHER_DRAGON:
                            case ARMOR_RULES_TYPE_HIDE_DRAGON:
                            case ARMOR_RULES_TYPE_LEATHER_STUDDED_DRAGON:
                                {
                                    // Darksteel is a metal.
                                    return -1;
                                }
                        }
                        if (!GetHasElementalArmorBonus(script, itProps, IP_CONST_DAMAGETYPE_ACID, resistQuantity))
                        {
                            script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyDamageResistance(IP_CONST_DAMAGETYPE_ACID, resistQuantity), target, 0.0f);
                        }
                        break;
                    }
                #endregion
                #region Dlarun
                case GMATERIAL_DLARUN:
                    {
                        int resistQuantity = IP_CONST_DAMAGERESIST_2;
                        switch (rulesType)
                        {
                            case ARMOR_RULES_TYPE_BANDED:
                            case ARMOR_RULES_TYPE_BANDED_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_BANDED_MITHRAL:
                            case ARMOR_RULES_TYPE_BANDED_LIVING:
                            case ARMOR_RULES_TYPE_BANDED_DRAGON:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_BANDED_MASTERWORK);
                                    value = 5000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_BANDED];
                                    resistQuantity = IP_CONST_DAMAGERESIST_6;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_BANDED_MASTERWORK:
                                {
                                    value = 5000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_BANDED];
                                    resistQuantity = IP_CONST_DAMAGERESIST_6;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_BREASTPLATE:
                            case ARMOR_RULES_TYPE_BREASTPLATE_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_BREASTPLATE_MITHRAL:
                            case ARMOR_RULES_TYPE_BREASTPLATE_LIVING:
                            case ARMOR_RULES_TYPE_BREASTPLATE_DUSKWOOD:
                            case ARMOR_RULES_TYPE_BREASTPLATE_DRAGON:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_BREASTPLATE_MASTERWORK);
                                    value = 3000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_BREASTPLATE];
                                    resistQuantity = IP_CONST_DAMAGERESIST_4;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_BREASTPLATE_MASTERWORK:
                                {
                                    value = 3000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_BREASTPLATE];
                                    resistQuantity = IP_CONST_DAMAGERESIST_4;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_CHAIN_SHIRT:
                            case ARMOR_RULES_TYPE_CHAIN_SHIRT_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_CHAIN_SHIRT_MITHRAL:
                            case ARMOR_RULES_TYPE_CHAIN_SHIRT_LIVING:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_CHAIN_SHIRT_MASTERWORK);
                                    value = 1500 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_CHAIN_SHIRT];
                                    resistQuantity = IP_CONST_DAMAGERESIST_2;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_CHAIN_SHIRT_MASTERWORK:
                                {
                                    value = 1500 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_CHAIN_SHIRT];
                                    resistQuantity = IP_CONST_DAMAGERESIST_2;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_CHAINMAIL:
                            case ARMOR_RULES_TYPE_CHAINMAIL_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_CHAINMAIL_MITHRAL:
                            case ARMOR_RULES_TYPE_CHAINMAIL_LIVING:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_CHAINMAIL_MASTERWORK);
                                    value = 3000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_CHAINMAIL];
                                    resistQuantity = IP_CONST_DAMAGERESIST_4;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_CHAINMAIL_MASTERWORK:
                                {
                                    value = 3000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_CHAINMAIL];
                                    resistQuantity = IP_CONST_DAMAGERESIST_4;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_FULL_PLATE:
                            case ARMOR_RULES_TYPE_FULL_PLATE_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_FULL_PLATE_MITHRAL:
                            case ARMOR_RULES_TYPE_FULL_PLATE_LIVING:
                            case ARMOR_RULES_TYPE_FULL_PLATE_DRAGON:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_FULL_PLATE_MASTERWORK);
                                    value = 5000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_FULL_PLATE];
                                    resistQuantity = IP_CONST_DAMAGERESIST_6;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_FULL_PLATE_MASTERWORK:
                                {
                                    value = 5000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_FULL_PLATE];
                                    resistQuantity = IP_CONST_DAMAGERESIST_6;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_HALF_PLATE:
                            case ARMOR_RULES_TYPE_HALF_PLATE_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_HALF_PLATE_MITHRAL:
                            case ARMOR_RULES_TYPE_HALF_PLATE_LIVING:
                            case ARMOR_RULES_TYPE_HALF_PLATE_DRAGON:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_HALF_PLATE_MASTERWORK);
                                    value = 5000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_HALF_PLATE];
                                    resistQuantity = IP_CONST_DAMAGERESIST_6;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_HALF_PLATE_MASTERWORK:
                                {
                                    value = 5000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_HALF_PLATE];
                                    resistQuantity = IP_CONST_DAMAGERESIST_6;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SCALE:
                            case ARMOR_RULES_TYPE_SCALE_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_SCALE_MITHRAL:
                            case ARMOR_RULES_TYPE_SCALE_LIVING:
                            case ARMOR_RULES_TYPE_SCALE_DRAGON:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_SCALE_MASTERWORK);
                                    value = 3000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_SCALE];
                                    resistQuantity = IP_CONST_DAMAGERESIST_4;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SCALE_MASTERWORK:
                                {
                                    value = 3000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_SCALE];
                                    resistQuantity = IP_CONST_DAMAGERESIST_4;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SHIELD_HEAVY:
                            case ARMOR_RULES_TYPE_SHIELD_HEAVY_DARKWOOD:
                            case ARMOR_RULES_TYPE_SHIELD_HEAVY_MITHRAL:
                            case ARMOR_RULES_TYPE_SHIELD_HEAVY_DRAGON:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_SHIELD_HEAVY_MASTERWORK);
                                    value = 1500 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_SHIELD_HEAVY];
                                    resistQuantity = IP_CONST_DAMAGERESIST_2;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SHIELD_HEAVY_MASTERWORK:
                                {
                                    value = 1500 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_SHIELD_HEAVY];
                                    resistQuantity = IP_CONST_DAMAGERESIST_2;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SHIELD_LIGHT:
                            case ARMOR_RULES_TYPE_SHIELD_LIGHT_DARKWOOD:
                            case ARMOR_RULES_TYPE_SHIELD_LIGHT_MITHRAL:
                            case ARMOR_RULES_TYPE_SHIELD_LIGHT_DRAGON:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_SHIELD_LIGHT_MASTERWORK);
                                    value = 1500 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_SHIELD_LIGHT];
                                    resistQuantity = IP_CONST_DAMAGERESIST_2;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SHIELD_LIGHT_MASTERWORK:
                                {
                                    value = 1500 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_SHIELD_LIGHT];
                                    resistQuantity = IP_CONST_DAMAGERESIST_2;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SHIELD_TOWER:
                            case ARMOR_RULES_TYPE_SHIELD_TOWER_DARKWOOD:
                            case ARMOR_RULES_TYPE_SHIELD_TOWER_MITHRAL:
                            case ARMOR_RULES_TYPE_SHIELD_TOWER_DRAGON:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_SHIELD_TOWER_MASTERWORK);
                                    value = 1500 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_SHIELD_TOWER];
                                    resistQuantity = IP_CONST_DAMAGERESIST_2;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SHIELD_TOWER_MASTERWORK:
                                {
                                    value = 1500 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_SHIELD_TOWER];
                                    resistQuantity = IP_CONST_DAMAGERESIST_2;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SPLINT:
                            case ARMOR_RULES_TYPE_SPLINT_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_SPLINT_MITHREAL:
                            case ARMOR_RULES_TYPE_SPLINT_LIVING:
                            case ARMOR_RULES_TYPE_SPLINT_DRAGON:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_SPLINT_MASTERWORK);
                                    value = 5000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_SPLINT];
                                    resistQuantity = IP_CONST_DAMAGERESIST_6;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SPLINT_MASTERWORK:
                                {
                                    value = 5000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_SPLINT];
                                    resistQuantity = IP_CONST_DAMAGERESIST_6;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_STUDDED_LEATHER:
                            case ARMOR_RULES_TYPE_STUDDED_LEATHER_MASTERWORK:
                            case ARMOR_RULES_TYPE_HIDE:
                            case ARMOR_RULES_TYPE_HIDE_MASTERWORK:
                            case ARMOR_RULES_TYPE_LEATHER:
                            case ARMOR_RULES_TYPE_LEATHER_MASTERWORK:
                            case ARMOR_RULES_TYPE_PADDED:
                            case ARMOR_RULES_TYPE_PADDED_MASTERWORK:
                            case ARMOR_RULES_TYPE_CLOTH:
                            case ARMOR_RULES_TYPE_PADDED_DRAGON:
                            case ARMOR_RULES_TYPE_LEATHER_DRAGON:
                            case ARMOR_RULES_TYPE_HIDE_DRAGON:
                            case ARMOR_RULES_TYPE_LEATHER_STUDDED_DRAGON:
                                {
                                    // Dlarun is a metal.
                                    return -1;
                                }
                        }
                        if (!GetHasElementalArmorBonus(script, itProps, IP_CONST_DAMAGETYPE_FIRE, resistQuantity))
                        {
                            script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyDamageResistance(IP_CONST_DAMAGETYPE_FIRE, resistQuantity), target, 0.0f);
                        }
                        break;
                    }
                #endregion
                #region Black, Green, or Copper Dragon
                case GMATERIAL_CREATURE_BLACK_DRAGON:
                case GMATERIAL_CREATURE_GREEN_DRAGON:
                case GMATERIAL_CREATURE_COPPER_DRAGON:
                    {
                        bool shield = false;
                        switch(rulesType)
                        {
                            case ARMOR_RULES_TYPE_BANDED_DRAGON:
                            case ARMOR_RULES_TYPE_BREASTPLATE_DRAGON:
                            case ARMOR_RULES_TYPE_FULL_PLATE_DRAGON:
                            case ARMOR_RULES_TYPE_HALF_PLATE_DRAGON:
                            case ARMOR_RULES_TYPE_HIDE_DRAGON:
                            case ARMOR_RULES_TYPE_LEATHER_DRAGON:
                            case ARMOR_RULES_TYPE_LEATHER_STUDDED_DRAGON:
                            case ARMOR_RULES_TYPE_PADDED_DRAGON:
                            case ARMOR_RULES_TYPE_SCALE_DRAGON:
                            case ARMOR_RULES_TYPE_SPLINT_DRAGON:
                                {
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SHIELD_HEAVY_DRAGON:
                            case ARMOR_RULES_TYPE_SHIELD_LIGHT_DRAGON:
                            case ARMOR_RULES_TYPE_SHIELD_TOWER_DRAGON:
                                {
                                    shield = true;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_BANDED:
                            case ARMOR_RULES_TYPE_BANDED_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_BANDED_MASTERWORK:
                            case ARMOR_RULES_TYPE_BANDED_MITHRAL:
                            case ARMOR_RULES_TYPE_BANDED_LIVING:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_BANDED_DRAGON);
                                    value = ArmorRulesTypeValues[ARMOR_RULES_TYPE_BANDED_DRAGON];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_BREASTPLATE:
                            case ARMOR_RULES_TYPE_BREASTPLATE_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_BREASTPLATE_MASTERWORK:
                            case ARMOR_RULES_TYPE_BREASTPLATE_MITHRAL:
                            case ARMOR_RULES_TYPE_BREASTPLATE_LIVING:
                            case ARMOR_RULES_TYPE_BREASTPLATE_DUSKWOOD:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_BREASTPLATE_DRAGON);
                                    value = ArmorRulesTypeValues[ARMOR_RULES_TYPE_BREASTPLATE_DRAGON];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_FULL_PLATE:
                            case ARMOR_RULES_TYPE_FULL_PLATE_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_FULL_PLATE_MASTERWORK:
                            case ARMOR_RULES_TYPE_FULL_PLATE_MITHRAL:
                            case ARMOR_RULES_TYPE_FULL_PLATE_LIVING:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_FULL_PLATE_DRAGON);
                                    value = ArmorRulesTypeValues[ARMOR_RULES_TYPE_FULL_PLATE_DRAGON];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_HALF_PLATE:
                            case ARMOR_RULES_TYPE_HALF_PLATE_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_HALF_PLATE_MASTERWORK:
                            case ARMOR_RULES_TYPE_HALF_PLATE_MITHRAL:
                            case ARMOR_RULES_TYPE_HALF_PLATE_LIVING:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_HALF_PLATE_DRAGON);
                                    value = ArmorRulesTypeValues[ARMOR_RULES_TYPE_HALF_PLATE_DRAGON];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_HIDE:
                            case ARMOR_RULES_TYPE_HIDE_MASTERWORK:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_HIDE_DRAGON);
                                    value = ArmorRulesTypeValues[ARMOR_RULES_TYPE_HIDE_DRAGON];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_LEATHER:
                            case ARMOR_RULES_TYPE_LEATHER_MASTERWORK:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_LEATHER_DRAGON);
                                    value = ArmorRulesTypeValues[ARMOR_RULES_TYPE_LEATHER_DRAGON];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_STUDDED_LEATHER:
                            case ARMOR_RULES_TYPE_STUDDED_LEATHER_MASTERWORK:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_LEATHER_STUDDED_DRAGON);
                                    value = ArmorRulesTypeValues[ARMOR_RULES_TYPE_LEATHER_STUDDED_DRAGON];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_PADDED:
                            case ARMOR_RULES_TYPE_PADDED_MASTERWORK:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_PADDED_DRAGON);
                                    value = ArmorRulesTypeValues[ARMOR_RULES_TYPE_PADDED_DRAGON];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SCALE:
                            case ARMOR_RULES_TYPE_SCALE_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_SCALE_MASTERWORK:
                            case ARMOR_RULES_TYPE_SCALE_MITHRAL:
                            case ARMOR_RULES_TYPE_SCALE_LIVING:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_SCALE_DRAGON);
                                    value = ArmorRulesTypeValues[ARMOR_RULES_TYPE_SCALE_DRAGON];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SPLINT:
                            case ARMOR_RULES_TYPE_SPLINT_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_SPLINT_MASTERWORK:
                            case ARMOR_RULES_TYPE_SPLINT_MITHREAL:
                            case ARMOR_RULES_TYPE_SPLINT_LIVING:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_SPLINT_DRAGON);
                                    value = ArmorRulesTypeValues[ARMOR_RULES_TYPE_SPLINT_DRAGON];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SHIELD_HEAVY:
                            case ARMOR_RULES_TYPE_SHIELD_HEAVY_DARKWOOD:
                            case ARMOR_RULES_TYPE_SHIELD_HEAVY_MASTERWORK:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_SHIELD_HEAVY_DRAGON);
                                    value = ArmorRulesTypeValues[ARMOR_RULES_TYPE_SHIELD_HEAVY_DRAGON];
                                    shield = true;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SHIELD_LIGHT:
                            case ARMOR_RULES_TYPE_SHIELD_LIGHT_DARKWOOD:
                            case ARMOR_RULES_TYPE_SHIELD_LIGHT_MASTERWORK:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_SHIELD_LIGHT_DRAGON);
                                    value = ArmorRulesTypeValues[ARMOR_RULES_TYPE_SHIELD_LIGHT_DRAGON];
                                    shield = true;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SHIELD_TOWER:
                            case ARMOR_RULES_TYPE_SHIELD_TOWER_DARKWOOD:
                            case ARMOR_RULES_TYPE_SHIELD_TOWER_MASTERWORK:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_SHIELD_TOWER_DRAGON);
                                    value = ArmorRulesTypeValues[ARMOR_RULES_TYPE_SHIELD_TOWER_DRAGON];
                                    shield = true;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_CHAIN_SHIRT:
                            case ARMOR_RULES_TYPE_CHAIN_SHIRT_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_CHAIN_SHIRT_MASTERWORK:
                            case ARMOR_RULES_TYPE_CHAIN_SHIRT_MITHRAL:
                            case ARMOR_RULES_TYPE_CHAIN_SHIRT_LIVING:
                            case ARMOR_RULES_TYPE_CHAINMAIL:
                            case ARMOR_RULES_TYPE_CHAINMAIL_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_CHAINMAIL_MASTERWORK:
                            case ARMOR_RULES_TYPE_CHAINMAIL_MITHRAL:
                            case ARMOR_RULES_TYPE_CHAINMAIL_LIVING:
                            case ARMOR_RULES_TYPE_CLOTH:
                                {
                                    return -1;
                                }
                        }
                        if (shield)
                        {
                            if (!GetHasSpecificSavingThrowBonus(script, itProps, IP_CONST_SAVEVS_ACID, 2))
                            {
                                script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyBonusSavingThrowVsX(IP_CONST_SAVEVS_ACID, 2), target, 0.0f);
                            }
                        }
                        else
                        {
                            if (!GetHasElementalArmorBonus(script, itProps, IP_CONST_DAMAGETYPE_ACID, IP_CONST_DAMAGERESIST_5))
                            {
                                script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyDamageResistance(IP_CONST_DAMAGETYPE_ACID, IP_CONST_DAMAGERESIST_5), target, 0.0f);
                            }
                        }
                        break;
                    }
                #endregion
                #region Blue or Brass Dragon
                case GMATERIAL_CREATURE_BLUE_DRAGON:
                case GMATERIAL_CREATURE_BRONZE_DRAGON:
                    {
                        bool shield = false;
                        switch (rulesType)
                        {
                            case ARMOR_RULES_TYPE_BANDED_DRAGON:
                            case ARMOR_RULES_TYPE_BREASTPLATE_DRAGON:
                            case ARMOR_RULES_TYPE_FULL_PLATE_DRAGON:
                            case ARMOR_RULES_TYPE_HALF_PLATE_DRAGON:
                            case ARMOR_RULES_TYPE_HIDE_DRAGON:
                            case ARMOR_RULES_TYPE_LEATHER_DRAGON:
                            case ARMOR_RULES_TYPE_LEATHER_STUDDED_DRAGON:
                            case ARMOR_RULES_TYPE_PADDED_DRAGON:
                            case ARMOR_RULES_TYPE_SCALE_DRAGON:
                            case ARMOR_RULES_TYPE_SPLINT_DRAGON:
                                {
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SHIELD_HEAVY_DRAGON:
                            case ARMOR_RULES_TYPE_SHIELD_LIGHT_DRAGON:
                            case ARMOR_RULES_TYPE_SHIELD_TOWER_DRAGON:
                                {
                                    shield = true;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_BANDED:
                            case ARMOR_RULES_TYPE_BANDED_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_BANDED_MASTERWORK:
                            case ARMOR_RULES_TYPE_BANDED_MITHRAL:
                            case ARMOR_RULES_TYPE_BANDED_LIVING:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_BANDED_DRAGON);
                                    value = ArmorRulesTypeValues[ARMOR_RULES_TYPE_BANDED_DRAGON];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_BREASTPLATE:
                            case ARMOR_RULES_TYPE_BREASTPLATE_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_BREASTPLATE_MASTERWORK:
                            case ARMOR_RULES_TYPE_BREASTPLATE_MITHRAL:
                            case ARMOR_RULES_TYPE_BREASTPLATE_LIVING:
                            case ARMOR_RULES_TYPE_BREASTPLATE_DUSKWOOD:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_BREASTPLATE_DRAGON);
                                    value = ArmorRulesTypeValues[ARMOR_RULES_TYPE_BREASTPLATE_DRAGON];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_FULL_PLATE:
                            case ARMOR_RULES_TYPE_FULL_PLATE_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_FULL_PLATE_MASTERWORK:
                            case ARMOR_RULES_TYPE_FULL_PLATE_MITHRAL:
                            case ARMOR_RULES_TYPE_FULL_PLATE_LIVING:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_FULL_PLATE_DRAGON);
                                    value = ArmorRulesTypeValues[ARMOR_RULES_TYPE_FULL_PLATE_DRAGON];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_HALF_PLATE:
                            case ARMOR_RULES_TYPE_HALF_PLATE_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_HALF_PLATE_MASTERWORK:
                            case ARMOR_RULES_TYPE_HALF_PLATE_MITHRAL:
                            case ARMOR_RULES_TYPE_HALF_PLATE_LIVING:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_HALF_PLATE_DRAGON);
                                    value = ArmorRulesTypeValues[ARMOR_RULES_TYPE_HALF_PLATE_DRAGON];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_HIDE:
                            case ARMOR_RULES_TYPE_HIDE_MASTERWORK:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_HIDE_DRAGON);
                                    value = ArmorRulesTypeValues[ARMOR_RULES_TYPE_HIDE_DRAGON];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_LEATHER:
                            case ARMOR_RULES_TYPE_LEATHER_MASTERWORK:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_LEATHER_DRAGON);
                                    value = ArmorRulesTypeValues[ARMOR_RULES_TYPE_LEATHER_DRAGON];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_STUDDED_LEATHER:
                            case ARMOR_RULES_TYPE_STUDDED_LEATHER_MASTERWORK:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_LEATHER_STUDDED_DRAGON);
                                    value = ArmorRulesTypeValues[ARMOR_RULES_TYPE_LEATHER_STUDDED_DRAGON];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_PADDED:
                            case ARMOR_RULES_TYPE_PADDED_MASTERWORK:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_PADDED_DRAGON);
                                    value = ArmorRulesTypeValues[ARMOR_RULES_TYPE_PADDED_DRAGON];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SCALE:
                            case ARMOR_RULES_TYPE_SCALE_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_SCALE_MASTERWORK:
                            case ARMOR_RULES_TYPE_SCALE_MITHRAL:
                            case ARMOR_RULES_TYPE_SCALE_LIVING:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_SCALE_DRAGON);
                                    value = ArmorRulesTypeValues[ARMOR_RULES_TYPE_SCALE_DRAGON];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SPLINT:
                            case ARMOR_RULES_TYPE_SPLINT_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_SPLINT_MASTERWORK:
                            case ARMOR_RULES_TYPE_SPLINT_MITHREAL:
                            case ARMOR_RULES_TYPE_SPLINT_LIVING:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_SPLINT_DRAGON);
                                    value = ArmorRulesTypeValues[ARMOR_RULES_TYPE_SPLINT_DRAGON];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SHIELD_HEAVY:
                            case ARMOR_RULES_TYPE_SHIELD_HEAVY_DARKWOOD:
                            case ARMOR_RULES_TYPE_SHIELD_HEAVY_MASTERWORK:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_SHIELD_HEAVY_DRAGON);
                                    value = ArmorRulesTypeValues[ARMOR_RULES_TYPE_SHIELD_HEAVY_DRAGON];
                                    shield = true;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SHIELD_LIGHT:
                            case ARMOR_RULES_TYPE_SHIELD_LIGHT_DARKWOOD:
                            case ARMOR_RULES_TYPE_SHIELD_LIGHT_MASTERWORK:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_SHIELD_LIGHT_DRAGON);
                                    value = ArmorRulesTypeValues[ARMOR_RULES_TYPE_SHIELD_LIGHT_DRAGON];
                                    shield = true;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SHIELD_TOWER:
                            case ARMOR_RULES_TYPE_SHIELD_TOWER_DARKWOOD:
                            case ARMOR_RULES_TYPE_SHIELD_TOWER_MASTERWORK:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_SHIELD_TOWER_DRAGON);
                                    value = ArmorRulesTypeValues[ARMOR_RULES_TYPE_SHIELD_TOWER_DRAGON];
                                    shield = true;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_CHAIN_SHIRT:
                            case ARMOR_RULES_TYPE_CHAIN_SHIRT_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_CHAIN_SHIRT_MASTERWORK:
                            case ARMOR_RULES_TYPE_CHAIN_SHIRT_MITHRAL:
                            case ARMOR_RULES_TYPE_CHAIN_SHIRT_LIVING:
                            case ARMOR_RULES_TYPE_CHAINMAIL:
                            case ARMOR_RULES_TYPE_CHAINMAIL_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_CHAINMAIL_MASTERWORK:
                            case ARMOR_RULES_TYPE_CHAINMAIL_MITHRAL:
                            case ARMOR_RULES_TYPE_CHAINMAIL_LIVING:
                            case ARMOR_RULES_TYPE_CLOTH:
                                {
                                    return -1;
                                }
                        }
                        if (shield)
                        {
                            if (!GetHasSpecificSavingThrowBonus(script, itProps, IP_CONST_SAVEVS_ELECTRICAL, 2))
                            {
                                script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyBonusSavingThrowVsX(IP_CONST_SAVEVS_ELECTRICAL, 2), target, 0.0f);
                            }
                        }
                        else
                        {
                            if (!GetHasElementalArmorBonus(script, itProps, IP_CONST_DAMAGETYPE_ELECTRICAL, IP_CONST_DAMAGERESIST_5))
                            {
                                script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyDamageResistance(IP_CONST_DAMAGETYPE_ELECTRICAL, IP_CONST_DAMAGERESIST_5), target, 0.0f);
                            }
                        }
                        break;
                    }
                #endregion
                #region Red, Brass, or Gold Dragon
                case GMATERIAL_CREATURE_RED_DRAGON:
                case GMATERIAL_CREATURE_BRASS_DRAGON:
                case GMATERIAL_CREATURE_GOLD_DRAGON:
                    {
                        bool shield = false;
                        switch (rulesType)
                        {
                            case ARMOR_RULES_TYPE_BANDED_DRAGON:
                            case ARMOR_RULES_TYPE_BREASTPLATE_DRAGON:
                            case ARMOR_RULES_TYPE_FULL_PLATE_DRAGON:
                            case ARMOR_RULES_TYPE_HALF_PLATE_DRAGON:
                            case ARMOR_RULES_TYPE_HIDE_DRAGON:
                            case ARMOR_RULES_TYPE_LEATHER_DRAGON:
                            case ARMOR_RULES_TYPE_LEATHER_STUDDED_DRAGON:
                            case ARMOR_RULES_TYPE_PADDED_DRAGON:
                            case ARMOR_RULES_TYPE_SCALE_DRAGON:
                            case ARMOR_RULES_TYPE_SPLINT_DRAGON:
                                {
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SHIELD_HEAVY_DRAGON:
                            case ARMOR_RULES_TYPE_SHIELD_LIGHT_DRAGON:
                            case ARMOR_RULES_TYPE_SHIELD_TOWER_DRAGON:
                                {
                                    shield = true;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_BANDED:
                            case ARMOR_RULES_TYPE_BANDED_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_BANDED_MASTERWORK:
                            case ARMOR_RULES_TYPE_BANDED_MITHRAL:
                            case ARMOR_RULES_TYPE_BANDED_LIVING:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_BANDED_DRAGON);
                                    value = ArmorRulesTypeValues[ARMOR_RULES_TYPE_BANDED_DRAGON];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_BREASTPLATE:
                            case ARMOR_RULES_TYPE_BREASTPLATE_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_BREASTPLATE_MASTERWORK:
                            case ARMOR_RULES_TYPE_BREASTPLATE_MITHRAL:
                            case ARMOR_RULES_TYPE_BREASTPLATE_LIVING:
                            case ARMOR_RULES_TYPE_BREASTPLATE_DUSKWOOD:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_BREASTPLATE_DRAGON);
                                    value = ArmorRulesTypeValues[ARMOR_RULES_TYPE_BREASTPLATE_DRAGON];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_FULL_PLATE:
                            case ARMOR_RULES_TYPE_FULL_PLATE_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_FULL_PLATE_MASTERWORK:
                            case ARMOR_RULES_TYPE_FULL_PLATE_MITHRAL:
                            case ARMOR_RULES_TYPE_FULL_PLATE_LIVING:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_FULL_PLATE_DRAGON);
                                    value = ArmorRulesTypeValues[ARMOR_RULES_TYPE_FULL_PLATE_DRAGON];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_HALF_PLATE:
                            case ARMOR_RULES_TYPE_HALF_PLATE_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_HALF_PLATE_MASTERWORK:
                            case ARMOR_RULES_TYPE_HALF_PLATE_MITHRAL:
                            case ARMOR_RULES_TYPE_HALF_PLATE_LIVING:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_HALF_PLATE_DRAGON);
                                    value = ArmorRulesTypeValues[ARMOR_RULES_TYPE_HALF_PLATE_DRAGON];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_HIDE:
                            case ARMOR_RULES_TYPE_HIDE_MASTERWORK:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_HIDE_DRAGON);
                                    value = ArmorRulesTypeValues[ARMOR_RULES_TYPE_HIDE_DRAGON];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_LEATHER:
                            case ARMOR_RULES_TYPE_LEATHER_MASTERWORK:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_LEATHER_DRAGON);
                                    value = ArmorRulesTypeValues[ARMOR_RULES_TYPE_LEATHER_DRAGON];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_STUDDED_LEATHER:
                            case ARMOR_RULES_TYPE_STUDDED_LEATHER_MASTERWORK:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_LEATHER_STUDDED_DRAGON);
                                    value = ArmorRulesTypeValues[ARMOR_RULES_TYPE_LEATHER_STUDDED_DRAGON];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_PADDED:
                            case ARMOR_RULES_TYPE_PADDED_MASTERWORK:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_PADDED_DRAGON);
                                    value = ArmorRulesTypeValues[ARMOR_RULES_TYPE_PADDED_DRAGON];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SCALE:
                            case ARMOR_RULES_TYPE_SCALE_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_SCALE_MASTERWORK:
                            case ARMOR_RULES_TYPE_SCALE_MITHRAL:
                            case ARMOR_RULES_TYPE_SCALE_LIVING:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_SCALE_DRAGON);
                                    value = ArmorRulesTypeValues[ARMOR_RULES_TYPE_SCALE_DRAGON];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SPLINT:
                            case ARMOR_RULES_TYPE_SPLINT_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_SPLINT_MASTERWORK:
                            case ARMOR_RULES_TYPE_SPLINT_MITHREAL:
                            case ARMOR_RULES_TYPE_SPLINT_LIVING:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_SPLINT_DRAGON);
                                    value = ArmorRulesTypeValues[ARMOR_RULES_TYPE_SPLINT_DRAGON];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SHIELD_HEAVY:
                            case ARMOR_RULES_TYPE_SHIELD_HEAVY_DARKWOOD:
                            case ARMOR_RULES_TYPE_SHIELD_HEAVY_MASTERWORK:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_SHIELD_HEAVY_DRAGON);
                                    value = ArmorRulesTypeValues[ARMOR_RULES_TYPE_SHIELD_HEAVY_DRAGON];
                                    shield = true;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SHIELD_LIGHT:
                            case ARMOR_RULES_TYPE_SHIELD_LIGHT_DARKWOOD:
                            case ARMOR_RULES_TYPE_SHIELD_LIGHT_MASTERWORK:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_SHIELD_LIGHT_DRAGON);
                                    value = ArmorRulesTypeValues[ARMOR_RULES_TYPE_SHIELD_LIGHT_DRAGON];
                                    shield = true;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SHIELD_TOWER:
                            case ARMOR_RULES_TYPE_SHIELD_TOWER_DARKWOOD:
                            case ARMOR_RULES_TYPE_SHIELD_TOWER_MASTERWORK:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_SHIELD_TOWER_DRAGON);
                                    value = ArmorRulesTypeValues[ARMOR_RULES_TYPE_SHIELD_TOWER_DRAGON];
                                    shield = true;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_CHAIN_SHIRT:
                            case ARMOR_RULES_TYPE_CHAIN_SHIRT_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_CHAIN_SHIRT_MASTERWORK:
                            case ARMOR_RULES_TYPE_CHAIN_SHIRT_MITHRAL:
                            case ARMOR_RULES_TYPE_CHAIN_SHIRT_LIVING:
                            case ARMOR_RULES_TYPE_CHAINMAIL:
                            case ARMOR_RULES_TYPE_CHAINMAIL_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_CHAINMAIL_MASTERWORK:
                            case ARMOR_RULES_TYPE_CHAINMAIL_MITHRAL:
                            case ARMOR_RULES_TYPE_CHAINMAIL_LIVING:
                            case ARMOR_RULES_TYPE_CLOTH:
                                {
                                    return -1;
                                }
                        }
                        if (shield)
                        {
                            if (!GetHasSpecificSavingThrowBonus(script, itProps, IP_CONST_SAVEVS_FIRE, 2))
                            {
                                script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyBonusSavingThrowVsX(IP_CONST_SAVEVS_FIRE, 2), target, 0.0f);
                            }
                        }
                        else
                        {
                            if (!GetHasElementalArmorBonus(script, itProps, IP_CONST_DAMAGETYPE_FIRE, IP_CONST_DAMAGERESIST_5))
                            {
                                script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyDamageResistance(IP_CONST_DAMAGETYPE_FIRE, IP_CONST_DAMAGERESIST_5), target, 0.0f);
                            }
                        }
                        break;
                    }                
                #endregion
                #region White or Silver Dragon
                case GMATERIAL_CREATURE_WHITE_DRAGON:
                case GMATERIAL_CREATURE_SILVER_DRAGON:
                    {
                        bool shield = false;
                        switch (rulesType)
                        {
                            case ARMOR_RULES_TYPE_BANDED_DRAGON:
                            case ARMOR_RULES_TYPE_BREASTPLATE_DRAGON:
                            case ARMOR_RULES_TYPE_FULL_PLATE_DRAGON:
                            case ARMOR_RULES_TYPE_HALF_PLATE_DRAGON:
                            case ARMOR_RULES_TYPE_HIDE_DRAGON:
                            case ARMOR_RULES_TYPE_LEATHER_DRAGON:
                            case ARMOR_RULES_TYPE_LEATHER_STUDDED_DRAGON:
                            case ARMOR_RULES_TYPE_PADDED_DRAGON:
                            case ARMOR_RULES_TYPE_SCALE_DRAGON:
                            case ARMOR_RULES_TYPE_SPLINT_DRAGON:
                                {
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SHIELD_HEAVY_DRAGON:
                            case ARMOR_RULES_TYPE_SHIELD_LIGHT_DRAGON:
                            case ARMOR_RULES_TYPE_SHIELD_TOWER_DRAGON:
                                {
                                    shield = true;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_BANDED:
                            case ARMOR_RULES_TYPE_BANDED_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_BANDED_MASTERWORK:
                            case ARMOR_RULES_TYPE_BANDED_MITHRAL:
                            case ARMOR_RULES_TYPE_BANDED_LIVING:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_BANDED_DRAGON);
                                    value = ArmorRulesTypeValues[ARMOR_RULES_TYPE_BANDED_DRAGON];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_BREASTPLATE:
                            case ARMOR_RULES_TYPE_BREASTPLATE_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_BREASTPLATE_MASTERWORK:
                            case ARMOR_RULES_TYPE_BREASTPLATE_MITHRAL:
                            case ARMOR_RULES_TYPE_BREASTPLATE_LIVING:
                            case ARMOR_RULES_TYPE_BREASTPLATE_DUSKWOOD:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_BREASTPLATE_DRAGON);
                                    value = ArmorRulesTypeValues[ARMOR_RULES_TYPE_BREASTPLATE_DRAGON];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_FULL_PLATE:
                            case ARMOR_RULES_TYPE_FULL_PLATE_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_FULL_PLATE_MASTERWORK:
                            case ARMOR_RULES_TYPE_FULL_PLATE_MITHRAL:
                            case ARMOR_RULES_TYPE_FULL_PLATE_LIVING:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_FULL_PLATE_DRAGON);
                                    value = ArmorRulesTypeValues[ARMOR_RULES_TYPE_FULL_PLATE_DRAGON];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_HALF_PLATE:
                            case ARMOR_RULES_TYPE_HALF_PLATE_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_HALF_PLATE_MASTERWORK:
                            case ARMOR_RULES_TYPE_HALF_PLATE_MITHRAL:
                            case ARMOR_RULES_TYPE_HALF_PLATE_LIVING:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_HALF_PLATE_DRAGON);
                                    value = ArmorRulesTypeValues[ARMOR_RULES_TYPE_HALF_PLATE_DRAGON];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_HIDE:
                            case ARMOR_RULES_TYPE_HIDE_MASTERWORK:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_HIDE_DRAGON);
                                    value = ArmorRulesTypeValues[ARMOR_RULES_TYPE_HIDE_DRAGON];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_LEATHER:
                            case ARMOR_RULES_TYPE_LEATHER_MASTERWORK:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_LEATHER_DRAGON);
                                    value = ArmorRulesTypeValues[ARMOR_RULES_TYPE_LEATHER_DRAGON];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_STUDDED_LEATHER:
                            case ARMOR_RULES_TYPE_STUDDED_LEATHER_MASTERWORK:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_LEATHER_STUDDED_DRAGON);
                                    value = ArmorRulesTypeValues[ARMOR_RULES_TYPE_LEATHER_STUDDED_DRAGON];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_PADDED:
                            case ARMOR_RULES_TYPE_PADDED_MASTERWORK:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_PADDED_DRAGON);
                                    value = ArmorRulesTypeValues[ARMOR_RULES_TYPE_PADDED_DRAGON];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SCALE:
                            case ARMOR_RULES_TYPE_SCALE_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_SCALE_MASTERWORK:
                            case ARMOR_RULES_TYPE_SCALE_MITHRAL:
                            case ARMOR_RULES_TYPE_SCALE_LIVING:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_SCALE_DRAGON);
                                    value = ArmorRulesTypeValues[ARMOR_RULES_TYPE_SCALE_DRAGON];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SPLINT:
                            case ARMOR_RULES_TYPE_SPLINT_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_SPLINT_MASTERWORK:
                            case ARMOR_RULES_TYPE_SPLINT_MITHREAL:
                            case ARMOR_RULES_TYPE_SPLINT_LIVING:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_SPLINT_DRAGON);
                                    value = ArmorRulesTypeValues[ARMOR_RULES_TYPE_SPLINT_DRAGON];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SHIELD_HEAVY:
                            case ARMOR_RULES_TYPE_SHIELD_HEAVY_DARKWOOD:
                            case ARMOR_RULES_TYPE_SHIELD_HEAVY_MASTERWORK:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_SHIELD_HEAVY_DRAGON);
                                    value = ArmorRulesTypeValues[ARMOR_RULES_TYPE_SHIELD_HEAVY_DRAGON];
                                    shield = true;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SHIELD_LIGHT:
                            case ARMOR_RULES_TYPE_SHIELD_LIGHT_DARKWOOD:
                            case ARMOR_RULES_TYPE_SHIELD_LIGHT_MASTERWORK:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_SHIELD_LIGHT_DRAGON);
                                    value = ArmorRulesTypeValues[ARMOR_RULES_TYPE_SHIELD_LIGHT_DRAGON];
                                    shield = true;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SHIELD_TOWER:
                            case ARMOR_RULES_TYPE_SHIELD_TOWER_DARKWOOD:
                            case ARMOR_RULES_TYPE_SHIELD_TOWER_MASTERWORK:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_SHIELD_TOWER_DRAGON);
                                    value = ArmorRulesTypeValues[ARMOR_RULES_TYPE_SHIELD_TOWER_DRAGON];
                                    shield = true;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_CHAIN_SHIRT:
                            case ARMOR_RULES_TYPE_CHAIN_SHIRT_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_CHAIN_SHIRT_MASTERWORK:
                            case ARMOR_RULES_TYPE_CHAIN_SHIRT_MITHRAL:
                            case ARMOR_RULES_TYPE_CHAIN_SHIRT_LIVING:
                            case ARMOR_RULES_TYPE_CHAINMAIL:
                            case ARMOR_RULES_TYPE_CHAINMAIL_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_CHAINMAIL_MASTERWORK:
                            case ARMOR_RULES_TYPE_CHAINMAIL_MITHRAL:
                            case ARMOR_RULES_TYPE_CHAINMAIL_LIVING:
                            case ARMOR_RULES_TYPE_CLOTH:
                                {
                                    return -1;
                                }
                        }
                        if (shield)
                        {
                            if (!GetHasSpecificSavingThrowBonus(script, itProps, IP_CONST_SAVEVS_COLD, 2))
                            {
                                script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyBonusSavingThrowVsX(IP_CONST_SAVEVS_COLD, 2), target, 0.0f);
                            }
                        }
                        else
                        {
                            if (!GetHasElementalArmorBonus(script, itProps, IP_CONST_DAMAGETYPE_COLD, IP_CONST_DAMAGERESIST_5))
                            {
                                script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyDamageResistance(IP_CONST_DAMAGETYPE_COLD, IP_CONST_DAMAGERESIST_5), target, 0.0f);
                            }
                        }
                        break;
                    }
                #endregion
                #region Duskwood
                case GMATERIAL_WOOD_DUSKWOOD:
                    {
                        switch (rulesType)
                        {
                            case ARMOR_RULES_TYPE_BREASTPLATE_DUSKWOOD:
                                {
                                    break;
                                }
                            case ARMOR_RULES_TYPE_BREASTPLATE:
                            case ARMOR_RULES_TYPE_BREASTPLATE_DRAGON:
                            case ARMOR_RULES_TYPE_BREASTPLATE_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_BREASTPLATE_LIVING:
                            case ARMOR_RULES_TYPE_BREASTPLATE_MASTERWORK:
                            case ARMOR_RULES_TYPE_BREASTPLATE_MITHRAL:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_BREASTPLATE_DUSKWOOD);
                                    value = ArmorRulesTypeValues[ARMOR_RULES_TYPE_BREASTPLATE_DUSKWOOD];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SHIELD_HEAVY:
                            case ARMOR_RULES_TYPE_SHIELD_HEAVY_DARKWOOD:
                            case ARMOR_RULES_TYPE_SHIELD_HEAVY_DRAGON:
                            case ARMOR_RULES_TYPE_SHIELD_HEAVY_MITHRAL:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_SHIELD_HEAVY_MASTERWORK);
                                    value = 300 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_SHIELD_HEAVY_MASTERWORK];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SHIELD_HEAVY_MASTERWORK:
                                {
                                    value = 300 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_SHIELD_HEAVY_MASTERWORK];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SHIELD_LIGHT:
                            case ARMOR_RULES_TYPE_SHIELD_LIGHT_DARKWOOD:
                            case ARMOR_RULES_TYPE_SHIELD_LIGHT_DRAGON:
                            case ARMOR_RULES_TYPE_SHIELD_LIGHT_MITHRAL:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_SHIELD_LIGHT_MASTERWORK);
                                    value = 300 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_SHIELD_LIGHT_MASTERWORK];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SHIELD_LIGHT_MASTERWORK:
                                {
                                    value = 300 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_SHIELD_LIGHT_MASTERWORK];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SHIELD_TOWER:
                            case ARMOR_RULES_TYPE_SHIELD_TOWER_DARKWOOD:
                            case ARMOR_RULES_TYPE_SHIELD_TOWER_DRAGON:
                            case ARMOR_RULES_TYPE_SHIELD_TOWER_MITHRAL:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_SHIELD_TOWER_MASTERWORK);
                                    value = 300 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_SHIELD_TOWER_MASTERWORK];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SHIELD_TOWER_MASTERWORK:
                                {
                                    value = 300 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_SHIELD_TOWER_MASTERWORK];
                                    break;
                                }
                            default:
                                {
                                    return -1;
                                }
                        }
                        break;
                    }
                #endregion
                #region Fever Iron
                case GMATERIAL_FEVER_IRON:
                    {
                        int resistQuantity = IP_CONST_DAMAGERESIST_2;
                        switch (rulesType)
                        {
                            case ARMOR_RULES_TYPE_BANDED:
                            case ARMOR_RULES_TYPE_BANDED_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_BANDED_MITHRAL:
                            case ARMOR_RULES_TYPE_BANDED_LIVING:
                            case ARMOR_RULES_TYPE_BANDED_DRAGON:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_BANDED_MASTERWORK);
                                    value = 5000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_BANDED];
                                    resistQuantity = IP_CONST_DAMAGERESIST_6;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_BANDED_MASTERWORK:
                                {
                                    value = 5000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_BANDED];
                                    resistQuantity = IP_CONST_DAMAGERESIST_6;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_BREASTPLATE:
                            case ARMOR_RULES_TYPE_BREASTPLATE_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_BREASTPLATE_MITHRAL:
                            case ARMOR_RULES_TYPE_BREASTPLATE_LIVING:
                            case ARMOR_RULES_TYPE_BREASTPLATE_DRAGON:
                            case ARMOR_RULES_TYPE_BREASTPLATE_DUSKWOOD:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_BREASTPLATE_MASTERWORK);
                                    value = 3000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_BREASTPLATE];
                                    resistQuantity = IP_CONST_DAMAGERESIST_4;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_BREASTPLATE_MASTERWORK:
                                {
                                    value = 3000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_BREASTPLATE];
                                    resistQuantity = IP_CONST_DAMAGERESIST_4;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_CHAIN_SHIRT:
                            case ARMOR_RULES_TYPE_CHAIN_SHIRT_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_CHAIN_SHIRT_MITHRAL:
                            case ARMOR_RULES_TYPE_CHAIN_SHIRT_LIVING:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_CHAIN_SHIRT_MASTERWORK);
                                    value = 1500 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_CHAIN_SHIRT];
                                    resistQuantity = IP_CONST_DAMAGERESIST_2;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_CHAIN_SHIRT_MASTERWORK:
                                {
                                    value = 1500 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_CHAIN_SHIRT];
                                    resistQuantity = IP_CONST_DAMAGERESIST_2;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_CHAINMAIL:
                            case ARMOR_RULES_TYPE_CHAINMAIL_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_CHAINMAIL_MITHRAL:
                            case ARMOR_RULES_TYPE_CHAINMAIL_LIVING:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_CHAINMAIL_MASTERWORK);
                                    value = 3000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_CHAINMAIL];
                                    resistQuantity = IP_CONST_DAMAGERESIST_4;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_CHAINMAIL_MASTERWORK:
                                {
                                    value = 3000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_CHAINMAIL];
                                    resistQuantity = IP_CONST_DAMAGERESIST_4;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_FULL_PLATE:
                            case ARMOR_RULES_TYPE_FULL_PLATE_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_FULL_PLATE_MITHRAL:
                            case ARMOR_RULES_TYPE_FULL_PLATE_LIVING:
                            case ARMOR_RULES_TYPE_FULL_PLATE_DRAGON:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_FULL_PLATE_MASTERWORK);
                                    value = 5000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_FULL_PLATE];
                                    resistQuantity = IP_CONST_DAMAGERESIST_6;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_FULL_PLATE_MASTERWORK:
                                {
                                    value = 5000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_FULL_PLATE];
                                    resistQuantity = IP_CONST_DAMAGERESIST_6;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_HALF_PLATE:
                            case ARMOR_RULES_TYPE_HALF_PLATE_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_HALF_PLATE_MITHRAL:
                            case ARMOR_RULES_TYPE_HALF_PLATE_LIVING:
                            case ARMOR_RULES_TYPE_HALF_PLATE_DRAGON:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_HALF_PLATE_MASTERWORK);
                                    value = 5000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_HALF_PLATE];
                                    resistQuantity = IP_CONST_DAMAGERESIST_6;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_HALF_PLATE_MASTERWORK:
                                {
                                    value = 5000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_HALF_PLATE];
                                    resistQuantity = IP_CONST_DAMAGERESIST_6;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SCALE:
                            case ARMOR_RULES_TYPE_SCALE_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_SCALE_MITHRAL:
                            case ARMOR_RULES_TYPE_SCALE_LIVING:
                            case ARMOR_RULES_TYPE_SCALE_DRAGON:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_SCALE_MASTERWORK);
                                    value = 3000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_SCALE];
                                    resistQuantity = IP_CONST_DAMAGERESIST_4;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SCALE_MASTERWORK:
                                {
                                    value = 3000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_SCALE];
                                    resistQuantity = IP_CONST_DAMAGERESIST_4;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SHIELD_HEAVY:
                            case ARMOR_RULES_TYPE_SHIELD_HEAVY_DARKWOOD:
                            case ARMOR_RULES_TYPE_SHIELD_HEAVY_MITHRAL:
                            case ARMOR_RULES_TYPE_SHIELD_HEAVY_DRAGON:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_SHIELD_HEAVY_MASTERWORK);
                                    value = 1500 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_SHIELD_HEAVY];
                                    resistQuantity = IP_CONST_DAMAGERESIST_2;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SHIELD_HEAVY_MASTERWORK:
                                {
                                    value = 1500 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_SHIELD_HEAVY];
                                    resistQuantity = IP_CONST_DAMAGERESIST_2;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SHIELD_LIGHT:
                            case ARMOR_RULES_TYPE_SHIELD_LIGHT_DARKWOOD:
                            case ARMOR_RULES_TYPE_SHIELD_LIGHT_MITHRAL:
                            case ARMOR_RULES_TYPE_SHIELD_LIGHT_DRAGON:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_SHIELD_LIGHT_MASTERWORK);
                                    value = 1500 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_SHIELD_LIGHT];
                                    resistQuantity = IP_CONST_DAMAGERESIST_2;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SHIELD_LIGHT_MASTERWORK:
                                {
                                    value = 1500 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_SHIELD_LIGHT];
                                    resistQuantity = IP_CONST_DAMAGERESIST_2;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SHIELD_TOWER:
                            case ARMOR_RULES_TYPE_SHIELD_TOWER_DARKWOOD:
                            case ARMOR_RULES_TYPE_SHIELD_TOWER_MITHRAL:
                            case ARMOR_RULES_TYPE_SHIELD_TOWER_DRAGON:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_SHIELD_TOWER_MASTERWORK);
                                    value = 1500 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_SHIELD_TOWER];
                                    resistQuantity = IP_CONST_DAMAGERESIST_2;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SHIELD_TOWER_MASTERWORK:
                                {
                                    value = 1500 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_SHIELD_TOWER];
                                    resistQuantity = IP_CONST_DAMAGERESIST_2;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SPLINT:
                            case ARMOR_RULES_TYPE_SPLINT_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_SPLINT_MITHREAL:
                            case ARMOR_RULES_TYPE_SPLINT_LIVING:
                            case ARMOR_RULES_TYPE_SPLINT_DRAGON:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_SPLINT_MASTERWORK);
                                    value = 5000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_SPLINT];
                                    resistQuantity = IP_CONST_DAMAGERESIST_6;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SPLINT_MASTERWORK:
                                {
                                    value = 5000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_SPLINT];
                                    resistQuantity = IP_CONST_DAMAGERESIST_6;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_STUDDED_LEATHER:
                            case ARMOR_RULES_TYPE_STUDDED_LEATHER_MASTERWORK:
                            case ARMOR_RULES_TYPE_HIDE:
                            case ARMOR_RULES_TYPE_HIDE_MASTERWORK:
                            case ARMOR_RULES_TYPE_LEATHER:
                            case ARMOR_RULES_TYPE_LEATHER_MASTERWORK:
                            case ARMOR_RULES_TYPE_PADDED:
                            case ARMOR_RULES_TYPE_PADDED_MASTERWORK:
                            case ARMOR_RULES_TYPE_CLOTH:
                            case ARMOR_RULES_TYPE_PADDED_DRAGON:
                            case ARMOR_RULES_TYPE_LEATHER_DRAGON:
                            case ARMOR_RULES_TYPE_HIDE_DRAGON:
                            case ARMOR_RULES_TYPE_LEATHER_STUDDED_DRAGON:
                                {
                                    // Fever iron is a metal.
                                    return -1;
                                }
                        }
                        if (!GetHasElementalArmorBonus(script, itProps, IP_CONST_DAMAGETYPE_COLD, resistQuantity))
                        {
                            script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyDamageResistance(IP_CONST_DAMAGETYPE_COLD, resistQuantity), target, 0.0f);
                        }
                        break;
                    }
                #endregion
                #region Gold
                case GMATERIAL_GOLD:
                    {
                        int resistQuantity = IP_CONST_DAMAGERESIST_2;
                        switch (rulesType)
                        {
                            case ARMOR_RULES_TYPE_BANDED:
                            case ARMOR_RULES_TYPE_BANDED_MASTERWORK:
                            case ARMOR_RULES_TYPE_BANDED_MITHRAL:
                            case ARMOR_RULES_TYPE_BANDED_LIVING:
                            case ARMOR_RULES_TYPE_BANDED_DRAGON:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_BANDED_HEAVYMETAL);
                                    value = 10000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_BANDED];
                                    resistQuantity = IP_CONST_DAMAGERESIST_6;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_BANDED_HEAVYMETAL:
                                {
                                    value = 10000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_BANDED];
                                    resistQuantity = IP_CONST_DAMAGERESIST_6;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_BREASTPLATE:
                            case ARMOR_RULES_TYPE_BREASTPLATE_MASTERWORK:
                            case ARMOR_RULES_TYPE_BREASTPLATE_MITHRAL:
                            case ARMOR_RULES_TYPE_BREASTPLATE_LIVING:
                            case ARMOR_RULES_TYPE_BREASTPLATE_DRAGON:
                            case ARMOR_RULES_TYPE_BREASTPLATE_DUSKWOOD:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_BREASTPLATE_HEAVYMETAL);
                                    value = 6000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_BREASTPLATE];
                                    resistQuantity = IP_CONST_DAMAGERESIST_4;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_BREASTPLATE_HEAVYMETAL:
                                {
                                    value = 6000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_BREASTPLATE];
                                    resistQuantity = IP_CONST_DAMAGERESIST_4;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_CHAIN_SHIRT:
                            case ARMOR_RULES_TYPE_CHAIN_SHIRT_MASTERWORK:
                            case ARMOR_RULES_TYPE_CHAIN_SHIRT_MITHRAL:
                            case ARMOR_RULES_TYPE_CHAIN_SHIRT_LIVING:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_CHAIN_SHIRT_HEAVYMETAL);
                                    value = 3000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_CHAIN_SHIRT];
                                    resistQuantity = IP_CONST_DAMAGERESIST_2;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_CHAIN_SHIRT_HEAVYMETAL:
                                {
                                    value = 3000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_CHAIN_SHIRT];
                                    resistQuantity = IP_CONST_DAMAGERESIST_2;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_CHAINMAIL:
                            case ARMOR_RULES_TYPE_CHAINMAIL_MASTERWORK:
                            case ARMOR_RULES_TYPE_CHAINMAIL_MITHRAL:
                            case ARMOR_RULES_TYPE_CHAINMAIL_LIVING:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_CHAINMAIL_HEAVYMETAL);
                                    value = 6000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_CHAINMAIL];
                                    resistQuantity = IP_CONST_DAMAGERESIST_4;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_CHAINMAIL_HEAVYMETAL:
                                {
                                    value = 6000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_CHAINMAIL];
                                    resistQuantity = IP_CONST_DAMAGERESIST_4;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_FULL_PLATE:
                            case ARMOR_RULES_TYPE_FULL_PLATE_MASTERWORK:
                            case ARMOR_RULES_TYPE_FULL_PLATE_MITHRAL:
                            case ARMOR_RULES_TYPE_FULL_PLATE_LIVING:
                            case ARMOR_RULES_TYPE_FULL_PLATE_DRAGON:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_FULL_PLATE_HEAVYMETAL);
                                    value = 10000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_FULL_PLATE];
                                    resistQuantity = IP_CONST_DAMAGERESIST_6;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_FULL_PLATE_HEAVYMETAL:
                                {
                                    value = 10000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_FULL_PLATE];
                                    resistQuantity = IP_CONST_DAMAGERESIST_6;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_HALF_PLATE:
                            case ARMOR_RULES_TYPE_HALF_PLATE_MASTERWORK:
                            case ARMOR_RULES_TYPE_HALF_PLATE_MITHRAL:
                            case ARMOR_RULES_TYPE_HALF_PLATE_LIVING:
                            case ARMOR_RULES_TYPE_HALF_PLATE_DRAGON:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_HALF_PLATE_HEAVYMETAL);
                                    value = 10000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_HALF_PLATE];
                                    resistQuantity = IP_CONST_DAMAGERESIST_6;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_HALF_PLATE_HEAVYMETAL:
                                {
                                    value = 10000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_HALF_PLATE];
                                    resistQuantity = IP_CONST_DAMAGERESIST_6;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SCALE:
                            case ARMOR_RULES_TYPE_SCALE_MASTERWORK:
                            case ARMOR_RULES_TYPE_SCALE_MITHRAL:
                            case ARMOR_RULES_TYPE_SCALE_LIVING:
                            case ARMOR_RULES_TYPE_SCALE_DRAGON:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_SCALE_HEAVYMETAL);
                                    value = 6000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_SCALE];
                                    resistQuantity = IP_CONST_DAMAGERESIST_4;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SCALE_HEAVYMETAL:
                                {
                                    value = 6000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_SCALE];
                                    resistQuantity = IP_CONST_DAMAGERESIST_4;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SPLINT:
                            case ARMOR_RULES_TYPE_SPLINT_MASTERWORK:
                            case ARMOR_RULES_TYPE_SPLINT_MITHREAL:
                            case ARMOR_RULES_TYPE_SPLINT_LIVING:
                            case ARMOR_RULES_TYPE_SPLINT_DRAGON:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_SPLINT_HEAVYMETAL);
                                    value = 10000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_SPLINT];
                                    resistQuantity = IP_CONST_DAMAGERESIST_6;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SPLINT_HEAVYMETAL:
                                {
                                    value = 10000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_SPLINT];
                                    resistQuantity = IP_CONST_DAMAGERESIST_6;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SHIELD_HEAVY:
                            case ARMOR_RULES_TYPE_SHIELD_HEAVY_DARKWOOD:
                            case ARMOR_RULES_TYPE_SHIELD_HEAVY_MITHRAL:
                            case ARMOR_RULES_TYPE_SHIELD_HEAVY_MASTERWORK:
                            case ARMOR_RULES_TYPE_SHIELD_LIGHT:
                            case ARMOR_RULES_TYPE_SHIELD_LIGHT_DARKWOOD:
                            case ARMOR_RULES_TYPE_SHIELD_LIGHT_MITHRAL:
                            case ARMOR_RULES_TYPE_SHIELD_LIGHT_MASTERWORK:
                            case ARMOR_RULES_TYPE_SHIELD_TOWER:
                            case ARMOR_RULES_TYPE_SHIELD_TOWER_DARKWOOD:
                            case ARMOR_RULES_TYPE_SHIELD_TOWER_MITHRAL:
                            case ARMOR_RULES_TYPE_SHIELD_TOWER_MASTERWORK:
                            case ARMOR_RULES_TYPE_STUDDED_LEATHER:
                            case ARMOR_RULES_TYPE_STUDDED_LEATHER_MASTERWORK:
                            case ARMOR_RULES_TYPE_HIDE:
                            case ARMOR_RULES_TYPE_HIDE_MASTERWORK:
                            case ARMOR_RULES_TYPE_LEATHER:
                            case ARMOR_RULES_TYPE_LEATHER_MASTERWORK:
                            case ARMOR_RULES_TYPE_PADDED:
                            case ARMOR_RULES_TYPE_PADDED_MASTERWORK:
                            case ARMOR_RULES_TYPE_CLOTH:
                            case ARMOR_RULES_TYPE_PADDED_DRAGON:
                            case ARMOR_RULES_TYPE_LEATHER_DRAGON:
                            case ARMOR_RULES_TYPE_HIDE_DRAGON:
                            case ARMOR_RULES_TYPE_LEATHER_STUDDED_DRAGON:
                                {
                                    // Darksteel is a metal.
                                    return -1;
                                }
                        }
                        if (!GetHasElementalArmorBonus(script, itProps, IP_CONST_DAMAGETYPE_ACID, resistQuantity))
                        {
                            script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyDamageResistance(IP_CONST_DAMAGETYPE_ACID, resistQuantity), target, 0.0f);
                        }
                        if (!GetHasElementalArmorBonus(script, itProps, IP_CONST_DAMAGETYPE_FIRE, resistQuantity))
                        {
                            script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyDamageResistance(IP_CONST_DAMAGETYPE_FIRE, resistQuantity), target, 0.0f);
                        }
                        break;
                    }
                #endregion
                #region Hizagkuur
                case GMATERIAL_HIZAGKUUR:
                    {
                        int resistQuantity = IP_CONST_DAMAGERESIST_2;
                        switch (rulesType)
                        {
                            case ARMOR_RULES_TYPE_BANDED:
                            case ARMOR_RULES_TYPE_BANDED_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_BANDED_MITHRAL:
                            case ARMOR_RULES_TYPE_BANDED_LIVING:
                            case ARMOR_RULES_TYPE_BANDED_DRAGON:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_BANDED_MASTERWORK);
                                    value = 5000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_BANDED];
                                    resistQuantity = IP_CONST_DAMAGERESIST_6;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_BANDED_MASTERWORK:
                                {
                                    value = 5000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_BANDED];
                                    resistQuantity = IP_CONST_DAMAGERESIST_6;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_BREASTPLATE:
                            case ARMOR_RULES_TYPE_BREASTPLATE_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_BREASTPLATE_MITHRAL:
                            case ARMOR_RULES_TYPE_BREASTPLATE_LIVING:
                            case ARMOR_RULES_TYPE_BREASTPLATE_DRAGON:
                            case ARMOR_RULES_TYPE_BREASTPLATE_DUSKWOOD:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_BREASTPLATE_MASTERWORK);
                                    value = 3000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_BREASTPLATE];
                                    resistQuantity = IP_CONST_DAMAGERESIST_4;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_BREASTPLATE_MASTERWORK:
                                {
                                    value = 3000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_BREASTPLATE];
                                    resistQuantity = IP_CONST_DAMAGERESIST_4;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_CHAIN_SHIRT:
                            case ARMOR_RULES_TYPE_CHAIN_SHIRT_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_CHAIN_SHIRT_MITHRAL:
                            case ARMOR_RULES_TYPE_CHAIN_SHIRT_LIVING:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_CHAIN_SHIRT_MASTERWORK);
                                    value = 1500 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_CHAIN_SHIRT];
                                    resistQuantity = IP_CONST_DAMAGERESIST_2;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_CHAIN_SHIRT_MASTERWORK:
                                {
                                    value = 1500 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_CHAIN_SHIRT];
                                    resistQuantity = IP_CONST_DAMAGERESIST_2;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_CHAINMAIL:
                            case ARMOR_RULES_TYPE_CHAINMAIL_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_CHAINMAIL_MITHRAL:
                            case ARMOR_RULES_TYPE_CHAINMAIL_LIVING:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_CHAINMAIL_MASTERWORK);
                                    value = 3000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_CHAINMAIL];
                                    resistQuantity = IP_CONST_DAMAGERESIST_4;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_CHAINMAIL_MASTERWORK:
                                {
                                    value = 3000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_CHAINMAIL];
                                    resistQuantity = IP_CONST_DAMAGERESIST_4;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_FULL_PLATE:
                            case ARMOR_RULES_TYPE_FULL_PLATE_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_FULL_PLATE_MITHRAL:
                            case ARMOR_RULES_TYPE_FULL_PLATE_LIVING:
                            case ARMOR_RULES_TYPE_FULL_PLATE_DRAGON:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_FULL_PLATE_MASTERWORK);
                                    value = 5000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_FULL_PLATE];
                                    resistQuantity = IP_CONST_DAMAGERESIST_6;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_FULL_PLATE_MASTERWORK:
                                {
                                    value = 5000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_FULL_PLATE];
                                    resistQuantity = IP_CONST_DAMAGERESIST_6;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_HALF_PLATE:
                            case ARMOR_RULES_TYPE_HALF_PLATE_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_HALF_PLATE_MITHRAL:
                            case ARMOR_RULES_TYPE_HALF_PLATE_LIVING:
                            case ARMOR_RULES_TYPE_HALF_PLATE_DRAGON:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_HALF_PLATE_MASTERWORK);
                                    value = 5000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_HALF_PLATE];
                                    resistQuantity = IP_CONST_DAMAGERESIST_6;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_HALF_PLATE_MASTERWORK:
                                {
                                    value = 5000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_HALF_PLATE];
                                    resistQuantity = IP_CONST_DAMAGERESIST_6;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SCALE:
                            case ARMOR_RULES_TYPE_SCALE_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_SCALE_MITHRAL:
                            case ARMOR_RULES_TYPE_SCALE_LIVING:
                            case ARMOR_RULES_TYPE_SCALE_DRAGON:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_SCALE_MASTERWORK);
                                    value = 3000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_SCALE];
                                    resistQuantity = IP_CONST_DAMAGERESIST_4;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SCALE_MASTERWORK:
                                {
                                    value = 3000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_SCALE];
                                    resistQuantity = IP_CONST_DAMAGERESIST_4;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SHIELD_HEAVY:
                            case ARMOR_RULES_TYPE_SHIELD_HEAVY_DARKWOOD:
                            case ARMOR_RULES_TYPE_SHIELD_HEAVY_MITHRAL:
                            case ARMOR_RULES_TYPE_SHIELD_HEAVY_DRAGON:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_SHIELD_HEAVY_MASTERWORK);
                                    value = 1500 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_SHIELD_HEAVY];
                                    resistQuantity = IP_CONST_DAMAGERESIST_2;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SHIELD_HEAVY_MASTERWORK:
                                {
                                    value = 1500 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_SHIELD_HEAVY];
                                    resistQuantity = IP_CONST_DAMAGERESIST_2;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SHIELD_LIGHT:
                            case ARMOR_RULES_TYPE_SHIELD_LIGHT_DARKWOOD:
                            case ARMOR_RULES_TYPE_SHIELD_LIGHT_MITHRAL:
                            case ARMOR_RULES_TYPE_SHIELD_LIGHT_DRAGON:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_SHIELD_LIGHT_MASTERWORK);
                                    value = 1500 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_SHIELD_LIGHT];
                                    resistQuantity = IP_CONST_DAMAGERESIST_2;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SHIELD_LIGHT_MASTERWORK:
                                {
                                    value = 1500 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_SHIELD_LIGHT];
                                    resistQuantity = IP_CONST_DAMAGERESIST_2;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SHIELD_TOWER:
                            case ARMOR_RULES_TYPE_SHIELD_TOWER_DARKWOOD:
                            case ARMOR_RULES_TYPE_SHIELD_TOWER_MITHRAL:
                            case ARMOR_RULES_TYPE_SHIELD_TOWER_DRAGON:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_SHIELD_TOWER_MASTERWORK);
                                    value = 1500 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_SHIELD_TOWER];
                                    resistQuantity = IP_CONST_DAMAGERESIST_2;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SHIELD_TOWER_MASTERWORK:
                                {
                                    value = 1500 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_SHIELD_TOWER];
                                    resistQuantity = IP_CONST_DAMAGERESIST_2;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SPLINT:
                            case ARMOR_RULES_TYPE_SPLINT_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_SPLINT_MITHREAL:
                            case ARMOR_RULES_TYPE_SPLINT_LIVING:
                            case ARMOR_RULES_TYPE_SPLINT_DRAGON:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_SPLINT_MASTERWORK);
                                    value = 5000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_SPLINT];
                                    resistQuantity = IP_CONST_DAMAGERESIST_6;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SPLINT_MASTERWORK:
                                {
                                    value = 5000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_SPLINT];
                                    resistQuantity = IP_CONST_DAMAGERESIST_6;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_STUDDED_LEATHER:
                            case ARMOR_RULES_TYPE_STUDDED_LEATHER_MASTERWORK:
                            case ARMOR_RULES_TYPE_HIDE:
                            case ARMOR_RULES_TYPE_HIDE_MASTERWORK:
                            case ARMOR_RULES_TYPE_LEATHER:
                            case ARMOR_RULES_TYPE_LEATHER_MASTERWORK:
                            case ARMOR_RULES_TYPE_PADDED:
                            case ARMOR_RULES_TYPE_PADDED_MASTERWORK:
                            case ARMOR_RULES_TYPE_CLOTH:
                            case ARMOR_RULES_TYPE_PADDED_DRAGON:
                            case ARMOR_RULES_TYPE_LEATHER_DRAGON:
                            case ARMOR_RULES_TYPE_HIDE_DRAGON:
                            case ARMOR_RULES_TYPE_LEATHER_STUDDED_DRAGON:
                                {
                                    // Fever iron is a metal.
                                    return -1;
                                }
                        }
                        if (!GetHasElementalArmorBonus(script, itProps, IP_CONST_DAMAGETYPE_ELECTRICAL, resistQuantity))
                        {
                            script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyDamageResistance(IP_CONST_DAMAGETYPE_ELECTRICAL, resistQuantity), target, 0.0f);
                        }
                        break;
                    }
                #endregion
                #region Living Metal
                case GMATERIAL_LIVING_METAL:
                    {
                        switch (rulesType)
                        {
                            case ARMOR_RULES_TYPE_BANDED_LIVING:
                            case ARMOR_RULES_TYPE_BREASTPLATE_LIVING:
                            case ARMOR_RULES_TYPE_CHAIN_SHIRT_LIVING:
                            case ARMOR_RULES_TYPE_CHAINMAIL_LIVING:
                            case ARMOR_RULES_TYPE_FULL_PLATE_LIVING:
                            case ARMOR_RULES_TYPE_HALF_PLATE_LIVING:
                            case ARMOR_RULES_TYPE_SCALE_LIVING:
                            case ARMOR_RULES_TYPE_SPLINT_LIVING:
                                {
                                    break;
                                }
                            case ARMOR_RULES_TYPE_BANDED:
                            case ARMOR_RULES_TYPE_BANDED_DRAGON:
                            case ARMOR_RULES_TYPE_BANDED_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_BANDED_MASTERWORK:
                            case ARMOR_RULES_TYPE_BANDED_MITHRAL:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_BANDED_LIVING);
                                    value = ArmorRulesTypeValues[ARMOR_RULES_TYPE_BANDED_LIVING];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_BREASTPLATE:
                            case ARMOR_RULES_TYPE_BREASTPLATE_DRAGON:
                            case ARMOR_RULES_TYPE_BREASTPLATE_DUSKWOOD:
                            case ARMOR_RULES_TYPE_BREASTPLATE_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_BREASTPLATE_MASTERWORK:
                            case ARMOR_RULES_TYPE_BREASTPLATE_MITHRAL:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_BREASTPLATE_LIVING);
                                    value = ArmorRulesTypeValues[ARMOR_RULES_TYPE_BREASTPLATE_LIVING];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_CHAIN_SHIRT:
                            case ARMOR_RULES_TYPE_CHAIN_SHIRT_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_CHAIN_SHIRT_MASTERWORK:
                            case ARMOR_RULES_TYPE_CHAIN_SHIRT_MITHRAL:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_CHAIN_SHIRT_LIVING);
                                    value = ArmorRulesTypeValues[ARMOR_RULES_TYPE_CHAIN_SHIRT_LIVING];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_CHAINMAIL:
                            case ARMOR_RULES_TYPE_CHAINMAIL_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_CHAINMAIL_MASTERWORK:
                            case ARMOR_RULES_TYPE_CHAINMAIL_MITHRAL:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_CHAINMAIL_LIVING);
                                    value = ArmorRulesTypeValues[ARMOR_RULES_TYPE_CHAINMAIL_LIVING];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_FULL_PLATE:
                            case ARMOR_RULES_TYPE_FULL_PLATE_DRAGON:
                            case ARMOR_RULES_TYPE_FULL_PLATE_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_FULL_PLATE_MASTERWORK:
                            case ARMOR_RULES_TYPE_FULL_PLATE_MITHRAL:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_FULL_PLATE_LIVING);
                                    value = ArmorRulesTypeValues[ARMOR_RULES_TYPE_FULL_PLATE_LIVING];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_HALF_PLATE:
                            case ARMOR_RULES_TYPE_HALF_PLATE_DRAGON:
                            case ARMOR_RULES_TYPE_HALF_PLATE_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_HALF_PLATE_MASTERWORK:
                            case ARMOR_RULES_TYPE_HALF_PLATE_MITHRAL:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_HALF_PLATE_LIVING);
                                    value = ArmorRulesTypeValues[ARMOR_RULES_TYPE_HALF_PLATE_LIVING];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SCALE:
                            case ARMOR_RULES_TYPE_SCALE_DRAGON:
                            case ARMOR_RULES_TYPE_SCALE_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_SCALE_MASTERWORK:
                            case ARMOR_RULES_TYPE_SCALE_MITHRAL:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_SCALE_LIVING);
                                    value = ArmorRulesTypeValues[ARMOR_RULES_TYPE_SCALE_LIVING];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SPLINT:
                            case ARMOR_RULES_TYPE_SPLINT_DRAGON:
                            case ARMOR_RULES_TYPE_SPLINT_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_SPLINT_MASTERWORK:
                            case ARMOR_RULES_TYPE_SPLINT_MITHREAL:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_SPLINT_LIVING);
                                    value = ArmorRulesTypeValues[ARMOR_RULES_TYPE_SPLINT_LIVING];
                                    break;
                                }
                            default:
                                {
                                    return -1;
                                }
                        }
                        break;
                    }
                #endregion
                #region Mithral
                case GMATERIAL_METAL_MITHRAL:
                    {
                        switch (rulesType)
                        {
                            case ARMOR_RULES_TYPE_BANDED_MITHRAL:
                            case ARMOR_RULES_TYPE_BREASTPLATE_MITHRAL:
                            case ARMOR_RULES_TYPE_CHAIN_SHIRT_MITHRAL:
                            case ARMOR_RULES_TYPE_CHAINMAIL_MITHRAL:
                            case ARMOR_RULES_TYPE_FULL_PLATE_MITHRAL:
                            case ARMOR_RULES_TYPE_HALF_PLATE_MITHRAL:
                            case ARMOR_RULES_TYPE_SCALE_MITHRAL:
                            case ARMOR_RULES_TYPE_SHIELD_HEAVY_MITHRAL:
                            case ARMOR_RULES_TYPE_SHIELD_LIGHT_MITHRAL:
                            case ARMOR_RULES_TYPE_SHIELD_TOWER_MITHRAL:
                            case ARMOR_RULES_TYPE_SPLINT_MITHREAL:
                                {
                                    break;
                                }
                            case ARMOR_RULES_TYPE_BANDED:
                            case ARMOR_RULES_TYPE_BANDED_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_BANDED_MASTERWORK:
                            case ARMOR_RULES_TYPE_BANDED_DRAGON:
                            case ARMOR_RULES_TYPE_BANDED_LIVING:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_BANDED_MITHRAL);
                                    value = ArmorRulesTypeValues[ARMOR_RULES_TYPE_BANDED_MITHRAL];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_BREASTPLATE:
                            case ARMOR_RULES_TYPE_BREASTPLATE_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_BREASTPLATE_MASTERWORK:
                            case ARMOR_RULES_TYPE_BREASTPLATE_DRAGON:
                            case ARMOR_RULES_TYPE_BREASTPLATE_LIVING:
                            case ARMOR_RULES_TYPE_BREASTPLATE_DUSKWOOD:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_BREASTPLATE_MITHRAL);
                                    value = ArmorRulesTypeValues[ARMOR_RULES_TYPE_BREASTPLATE_MITHRAL];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_CHAIN_SHIRT:
                            case ARMOR_RULES_TYPE_CHAIN_SHIRT_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_CHAIN_SHIRT_MASTERWORK:
                            case ARMOR_RULES_TYPE_CHAIN_SHIRT_LIVING:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_CHAIN_SHIRT_MITHRAL);
                                    value = ArmorRulesTypeValues[ARMOR_RULES_TYPE_CHAIN_SHIRT_MITHRAL];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_CHAINMAIL:
                            case ARMOR_RULES_TYPE_CHAINMAIL_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_CHAINMAIL_MASTERWORK:
                            case ARMOR_RULES_TYPE_CHAINMAIL_LIVING:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_CHAINMAIL_MITHRAL);
                                    value = ArmorRulesTypeValues[ARMOR_RULES_TYPE_CHAINMAIL_MITHRAL];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_FULL_PLATE:
                            case ARMOR_RULES_TYPE_FULL_PLATE_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_FULL_PLATE_MASTERWORK:
                            case ARMOR_RULES_TYPE_FULL_PLATE_DRAGON:
                            case ARMOR_RULES_TYPE_FULL_PLATE_LIVING:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_FULL_PLATE_MITHRAL);
                                    value = ArmorRulesTypeValues[ARMOR_RULES_TYPE_FULL_PLATE_MITHRAL];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_HALF_PLATE:
                            case ARMOR_RULES_TYPE_HALF_PLATE_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_HALF_PLATE_MASTERWORK:
                            case ARMOR_RULES_TYPE_HALF_PLATE_DRAGON:
                            case ARMOR_RULES_TYPE_HALF_PLATE_LIVING:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_HALF_PLATE_MITHRAL);
                                    value = ArmorRulesTypeValues[ARMOR_RULES_TYPE_HALF_PLATE_MITHRAL];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SCALE:
                            case ARMOR_RULES_TYPE_SCALE_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_SCALE_MASTERWORK:
                            case ARMOR_RULES_TYPE_SCALE_DRAGON:
                            case ARMOR_RULES_TYPE_SCALE_LIVING:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_SCALE_MITHRAL);
                                    value = ArmorRulesTypeValues[ARMOR_RULES_TYPE_SCALE_MITHRAL];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SHIELD_HEAVY:
                            case ARMOR_RULES_TYPE_SHIELD_HEAVY_DARKWOOD:
                            case ARMOR_RULES_TYPE_SHIELD_HEAVY_MASTERWORK:
                            case ARMOR_RULES_TYPE_SHIELD_HEAVY_DRAGON:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_SHIELD_HEAVY_MITHRAL);
                                    value = ArmorRulesTypeValues[ARMOR_RULES_TYPE_SHIELD_HEAVY_MITHRAL];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SHIELD_LIGHT:
                            case ARMOR_RULES_TYPE_SHIELD_LIGHT_DARKWOOD:
                            case ARMOR_RULES_TYPE_SHIELD_LIGHT_MASTERWORK:
                            case ARMOR_RULES_TYPE_SHIELD_LIGHT_DRAGON:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_SHIELD_LIGHT_MITHRAL);
                                    value = ArmorRulesTypeValues[ARMOR_RULES_TYPE_SHIELD_LIGHT_MITHRAL];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SHIELD_TOWER:
                            case ARMOR_RULES_TYPE_SHIELD_TOWER_DARKWOOD:
                            case ARMOR_RULES_TYPE_SHIELD_TOWER_MASTERWORK:
                            case ARMOR_RULES_TYPE_SHIELD_TOWER_DRAGON:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_SHIELD_TOWER_MITHRAL);
                                    value = ArmorRulesTypeValues[ARMOR_RULES_TYPE_SHIELD_TOWER_MITHRAL];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SPLINT:
                            case ARMOR_RULES_TYPE_SPLINT_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_SPLINT_MASTERWORK:
                            case ARMOR_RULES_TYPE_SPLINT_DRAGON:
                            case ARMOR_RULES_TYPE_SPLINT_LIVING:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_SPLINT_MITHREAL);
                                    value = ArmorRulesTypeValues[ARMOR_RULES_TYPE_SPLINT_MITHREAL];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_STUDDED_LEATHER:
                            case ARMOR_RULES_TYPE_STUDDED_LEATHER_MASTERWORK:
                            case ARMOR_RULES_TYPE_HIDE:
                            case ARMOR_RULES_TYPE_HIDE_MASTERWORK:
                            case ARMOR_RULES_TYPE_LEATHER:
                            case ARMOR_RULES_TYPE_LEATHER_MASTERWORK:
                            case ARMOR_RULES_TYPE_PADDED:
                            case ARMOR_RULES_TYPE_PADDED_MASTERWORK:
                            case ARMOR_RULES_TYPE_CLOTH:
                            case ARMOR_RULES_TYPE_PADDED_DRAGON:
                            case ARMOR_RULES_TYPE_LEATHER_DRAGON:
                            case ARMOR_RULES_TYPE_HIDE_DRAGON:
                            case ARMOR_RULES_TYPE_LEATHER_STUDDED_DRAGON:
                                {
                                    return -1;
                                }
                        }
                        break;
                    }
                #endregion
                #region Platinum
                case GMATERIAL_PLATINUM:
                    {
                        int resistQuantity = IP_CONST_DAMAGERESIST_2;
                        switch (rulesType)
                        {
                            case ARMOR_RULES_TYPE_BANDED:
                            case ARMOR_RULES_TYPE_BANDED_MASTERWORK:
                            case ARMOR_RULES_TYPE_BANDED_MITHRAL:
                            case ARMOR_RULES_TYPE_BANDED_DRAGON:
                            case ARMOR_RULES_TYPE_BANDED_LIVING:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_BANDED_HEAVYMETAL);
                                    value = 10000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_BANDED];
                                    resistQuantity = IP_CONST_DAMAGERESIST_6;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_BANDED_HEAVYMETAL:
                                {
                                    value = 10000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_BANDED];
                                    resistQuantity = IP_CONST_DAMAGERESIST_6;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_BREASTPLATE:
                            case ARMOR_RULES_TYPE_BREASTPLATE_MASTERWORK:
                            case ARMOR_RULES_TYPE_BREASTPLATE_MITHRAL:
                            case ARMOR_RULES_TYPE_BREASTPLATE_DRAGON:
                            case ARMOR_RULES_TYPE_BREASTPLATE_LIVING:
                            case ARMOR_RULES_TYPE_BREASTPLATE_DUSKWOOD:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_BREASTPLATE_HEAVYMETAL);
                                    value = 6000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_BREASTPLATE];
                                    resistQuantity = IP_CONST_DAMAGERESIST_4;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_BREASTPLATE_HEAVYMETAL:
                                {
                                    value = 6000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_BREASTPLATE];
                                    resistQuantity = IP_CONST_DAMAGERESIST_4;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_CHAIN_SHIRT:
                            case ARMOR_RULES_TYPE_CHAIN_SHIRT_MASTERWORK:
                            case ARMOR_RULES_TYPE_CHAIN_SHIRT_MITHRAL:
                            case ARMOR_RULES_TYPE_CHAIN_SHIRT_LIVING:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_CHAIN_SHIRT_HEAVYMETAL);
                                    value = 3000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_CHAIN_SHIRT];
                                    resistQuantity = IP_CONST_DAMAGERESIST_2;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_CHAIN_SHIRT_HEAVYMETAL:
                                {
                                    value = 3000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_CHAIN_SHIRT];
                                    resistQuantity = IP_CONST_DAMAGERESIST_2;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_CHAINMAIL:
                            case ARMOR_RULES_TYPE_CHAINMAIL_MASTERWORK:
                            case ARMOR_RULES_TYPE_CHAINMAIL_MITHRAL:
                            case ARMOR_RULES_TYPE_CHAINMAIL_LIVING:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_CHAINMAIL_HEAVYMETAL);
                                    value = 6000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_CHAINMAIL];
                                    resistQuantity = IP_CONST_DAMAGERESIST_4;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_CHAINMAIL_HEAVYMETAL:
                                {
                                    value = 6000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_CHAINMAIL];
                                    resistQuantity = IP_CONST_DAMAGERESIST_4;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_FULL_PLATE:
                            case ARMOR_RULES_TYPE_FULL_PLATE_MASTERWORK:
                            case ARMOR_RULES_TYPE_FULL_PLATE_MITHRAL:
                            case ARMOR_RULES_TYPE_FULL_PLATE_DRAGON:
                            case ARMOR_RULES_TYPE_FULL_PLATE_LIVING:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_FULL_PLATE_HEAVYMETAL);
                                    value = 10000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_FULL_PLATE];
                                    resistQuantity = IP_CONST_DAMAGERESIST_6;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_FULL_PLATE_HEAVYMETAL:
                                {
                                    value = 10000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_FULL_PLATE];
                                    resistQuantity = IP_CONST_DAMAGERESIST_6;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_HALF_PLATE:
                            case ARMOR_RULES_TYPE_HALF_PLATE_MASTERWORK:
                            case ARMOR_RULES_TYPE_HALF_PLATE_MITHRAL:
                            case ARMOR_RULES_TYPE_HALF_PLATE_DRAGON:
                            case ARMOR_RULES_TYPE_HALF_PLATE_LIVING:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_HALF_PLATE_HEAVYMETAL);
                                    value = 10000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_HALF_PLATE];
                                    resistQuantity = IP_CONST_DAMAGERESIST_6;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_HALF_PLATE_HEAVYMETAL:
                                {
                                    value = 10000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_HALF_PLATE];
                                    resistQuantity = IP_CONST_DAMAGERESIST_6;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SCALE:
                            case ARMOR_RULES_TYPE_SCALE_MASTERWORK:
                            case ARMOR_RULES_TYPE_SCALE_MITHRAL:
                            case ARMOR_RULES_TYPE_SCALE_DRAGON:
                            case ARMOR_RULES_TYPE_SCALE_LIVING:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_SCALE_HEAVYMETAL);
                                    value = 6000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_SCALE];
                                    resistQuantity = IP_CONST_DAMAGERESIST_4;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SCALE_HEAVYMETAL:
                                {
                                    value = 6000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_SCALE];
                                    resistQuantity = IP_CONST_DAMAGERESIST_4;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SPLINT:
                            case ARMOR_RULES_TYPE_SPLINT_MASTERWORK:
                            case ARMOR_RULES_TYPE_SPLINT_MITHREAL:
                            case ARMOR_RULES_TYPE_SPLINT_DRAGON:
                            case ARMOR_RULES_TYPE_SPLINT_LIVING:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_SPLINT_HEAVYMETAL);
                                    value = 10000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_SPLINT];
                                    resistQuantity = IP_CONST_DAMAGERESIST_6;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SPLINT_HEAVYMETAL:
                                {
                                    value = 10000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_SPLINT];
                                    resistQuantity = IP_CONST_DAMAGERESIST_6;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SHIELD_HEAVY:
                            case ARMOR_RULES_TYPE_SHIELD_HEAVY_DARKWOOD:
                            case ARMOR_RULES_TYPE_SHIELD_HEAVY_MITHRAL:
                            case ARMOR_RULES_TYPE_SHIELD_HEAVY_MASTERWORK:
                            case ARMOR_RULES_TYPE_SHIELD_LIGHT:
                            case ARMOR_RULES_TYPE_SHIELD_LIGHT_DARKWOOD:
                            case ARMOR_RULES_TYPE_SHIELD_LIGHT_MITHRAL:
                            case ARMOR_RULES_TYPE_SHIELD_LIGHT_MASTERWORK:
                            case ARMOR_RULES_TYPE_SHIELD_TOWER:
                            case ARMOR_RULES_TYPE_SHIELD_TOWER_DARKWOOD:
                            case ARMOR_RULES_TYPE_SHIELD_TOWER_MITHRAL:
                            case ARMOR_RULES_TYPE_SHIELD_TOWER_MASTERWORK:
                            case ARMOR_RULES_TYPE_STUDDED_LEATHER:
                            case ARMOR_RULES_TYPE_STUDDED_LEATHER_MASTERWORK:
                            case ARMOR_RULES_TYPE_HIDE:
                            case ARMOR_RULES_TYPE_HIDE_MASTERWORK:
                            case ARMOR_RULES_TYPE_LEATHER:
                            case ARMOR_RULES_TYPE_LEATHER_MASTERWORK:
                            case ARMOR_RULES_TYPE_PADDED:
                            case ARMOR_RULES_TYPE_PADDED_MASTERWORK:
                            case ARMOR_RULES_TYPE_CLOTH:
                            case ARMOR_RULES_TYPE_PADDED_DRAGON:
                            case ARMOR_RULES_TYPE_LEATHER_DRAGON:
                            case ARMOR_RULES_TYPE_HIDE_DRAGON:
                            case ARMOR_RULES_TYPE_LEATHER_STUDDED_DRAGON:
                                {
                                    // Darksteel is a metal.
                                    return -1;
                                }
                        }
                        if (!GetHasElementalArmorBonus(script, itProps, IP_CONST_DAMAGETYPE_COLD, resistQuantity))
                        {
                            script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyDamageResistance(IP_CONST_DAMAGETYPE_COLD, resistQuantity), target, 0.0f);
                        }
                        if (!GetHasElementalArmorBonus(script, itProps, IP_CONST_DAMAGETYPE_SONIC, resistQuantity))
                        {
                            script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyDamageResistance(IP_CONST_DAMAGETYPE_SONIC, resistQuantity), target, 0.0f);
                        }
                        break;
                    }
                #endregion
                #region Silver
                case GMATERIAL_METAL_ALCHEMICAL_SILVER:
                    {
                        int resistQuantity = IP_CONST_DAMAGERESIST_2;
                        switch (rulesType)
                        {
                            case ARMOR_RULES_TYPE_BANDED:
                            case ARMOR_RULES_TYPE_BANDED_MASTERWORK:
                            case ARMOR_RULES_TYPE_BANDED_MITHRAL:
                            case ARMOR_RULES_TYPE_BANDED_DRAGON:
                            case ARMOR_RULES_TYPE_BANDED_LIVING:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_BANDED_HEAVYMETAL);
                                    value = 5000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_BANDED];
                                    resistQuantity = IP_CONST_DAMAGERESIST_6;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_BANDED_HEAVYMETAL:
                                {
                                    value = 5000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_BANDED];
                                    resistQuantity = IP_CONST_DAMAGERESIST_6;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_BREASTPLATE:
                            case ARMOR_RULES_TYPE_BREASTPLATE_MASTERWORK:
                            case ARMOR_RULES_TYPE_BREASTPLATE_MITHRAL:
                            case ARMOR_RULES_TYPE_BREASTPLATE_DRAGON:
                            case ARMOR_RULES_TYPE_BREASTPLATE_LIVING:
                            case ARMOR_RULES_TYPE_BREASTPLATE_DUSKWOOD:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_BREASTPLATE_HEAVYMETAL);
                                    value = 3000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_BREASTPLATE];
                                    resistQuantity = IP_CONST_DAMAGERESIST_4;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_BREASTPLATE_HEAVYMETAL:
                                {
                                    value = 3000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_BREASTPLATE];
                                    resistQuantity = IP_CONST_DAMAGERESIST_4;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_CHAIN_SHIRT:
                            case ARMOR_RULES_TYPE_CHAIN_SHIRT_MASTERWORK:
                            case ARMOR_RULES_TYPE_CHAIN_SHIRT_MITHRAL:
                            case ARMOR_RULES_TYPE_CHAIN_SHIRT_LIVING:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_CHAIN_SHIRT_HEAVYMETAL);
                                    value = 1500 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_CHAIN_SHIRT];
                                    resistQuantity = IP_CONST_DAMAGERESIST_2;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_CHAIN_SHIRT_HEAVYMETAL:
                                {
                                    value = 1500 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_CHAIN_SHIRT];
                                    resistQuantity = IP_CONST_DAMAGERESIST_2;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_CHAINMAIL:
                            case ARMOR_RULES_TYPE_CHAINMAIL_MASTERWORK:
                            case ARMOR_RULES_TYPE_CHAINMAIL_MITHRAL:
                            case ARMOR_RULES_TYPE_CHAINMAIL_LIVING:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_CHAINMAIL_HEAVYMETAL);
                                    value = 3000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_CHAINMAIL];
                                    resistQuantity = IP_CONST_DAMAGERESIST_4;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_CHAINMAIL_HEAVYMETAL:
                                {
                                    value = 3000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_CHAINMAIL];
                                    resistQuantity = IP_CONST_DAMAGERESIST_4;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_FULL_PLATE:
                            case ARMOR_RULES_TYPE_FULL_PLATE_MASTERWORK:
                            case ARMOR_RULES_TYPE_FULL_PLATE_MITHRAL:
                            case ARMOR_RULES_TYPE_FULL_PLATE_DRAGON:
                            case ARMOR_RULES_TYPE_FULL_PLATE_LIVING:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_FULL_PLATE_HEAVYMETAL);
                                    value = 5000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_FULL_PLATE];
                                    resistQuantity = IP_CONST_DAMAGERESIST_6;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_FULL_PLATE_HEAVYMETAL:
                                {
                                    value = 5000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_FULL_PLATE];
                                    resistQuantity = IP_CONST_DAMAGERESIST_6;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_HALF_PLATE:
                            case ARMOR_RULES_TYPE_HALF_PLATE_MASTERWORK:
                            case ARMOR_RULES_TYPE_HALF_PLATE_MITHRAL:
                            case ARMOR_RULES_TYPE_HALF_PLATE_DRAGON:
                            case ARMOR_RULES_TYPE_HALF_PLATE_LIVING:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_HALF_PLATE_HEAVYMETAL);
                                    value = 5000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_HALF_PLATE];
                                    resistQuantity = IP_CONST_DAMAGERESIST_6;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_HALF_PLATE_HEAVYMETAL:
                                {
                                    value = 5000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_HALF_PLATE];
                                    resistQuantity = IP_CONST_DAMAGERESIST_6;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SCALE:
                            case ARMOR_RULES_TYPE_SCALE_MASTERWORK:
                            case ARMOR_RULES_TYPE_SCALE_MITHRAL:
                            case ARMOR_RULES_TYPE_SCALE_DRAGON:
                            case ARMOR_RULES_TYPE_SCALE_LIVING:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_SCALE_HEAVYMETAL);
                                    value = 3000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_SCALE];
                                    resistQuantity = IP_CONST_DAMAGERESIST_4;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SCALE_HEAVYMETAL:
                                {
                                    value = 3000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_SCALE];
                                    resistQuantity = IP_CONST_DAMAGERESIST_4;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SPLINT:
                            case ARMOR_RULES_TYPE_SPLINT_MASTERWORK:
                            case ARMOR_RULES_TYPE_SPLINT_MITHREAL:
                            case ARMOR_RULES_TYPE_SPLINT_DRAGON:
                            case ARMOR_RULES_TYPE_SPLINT_LIVING:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_SPLINT_HEAVYMETAL);
                                    value = 5000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_SPLINT];
                                    resistQuantity = IP_CONST_DAMAGERESIST_6;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SPLINT_HEAVYMETAL:
                                {
                                    value = 5000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_SPLINT];
                                    resistQuantity = IP_CONST_DAMAGERESIST_6;
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SHIELD_HEAVY:
                            case ARMOR_RULES_TYPE_SHIELD_HEAVY_DARKWOOD:
                            case ARMOR_RULES_TYPE_SHIELD_HEAVY_MITHRAL:
                            case ARMOR_RULES_TYPE_SHIELD_HEAVY_MASTERWORK:
                            case ARMOR_RULES_TYPE_SHIELD_LIGHT:
                            case ARMOR_RULES_TYPE_SHIELD_LIGHT_DARKWOOD:
                            case ARMOR_RULES_TYPE_SHIELD_LIGHT_MITHRAL:
                            case ARMOR_RULES_TYPE_SHIELD_LIGHT_MASTERWORK:
                            case ARMOR_RULES_TYPE_SHIELD_TOWER:
                            case ARMOR_RULES_TYPE_SHIELD_TOWER_DARKWOOD:
                            case ARMOR_RULES_TYPE_SHIELD_TOWER_MITHRAL:
                            case ARMOR_RULES_TYPE_SHIELD_TOWER_MASTERWORK:
                            case ARMOR_RULES_TYPE_STUDDED_LEATHER:
                            case ARMOR_RULES_TYPE_STUDDED_LEATHER_MASTERWORK:
                            case ARMOR_RULES_TYPE_HIDE:
                            case ARMOR_RULES_TYPE_HIDE_MASTERWORK:
                            case ARMOR_RULES_TYPE_LEATHER:
                            case ARMOR_RULES_TYPE_LEATHER_MASTERWORK:
                            case ARMOR_RULES_TYPE_PADDED:
                            case ARMOR_RULES_TYPE_PADDED_MASTERWORK:
                            case ARMOR_RULES_TYPE_CLOTH:
                            case ARMOR_RULES_TYPE_PADDED_DRAGON:
                            case ARMOR_RULES_TYPE_LEATHER_DRAGON:
                            case ARMOR_RULES_TYPE_HIDE_DRAGON:
                            case ARMOR_RULES_TYPE_LEATHER_STUDDED_DRAGON:
                                {
                                    // Darksteel is a metal.
                                    return -1;
                                }
                        }
                        if (!GetHasElementalArmorBonus(script, itProps, IP_CONST_DAMAGETYPE_ELECTRICAL, resistQuantity))
                        {
                            script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyDamageResistance(IP_CONST_DAMAGETYPE_ELECTRICAL, resistQuantity), target, 0.0f);
                        }
                        break;
                    }
                #endregion
                #region Sondarr
                case GMATERIAL_SONDARR:
                    {
                        switch (rulesType)
                        {
                            case ARMOR_RULES_TYPE_BANDED_DRAGON:
                            case ARMOR_RULES_TYPE_BANDED_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_BANDED_MITHRAL:
                            case ARMOR_RULES_TYPE_BANDED_LIVING:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_BANDED_MASTERWORK);
                                    value += 2000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_BANDED_MASTERWORK];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_BANDED:
                                {
                                    value += 2000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_BANDED];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_BANDED_MASTERWORK:
                                {
                                    value += 2000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_BANDED_MASTERWORK];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_BREASTPLATE_DRAGON:
                            case ARMOR_RULES_TYPE_BREASTPLATE_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_BREASTPLATE_MITHRAL:
                            case ARMOR_RULES_TYPE_BREASTPLATE_LIVING:
                            case ARMOR_RULES_TYPE_BREASTPLATE_DUSKWOOD:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_BREASTPLATE_MASTERWORK);
                                    value += 2000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_BREASTPLATE_MASTERWORK];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_BREASTPLATE:
                                {
                                    value += 2000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_BREASTPLATE];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_BREASTPLATE_MASTERWORK:
                                {
                                    value += 2000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_BREASTPLATE_MASTERWORK];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_CHAIN_SHIRT_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_CHAIN_SHIRT_MITHRAL:
                            case ARMOR_RULES_TYPE_CHAIN_SHIRT_LIVING:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_CHAIN_SHIRT_MASTERWORK);
                                    value += 2000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_CHAIN_SHIRT_MASTERWORK];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_CHAIN_SHIRT:
                                {
                                    value += 2000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_CHAIN_SHIRT];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_CHAIN_SHIRT_MASTERWORK:
                                {
                                    value += 2000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_CHAIN_SHIRT_MASTERWORK];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_CHAINMAIL_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_CHAINMAIL_MITHRAL:
                            case ARMOR_RULES_TYPE_CHAINMAIL_LIVING:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_CHAINMAIL_MASTERWORK);
                                    value += 2000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_CHAINMAIL_MASTERWORK];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_CHAINMAIL:
                                {
                                    value += 2000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_CHAINMAIL];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_CHAINMAIL_MASTERWORK:
                                {
                                    value += 2000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_CHAINMAIL_MASTERWORK];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_FULL_PLATE_DRAGON:
                            case ARMOR_RULES_TYPE_FULL_PLATE_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_FULL_PLATE_MITHRAL:
                            case ARMOR_RULES_TYPE_FULL_PLATE_LIVING:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_FULL_PLATE_MASTERWORK);
                                    value += 2000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_FULL_PLATE_MASTERWORK];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_FULL_PLATE:
                                {
                                    value += 2000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_FULL_PLATE];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_FULL_PLATE_MASTERWORK:
                                {
                                    value += 2000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_FULL_PLATE_MASTERWORK];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_HALF_PLATE_DRAGON:
                            case ARMOR_RULES_TYPE_HALF_PLATE_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_HALF_PLATE_MITHRAL:
                            case ARMOR_RULES_TYPE_HALF_PLATE_LIVING:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_HALF_PLATE_MASTERWORK);
                                    value += 2000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_HALF_PLATE_MASTERWORK];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_HALF_PLATE:
                                {
                                    value += 2000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_HALF_PLATE];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_HALF_PLATE_MASTERWORK:
                                {
                                    value += 2000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_HALF_PLATE_MASTERWORK];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SCALE_DRAGON:
                            case ARMOR_RULES_TYPE_SCALE_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_SCALE_MITHRAL:
                            case ARMOR_RULES_TYPE_SCALE_LIVING:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_SCALE_MASTERWORK);
                                    value += 2000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_SCALE_MASTERWORK];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SCALE:
                                {
                                    value += 2000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_SCALE];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SCALE_MASTERWORK:
                                {
                                    value += 2000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_SCALE_MASTERWORK];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SPLINT_DRAGON:
                            case ARMOR_RULES_TYPE_SPLINT_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_SPLINT_MITHREAL:
                            case ARMOR_RULES_TYPE_SPLINT_LIVING:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_SPLINT_MASTERWORK);
                                    value += 2000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_SPLINT_MASTERWORK];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SPLINT:
                                {
                                    value += 2000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_SPLINT];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SPLINT_MASTERWORK:
                                {
                                    value += 2000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_SPLINT_MASTERWORK];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_STUDDED_LEATHER:
                            case ARMOR_RULES_TYPE_STUDDED_LEATHER_MASTERWORK:
                            case ARMOR_RULES_TYPE_SHIELD_HEAVY:
                            case ARMOR_RULES_TYPE_SHIELD_HEAVY_DARKWOOD:
                            case ARMOR_RULES_TYPE_SHIELD_HEAVY_DRAGON:
                            case ARMOR_RULES_TYPE_SHIELD_HEAVY_MASTERWORK:
                            case ARMOR_RULES_TYPE_SHIELD_HEAVY_MITHRAL:
                            case ARMOR_RULES_TYPE_SHIELD_LIGHT:
                            case ARMOR_RULES_TYPE_SHIELD_LIGHT_DARKWOOD:
                            case ARMOR_RULES_TYPE_SHIELD_LIGHT_DRAGON:
                            case ARMOR_RULES_TYPE_SHIELD_LIGHT_MASTERWORK:
                            case ARMOR_RULES_TYPE_SHIELD_LIGHT_MITHRAL:
                            case ARMOR_RULES_TYPE_SHIELD_TOWER:
                            case ARMOR_RULES_TYPE_SHIELD_TOWER_DARKWOOD:
                            case ARMOR_RULES_TYPE_SHIELD_TOWER_DRAGON:
                            case ARMOR_RULES_TYPE_SHIELD_TOWER_MASTERWORK:
                            case ARMOR_RULES_TYPE_SHIELD_TOWER_MITHRAL:
                            case ARMOR_RULES_TYPE_HIDE:
                            case ARMOR_RULES_TYPE_HIDE_DRAGON:
                            case ARMOR_RULES_TYPE_HIDE_MASTERWORK:
                            case ARMOR_RULES_TYPE_LEATHER:
                            case ARMOR_RULES_TYPE_LEATHER_DRAGON:
                            case ARMOR_RULES_TYPE_LEATHER_MASTERWORK:
                            case ARMOR_RULES_TYPE_LEATHER_STUDDED_DRAGON:
                            case ARMOR_RULES_TYPE_PADDED:
                            case ARMOR_RULES_TYPE_PADDED_DRAGON:
                            case ARMOR_RULES_TYPE_PADDED_MASTERWORK:
                            case ARMOR_RULES_TYPE_CLOTH:
                                {
                                    return -1;
                                }
                        }
                        break;
                    }
                #endregion
                #region Suzailian Chainweave
                case GMATERIAL_SUZAILLIAN_CHAINWEAVE:
                    {
                        switch (rulesType)
                        {
                            case ARMOR_RULES_TYPE_CHAIN_SHIRT:
                            case ARMOR_RULES_TYPE_CHAIN_SHIRT_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_CHAIN_SHIRT_MITHRAL:
                            case ARMOR_RULES_TYPE_CHAIN_SHIRT_LIVING:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_CHAIN_SHIRT_MASTERWORK);
                                    value = 28000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_CHAIN_SHIRT];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_CHAIN_SHIRT_MASTERWORK:
                                {
                                    value = 28000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_CHAIN_SHIRT];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_CHAINMAIL:
                            case ARMOR_RULES_TYPE_CHAINMAIL_HEAVYMETAL:
                            case ARMOR_RULES_TYPE_CHAINMAIL_MITHRAL:
                            case ARMOR_RULES_TYPE_CHAINMAIL_LIVING:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_CHAINMAIL_MASTERWORK);
                                    value = 35000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_CHAINMAIL];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_CHAINMAIL_MASTERWORK:
                                {
                                    value = 35000 + ArmorRulesTypeValues[ARMOR_RULES_TYPE_CHAINMAIL];
                                    break;
                                }
                            default:
                                {
                                    return -1;
                                }
                        }
                        if (!GetHasElementalArmorBonus(script, itProps, IP_CONST_DAMAGETYPE_BLUDGEONING, IP_CONST_DAMAGERESIST_2))
                        {
                            script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyDamageResistance(IP_CONST_DAMAGETYPE_BLUDGEONING, IP_CONST_DAMAGERESIST_2), target, 0.0f);
                        }
                        if (!GetHasElementalArmorBonus(script, itProps, IP_CONST_DAMAGETYPE_SLASHING, IP_CONST_DAMAGERESIST_2))
                        {
                            script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyDamageResistance(IP_CONST_DAMAGETYPE_SLASHING, IP_CONST_DAMAGERESIST_2), target, 0.0f);
                        }
                        break;
                    }
                #endregion
                #region Zalantar
                case GMATERIAL_WOOD_DARKWOOD:
                    {
                        switch (rulesType)
                        {
                            case ARMOR_RULES_TYPE_SHIELD_HEAVY:
                            case ARMOR_RULES_TYPE_SHIELD_HEAVY_DRAGON:
                            case ARMOR_RULES_TYPE_SHIELD_HEAVY_MASTERWORK:
                            case ARMOR_RULES_TYPE_SHIELD_HEAVY_MITHRAL:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_SHIELD_HEAVY_DARKWOOD);
                                    value = ArmorRulesTypeValues[ARMOR_RULES_TYPE_SHIELD_HEAVY_DARKWOOD];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SHIELD_HEAVY_DARKWOOD:
                                {
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SHIELD_LIGHT:
                            case ARMOR_RULES_TYPE_SHIELD_LIGHT_DRAGON:
                            case ARMOR_RULES_TYPE_SHIELD_LIGHT_MASTERWORK:
                            case ARMOR_RULES_TYPE_SHIELD_LIGHT_MITHRAL:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_SHIELD_LIGHT_DARKWOOD);
                                    value = ArmorRulesTypeValues[ARMOR_RULES_TYPE_SHIELD_LIGHT_DARKWOOD];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SHIELD_LIGHT_DARKWOOD:
                                {
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SHIELD_TOWER:
                            case ARMOR_RULES_TYPE_SHIELD_TOWER_DRAGON:
                            case ARMOR_RULES_TYPE_SHIELD_TOWER_MASTERWORK:
                            case ARMOR_RULES_TYPE_SHIELD_TOWER_MITHRAL:
                                {
                                    script.SetArmorRulesType(target, ARMOR_RULES_TYPE_SHIELD_TOWER_DARKWOOD);
                                    value = ArmorRulesTypeValues[ARMOR_RULES_TYPE_SHIELD_TOWER_DARKWOOD];
                                    break;
                                }
                            case ARMOR_RULES_TYPE_SHIELD_TOWER_DARKWOOD:
                                {
                                    break;
                                }
                            default:
                                {
                                    return -1;
                                }
                        }
                        break;
                    }
                #endregion
                #region Banned Materials
                case GMATERIAL_FIENDBONE:
                case GMATERIAL_FRYSTALLINE:
                    {
                        return -1;
                    }
                #endregion
            }
            #endregion

            #region Check for early return, if the item is only masterwork or special material
            if (itProps.Count == 0)
            {
                return value;
            }
            #endregion

            #region Check for Use Restriction
            bool IsClassRestricted = GetIsUseRestrictedByClass(script, itProps);
            #endregion

            #region Calculate Magical Bonuses
            float effectivePlus = 0.0f;
            int ACvsEveryone = 0;
            int spellFoci = 0;
            #region Properties that are Indiscriminate
            foreach (PricedItemProperty prop in itProps)
            {
                int propType = script.GetItemPropertyType(prop.Property);
                switch (propType)
                {
                    #region Ability Bonus
                    case ITEM_PROPERTY_ABILITY_BONUS:
                        {
                            prop.Price = (script.GetItemPropertyCostTableValue(prop.Property) * script.GetItemPropertyCostTableValue(prop.Property) * 1000);
                            break;
                        }
                    #endregion
                    #region AC Bonus
                    case ITEM_PROPERTY_AC_BONUS:
                        {
                            if (script.GetItemPropertyCostTableValue(prop.Property) > ACvsEveryone)
                            {
                                ACvsEveryone = script.GetItemPropertyCostTableValue(prop.Property);
                                effectivePlus += script.GetItemPropertyCostTableValue(prop.Property);
                            }
                            break;
                        }
                    #endregion
                    #region Arcane Spell Failure Reduction
                    case ITEM_PROPERTY_ARCANE_SPELL_FAILURE:
                        {
                            switch (script.GetItemPropertyCostTableValue(prop.Property))
                            {
                                case IP_CONST_ARCANE_SPELL_FAILURE_MINUS_5_PERCENT:
                                    {
                                        effectivePlus += 0.5f;
                                        break;
                                    }
                                case IP_CONST_ARCANE_SPELL_FAILURE_MINUS_10_PERCENT:
                                    {
                                        effectivePlus += 1.0f;
                                        break;
                                    }
                                case IP_CONST_ARCANE_SPELL_FAILURE_MINUS_15_PERCENT:
                                    {
                                        effectivePlus += 1.5f;
                                        break;
                                    }
                                case IP_CONST_ARCANE_SPELL_FAILURE_MINUS_20_PERCENT:
                                    {
                                        effectivePlus += 2.0f;
                                        break;
                                    }
                                case IP_CONST_ARCANE_SPELL_FAILURE_MINUS_25_PERCENT:
                                    {
                                        effectivePlus += 2.5f;
                                        break;
                                    }
                                case IP_CONST_ARCANE_SPELL_FAILURE_MINUS_30_PERCENT:
                                    {
                                        effectivePlus += 3.0f;
                                        break;
                                    }
                                case IP_CONST_ARCANE_SPELL_FAILURE_MINUS_35_PERCENT:
                                    {
                                        effectivePlus += 3.5f;
                                        break;
                                    }
                                case IP_CONST_ARCANE_SPELL_FAILURE_MINUS_40_PERCENT:
                                    {
                                        effectivePlus += 4.0f;
                                        break;
                                    }
                                case IP_CONST_ARCANE_SPELL_FAILURE_MINUS_45_PERCENT:
                                    {
                                        effectivePlus += 4.5f;
                                        break;
                                    }
                                case IP_CONST_ARCANE_SPELL_FAILURE_MINUS_50_PERCENT:
                                    {
                                        effectivePlus += 5.0f;
                                        break;
                                    }
                                default:
                                    {
                                        // the others are all penalties; No influence on price.
                                        break;
                                    }
                            }
                            break;
                        }
                    #endregion
                    #region Bonus Feat
                    case ITEM_PROPERTY_BONUS_FEAT:
                        {
                            switch (script.GetItemPropertySubType(prop.Property))
                            {
                                case IP_CONST_FEAT_COMBAT_CASTING:
                                    {
                                        effectivePlus += 1.0f;
                                        break;
                                    }
                                case IP_CONST_FEAT_DEFLECT_ARROWS:
                                    {
                                        effectivePlus += 2.0f;
                                        break;
                                    }
                                case IP_CONST_FEAT_DODGE:
                                    {
                                        effectivePlus += 1.0f;
                                        break;
                                    }
                                case IP_CONST_FEAT_EXTRA_TURNING:
                                    {
                                        effectivePlus += 1.0f;
                                        break;
                                    }
                                case IP_CONST_FEAT_SPELLFOCUSABJ:
                                case IP_CONST_FEAT_SPELLFOCUSCON:
                                case IP_CONST_FEAT_SPELLFOCUSDIV:
                                case IP_CONST_FEAT_SPELLFOCUSENC:
                                case IP_CONST_FEAT_SPELLFOCUSEVO:
                                case IP_CONST_FEAT_SPELLFOCUSILL:
                                case IP_CONST_FEAT_SPELLFOCUSNEC:
                                    {
                                        switch (spellFoci)
                                        {
                                            case 0:
                                                effectivePlus += 1.0f;
                                                break;
                                            case 1:
                                                effectivePlus += 0.5f;
                                                break;
                                            case 2:
                                                effectivePlus += 0.5f;
                                                break;
                                            default:
                                                return -1;
                                        }
                                        break;
                                    }
                                case IP_CONST_FEAT_SPELLPENETRATION:
                                    {
                                        effectivePlus += 1.5f;
                                        break;
                                    }
                            }
                            break;
                        }
                    #endregion
                    #region Bonus Spell Slot
                    case ITEM_PROPERTY_BONUS_SPELL_SLOT_OF_LEVEL_N:
                        {
                            int level = script.GetItemPropertyCostTableValue(prop.Property);
                            if (level == 0)
                            {
                                prop.Price = 500;
                            }
                            else
                            {
                                prop.Price = level * level * 1000;
                            }
                            break;
                        }
                    #endregion
                    #region Cast Spell
                    case ITEM_PROPERTY_CAST_SPELL:
                        {
                            int spell = script.GetItemPropertySubType(prop.Property);
                            if (spell == IP_CONST_CASTSPELL_ACTIVATE_ITEM ||
                               spell == IP_CONST_CASTSPELL_UNIQUE_POWER ||
                               spell == IP_CONST_CASTSPELL_UNIQUE_POWER_SELF_ONLY)
                            {
                                // We can't price these, as their powers are custom scripted.
                                return -2;
                            }
                            float spellLevel = 0.0f;
                            float casterLevel = 0.0f;
                            float.TryParse(script.Get2DAString("iprp_spells", "InnateLvl", spell), out spellLevel);
                            float.TryParse(script.Get2DAString("iprp_spells", "CasterLvl", spell), out casterLevel);
                            if (spellLevel < 0.5f)
                            {
                                spellLevel = 0.5f;
                            }
                            if (casterLevel < 1.0f)
                            {
                                casterLevel = 1.0f;
                            }
                            float multiplier = spellLevel * casterLevel;
                            switch (script.GetItemPropertyCostTableValue(prop.Property))
                            {
                                case IP_CONST_CASTSPELL_NUMUSES_0_CHARGES_PER_USE:
                                    {
                                        return -1;
                                    }
                                case IP_CONST_CASTSPELL_NUMUSES_1_CHARGE_PER_USE:
                                    {
                                        prop.ChargedPrice = (int)(multiplier * 36);
                                        break;
                                    }
                                case IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY:
                                    {
                                        prop.Price = (int)(multiplier * 360);
                                        break;
                                    }
                                case IP_CONST_CASTSPELL_NUMUSES_2_CHARGES_PER_USE:
                                    {
                                        prop.ChargedPrice = (int)(multiplier * 18);
                                        break;
                                    }
                                case IP_CONST_CASTSPELL_NUMUSES_2_USES_PER_DAY:
                                    {
                                        prop.Price = (int)(multiplier * 720);
                                        break;
                                    }
                                case IP_CONST_CASTSPELL_NUMUSES_3_CHARGES_PER_USE:
                                    {
                                        prop.ChargedPrice = (int)(multiplier * 12);
                                        break;
                                    }
                                case IP_CONST_CASTSPELL_NUMUSES_3_USES_PER_DAY:
                                    {
                                        prop.Price = (int)(multiplier * 1080);
                                        break;
                                    }
                                case IP_CONST_CASTSPELL_NUMUSES_4_CHARGES_PER_USE:
                                    {
                                        prop.ChargedPrice = (int)(multiplier * 9);
                                        break;
                                    }
                                case IP_CONST_CASTSPELL_NUMUSES_4_USES_PER_DAY:
                                    {
                                        prop.Price = (int)(multiplier * 1440);
                                        break;
                                    }
                                case IP_CONST_CASTSPELL_NUMUSES_5_CHARGES_PER_USE:
                                    {
                                        prop.ChargedPrice = (int)(multiplier * 7);
                                        break;
                                    }
                                case IP_CONST_CASTSPELL_NUMUSES_5_USES_PER_DAY:
                                    {
                                        prop.Price = (int)(multiplier * 1800);
                                        break;
                                    }
                                case IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE:
                                    {
                                        if (script.GetItemCharges(target) > 0)
                                        {
                                            if (IsClassRestricted)
                                            {
                                                prop.ChargedPrice = (int)((multiplier * 25) / script.GetItemCharges(target));
                                            }
                                            else
                                            {
                                                prop.ChargedPrice = (int)((multiplier * 50) / script.GetItemCharges(target));
                                            }
                                        }
                                        else
                                        {
                                            if (IsClassRestricted)
                                            {
                                                prop.Price = (int)(multiplier * 25);
                                            }
                                            else
                                            {
                                                prop.Price = (int)(multiplier * 50);
                                            }
                                        }
                                        break;
                                    }
                                case IP_CONST_CASTSPELL_NUMUSES_UNLIMITED_USE:
                                    {
                                        return -1;
                                    }
                            }
                            break;
                        }
                    #endregion
                    #region Damage Resistance
                    case ITEM_PROPERTY_DAMAGE_RESISTANCE:
                        {
                            switch (script.GetItemPropertySubType(prop.Property))
                            {
                                case IP_CONST_DAMAGETYPE_ACID:
                                case IP_CONST_DAMAGETYPE_COLD:
                                case IP_CONST_DAMAGETYPE_ELECTRICAL:
                                case IP_CONST_DAMAGETYPE_FIRE:
                                case IP_CONST_DAMAGETYPE_SONIC:
                                    {
                                        switch (script.GetItemPropertyCostTableValue(prop.Property))
                                        {
                                            case IP_CONST_DAMAGERESIST_5:
                                                {
                                                    prop.Price = 4000;
                                                    break;
                                                }
                                            case IP_CONST_DAMAGERESIST_10:
                                                {
                                                    prop.Price = 12000;
                                                    break;
                                                }
                                            case IP_CONST_DAMAGERESIST_15:
                                                {
                                                    prop.Price = 20000;
                                                    break;
                                                }
                                            case IP_CONST_DAMAGERESIST_20:
                                                {
                                                    prop.Price = 28000;
                                                    break;
                                                }
                                            case IP_CONST_DAMAGERESIST_25:
                                                {
                                                    prop.Price = 36000;
                                                    break;
                                                }
                                            case IP_CONST_DAMAGERESIST_30:
                                                {
                                                    prop.Price = 44000;
                                                    break;
                                                }
                                            default:
                                                {
                                                    return -1;
                                                }
                                        }
                                        break;
                                    }
                                case IP_CONST_DAMAGETYPE_NEGATIVE:
                                    {
                                        switch (script.GetItemPropertyCostTableValue(prop.Property))
                                        {
                                            case IP_CONST_DAMAGERESIST_5:
                                                {
                                                    prop.Price = 6000;
                                                    break;
                                                }
                                            case IP_CONST_DAMAGERESIST_10:
                                                {
                                                    prop.Price = 18000;
                                                    break;
                                                }
                                            case IP_CONST_DAMAGERESIST_15:
                                                {
                                                    prop.Price = 30000;
                                                    break;
                                                }
                                            case IP_CONST_DAMAGERESIST_20:
                                                {
                                                    prop.Price = 42000;
                                                    break;
                                                }
                                            case IP_CONST_DAMAGERESIST_25:
                                                {
                                                    prop.Price = 54000;
                                                    break;
                                                }
                                            case IP_CONST_DAMAGERESIST_30:
                                                {
                                                    prop.Price = 66000;
                                                    break;
                                                }
                                        }
                                        break;
                                    }
                                default:
                                    {
                                        return -1;
                                    }
                            }
                            break;
                        }
                    #endregion
                    #region Freeom of Movement
                    case ITEM_PROPERTY_FREEDOM_OF_MOVEMENT:
                        {
                            prop.Price = 40000;
                            break;
                        }
                    #endregion
                    #region Immunities
                    case ITEM_PROPERTY_IMMUNITY_MISCELLANEOUS:
                        {
                            switch (script.GetItemPropertySubType(prop.Property))
                            {
                                case IP_CONST_IMMUNITYMISC_DEATH_MAGIC:
                                    {
                                        prop.Price = 80000;
                                        break;
                                    }
                                case IP_CONST_IMMUNITYMISC_DISEASE:
                                    {
                                        prop.Price = 7500;
                                        break;
                                    }
                                case IP_CONST_IMMUNITYMISC_FEAR:
                                    {
                                        prop.Price = 10000;
                                        break;
                                    }
                                case IP_CONST_IMMUNITYMISC_KNOCKDOWN:
                                    {
                                        prop.Price = 22500;
                                        break;
                                    }
                                case IP_CONST_IMMUNITYMISC_LEVEL_ABIL_DRAIN:
                                    {
                                        prop.Price = 40000;
                                        break;
                                    }
                                case IP_CONST_IMMUNITYMISC_PARALYSIS:
                                    {
                                        prop.Price = 15000;
                                        break;
                                    }
                                case IP_CONST_IMMUNITYMISC_POISON:
                                    {
                                        prop.Price = 25000;
                                        break;
                                    }
                                default:
                                    {
                                        return -1;
                                    }
                            }
                            break;
                        }
                    #endregion
                    #region Spell Immunities
                    case ITEM_PROPERTY_IMMUNITY_SPECIFIC_SPELL:
                        {
                            float spellLevel = 0.0f;
                            float.TryParse(script.Get2DAString("spells", "Innate", script.GetItemPropertyCostTableValue(prop.Property)), out spellLevel);
                            if (spellLevel < 0.5f)
                            {
                                spellLevel = 0.5f;
                            }
                            prop.Price = (int)(((spellLevel * spellLevel) + 1) * 1000);
                            break;
                        }
                    #endregion
                    #region Light
                    case ITEM_PROPERTY_LIGHT:
                        {
                            prop.Price = script.GetItemPropertyCostTableValue(prop.Property) * 100;
                            break;
                        }
                    #endregion
                    #region Saving Throws
                    case ITEM_PROPERTY_SAVING_THROW_BONUS:
                        {
                            int val = script.GetItemPropertyCostTableValue(prop.Property);
                            if (val > 5)
                            {
                                return -1;
                            }
                            if (script.GetItemPropertySubType(prop.Property) == IP_CONST_SAVEVS_UNIVERSAL)
                            {
                                prop.Price = (val * val) * 1000;
                            }
                            else if (script.GetItemPropertyCostTableValue(prop.Property) == IP_CONST_SAVEVS_MINDAFFECTING)
                            {
                                prop.Price = (val * val) * 500;
                            }
                            else
                            {
                                prop.Price = (val * val) * 250;
                            }
                            break;
                        }
                    #endregion
                    #region Specific Saving Throws
                    case ITEM_PROPERTY_SAVING_THROW_BONUS_SPECIFIC:
                        {
                            int val = script.GetItemPropertyCostTableValue(prop.Property);
                            if (val > 5)
                            {
                                return -1;
                            }
                            prop.Price = (val * val) * 250;
                            break;
                        }
                    #endregion
                    #region Skill Bonuses
                    case ITEM_PROPERTY_SKILL_BONUS:
                        {
                            int val = script.GetItemPropertyCostTableValue(prop.Property);
                            prop.Price = (val * val) * 100;
                            break;
                        }
                    #endregion
                    #region Spell Resistance
                    case ITEM_PROPERTY_SPELL_RESISTANCE:
                        {
                            switch (script.GetItemPropertyCostTableValue(prop.Property))
                            {
                                case IP_CONST_SPELLRESISTANCEBONUS_12:
                                    {
                                        effectivePlus += 2.0f;
                                        break;
                                    }
                                case IP_CONST_SPELLRESISTANCEBONUS_14:
                                    {
                                        effectivePlus += 3.0f;
                                        break;
                                    }
                                case IP_CONST_SPELLRESISTANCEBONUS_16:
                                    {
                                        effectivePlus += 4.0f;
                                        break;
                                    }
                                case IP_CONST_SPELLRESISTANCEBONUS_18:
                                    {
                                        effectivePlus += 5.0f;
                                        break;
                                    }
                                default:
                                    {
                                        return -1;
                                    }
                            }
                            break;
                        }
                    #endregion
                    #region Non-Price-Adjusting Properties
                    case ITEM_PROPERTY_WEIGHT_INCREASE:
                    case ITEM_PROPERTY_VISUALEFFECT:
                    case ITEM_PROPERTY_USE_LIMITATION_SPECIFIC_ALIGNMENT:
                    case ITEM_PROPERTY_USE_LIMITATION_RACIAL_TYPE:
                    case ITEM_PROPERTY_USE_LIMITATION_CLASS:
                    case ITEM_PROPERTY_USE_LIMITATION_ALIGNMENT_GROUP:
                    case ITEM_PROPERTY_DECREASED_ABILITY_SCORE:
                    case ITEM_PROPERTY_DECREASED_AC:
                    case ITEM_PROPERTY_DECREASED_ATTACK_MODIFIER:
                    case ITEM_PROPERTY_DECREASED_DAMAGE:
                    case ITEM_PROPERTY_DECREASED_ENHANCEMENT_MODIFIER:
                    case ITEM_PROPERTY_DECREASED_SAVING_THROWS:
                    case ITEM_PROPERTY_DECREASED_SAVING_THROWS_SPECIFIC:
                    case ITEM_PROPERTY_DECREASED_SKILL_MODIFIER:
                    case ITEM_PROPERTY_DAMAGE_VULNERABILITY:
                    case ITEM_PROPERTY_DAMAGE_REDUCTION_DEPRECATED:
                        {
                            // penalties don't change prices.
                            break;
                        }
                    #endregion
                    #region Illegal or Untoolable Properties
                    case ITEM_PROPERTY_UNLIMITED_AMMUNITION:
                    case ITEM_PROPERTY_TURN_RESISTANCE:
                    case ITEM_PROPERTY_TRUE_SEEING:
                    case ITEM_PROPERTY_TRAP:
                    case ITEM_PROPERTY_THIEVES_TOOLS:
                    case ITEM_PROPERTY_SPECIAL_WALK:
                    case ITEM_PROPERTY_REGENERATION_VAMPIRIC:
                    case ITEM_PROPERTY_REGENERATION:
                    case ITEM_PROPERTY_POISON:
                    case ITEM_PROPERTY_ONHITCASTSPELL:
                    case ITEM_PROPERTY_ON_MONSTER_HIT:
                    case ITEM_PROPERTY_ON_HIT_PROPERTIES:
                    case ITEM_PROPERTY_NO_DAMAGE:
                    case ITEM_PROPERTY_MONSTER_DAMAGE:
                    case ITEM_PROPERTY_MIND_BLANK:
                    case ITEM_PROPERTY_MIGHTY:
                    case ITEM_PROPERTY_MASSIVE_CRITICALS:
                    case ITEM_PROPERTY_IMMUNITY_SPELL_SCHOOL:
                    case ITEM_PROPERTY_IMMUNITY_SPELLS_BY_LEVEL:
                    case ITEM_PROPERTY_IMPROVED_EVASION:
                    case ITEM_PROPERTY_KEEN:
                    case ITEM_PROPERTY_IMMUNITY_DAMAGE_TYPE:
                    case ITEM_PROPERTY_HOLY_AVENGER:
                    case ITEM_PROPERTY_HEALERS_KIT:
                    case ITEM_PROPERTY_HASTE:
                    case ITEM_PROPERTY_ENHANCEMENT_BONUS:
                    case ITEM_PROPERTY_ENHANCEMENT_BONUS_VS_ALIGNMENT_GROUP:
                    case ITEM_PROPERTY_ENHANCEMENT_BONUS_VS_RACIAL_GROUP:
                    case ITEM_PROPERTY_ENHANCEMENT_BONUS_VS_SPECIFIC_ALIGNEMENT:
                    case ITEM_PROPERTY_EXTRA_MELEE_DAMAGE_TYPE:
                    case ITEM_PROPERTY_EXTRA_RANGED_DAMAGE_TYPE:
                    case ITEM_PROPERTY_ENHANCED_CONTAINER_REDUCED_WEIGHT:
                    case ITEM_PROPERTY_DARKVISION:
                    case ITEM_PROPERTY_DAMAGE_REDUCTION:
                    case ITEM_PROPERTY_DAMAGE_BONUS:
                    case ITEM_PROPERTY_DAMAGE_BONUS_VS_ALIGNMENT_GROUP:
                    case ITEM_PROPERTY_DAMAGE_BONUS_VS_RACIAL_GROUP:
                    case ITEM_PROPERTY_DAMAGE_BONUS_VS_SPECIFIC_ALIGNMENT:
                    case ITEM_PROPERTY_BONUS_HITPOINTS:
                    case ITEM_PROPERTY_BASE_ITEM_WEIGHT_REDUCTION:
                    case ITEM_PROPERTY_ATTACK_BONUS:
                    case ITEM_PROPERTY_ATTACK_BONUS_VS_ALIGNMENT_GROUP:
                    case ITEM_PROPERTY_ATTACK_BONUS_VS_RACIAL_GROUP:
                    case ITEM_PROPERTY_ATTACK_BONUS_VS_SPECIFIC_ALIGNMENT:
                        {
                            return -1;
                        }
                    #endregion
                }
            }
            #endregion
            #region Properties that are vs. Specifics
            foreach (PricedItemProperty prop in itProps)
            {
                int propType = script.GetItemPropertyType(prop.Property);
                switch (propType)
                {
                    #region AC Bonus vs. Alignement Group
                    case ITEM_PROPERTY_AC_BONUS_VS_ALIGNMENT_GROUP:
                        {
                            int ACvsGroup = script.GetItemPropertyCostTableValue(prop.Property);
                            if (ACvsGroup > ACvsEveryone)
                            {
                                float multiplier = 0.40f;
                                if (script.GetItemPropertySubType(prop.Property) == IP_CONST_ALIGNMENTGROUP_NEUTRAL)
                                {
                                    multiplier = 2.0f / 3.0f;
                                }
                                if (script.GetItemPropertySubType(prop.Property) == IP_CONST_ALIGNMENTGROUP_EVIL)
                                {
                                    multiplier = 0.50f;
                                }
                                float effectiveBonus = (ACvsGroup - ACvsEveryone) * multiplier;
                                effectivePlus += effectiveBonus;
                            }
                            break;
                        }
                    #endregion
                    #region AC Bonus vs. Damage Type
                    case ITEM_PROPERTY_AC_BONUS_VS_DAMAGE_TYPE:
                        {
                            int ACvsGroup = script.GetItemPropertyCostTableValue(prop.Property);
                            if (ACvsGroup > ACvsEveryone)
                            {
                                float multiplier = 1.0f / 3.0f;
                                float effectiveBonus = (ACvsGroup - ACvsEveryone) * multiplier;
                                effectivePlus += effectiveBonus;
                            }
                            break;
                        }
                    #endregion
                    #region AC Bonus vs. Racial Type
                    case ITEM_PROPERTY_AC_BONUS_VS_RACIAL_GROUP:
                        {
                            int ACvsGroup = script.GetItemPropertyCostTableValue(prop.Property);
                            if (ACvsGroup > ACvsEveryone)
                            {
                                float multiplier = 1.0f / 3.0f;
                                float effectiveBonus = (ACvsGroup - ACvsEveryone) * multiplier;
                                effectivePlus += effectiveBonus;
                            }
                            break;
                        }
                    #endregion
                    #region AC Bonus vs. Specific Alignment
                    case ITEM_PROPERTY_AC_BONUS_VS_SPECIFIC_ALIGNMENT:
                        {
                            int ACvsGroup = script.GetItemPropertyCostTableValue(prop.Property);
                            if (ACvsGroup > ACvsEveryone)
                            {
                                float multiplier = 1.0f / 6.0f;
                                float effectiveBonus = (ACvsGroup - ACvsEveryone) * multiplier;
                                effectivePlus += effectiveBonus;
                            }
                            break;
                        }
                    #endregion
                }
            }
            #endregion
            #endregion

            #region Correct for Magical Armor That Should be Masterwork, and Special Mat Rules on Mundane Mats
            if (specialMat == GMATERIAL_NONSPECIFIC ||
                specialMat == GMATERIAL_METAL_IRON ||
                specialMat == GMATERIAL_SONDARR)
            {
                switch (rulesType)
                {
                    case ARMOR_RULES_TYPE_BANDED:
                        {
                            if (ACvsEveryone > 0)
                            {
                                script.SetArmorRulesType(target, ARMOR_RULES_TYPE_BANDED_MASTERWORK);
                                value = ArmorRulesTypeValues[ARMOR_RULES_TYPE_BANDED_MASTERWORK];
                            }
                            break;
                        }
                    case ARMOR_RULES_TYPE_BANDED_DRAGON:
                    case ARMOR_RULES_TYPE_BANDED_HEAVYMETAL:
                    case ARMOR_RULES_TYPE_BANDED_LIVING:
                    case ARMOR_RULES_TYPE_BANDED_MITHRAL:
                        {
                            script.SetArmorRulesType(target, ARMOR_RULES_TYPE_BANDED_MASTERWORK);
                            value = ArmorRulesTypeValues[ARMOR_RULES_TYPE_BANDED_MASTERWORK];
                            break;
                        }
                    case ARMOR_RULES_TYPE_BREASTPLATE:
                        {
                            if (ACvsEveryone > 0)
                            {
                                script.SetArmorRulesType(target, ARMOR_RULES_TYPE_BREASTPLATE_MASTERWORK);
                                value = ArmorRulesTypeValues[ARMOR_RULES_TYPE_BREASTPLATE_MASTERWORK];
                            }
                            break;
                        }
                    case ARMOR_RULES_TYPE_BREASTPLATE_DRAGON:
                    case ARMOR_RULES_TYPE_BREASTPLATE_DUSKWOOD:
                    case ARMOR_RULES_TYPE_BREASTPLATE_HEAVYMETAL:
                    case ARMOR_RULES_TYPE_BREASTPLATE_LIVING:
                    case ARMOR_RULES_TYPE_BREASTPLATE_MITHRAL:
                        {
                            script.SetArmorRulesType(target, ARMOR_RULES_TYPE_BREASTPLATE_MASTERWORK);
                            value = ArmorRulesTypeValues[ARMOR_RULES_TYPE_BREASTPLATE_MASTERWORK];
                            break;
                        }
                    case ARMOR_RULES_TYPE_CHAIN_SHIRT:
                        {
                            if (ACvsEveryone > 0)
                            {
                                script.SetArmorRulesType(target, ARMOR_RULES_TYPE_CHAIN_SHIRT_MASTERWORK);
                                value = ArmorRulesTypeValues[ARMOR_RULES_TYPE_CHAIN_SHIRT_MASTERWORK];
                            }
                            break;
                        }
                    case ARMOR_RULES_TYPE_CHAIN_SHIRT_HEAVYMETAL:
                    case ARMOR_RULES_TYPE_CHAIN_SHIRT_LIVING:
                    case ARMOR_RULES_TYPE_CHAIN_SHIRT_MITHRAL:
                        {
                            script.SetArmorRulesType(target, ARMOR_RULES_TYPE_CHAIN_SHIRT_MASTERWORK);
                            value = ArmorRulesTypeValues[ARMOR_RULES_TYPE_CHAIN_SHIRT_MASTERWORK];
                            break;
                        }
                    case ARMOR_RULES_TYPE_CHAINMAIL:
                        {
                            if (ACvsEveryone > 0)
                            {
                                script.SetArmorRulesType(target, ARMOR_RULES_TYPE_CHAINMAIL_MASTERWORK);
                                value = ArmorRulesTypeValues[ARMOR_RULES_TYPE_CHAINMAIL_MASTERWORK];
                            }
                            break;
                        }
                    case ARMOR_RULES_TYPE_CHAINMAIL_HEAVYMETAL:
                    case ARMOR_RULES_TYPE_CHAINMAIL_LIVING:
                    case ARMOR_RULES_TYPE_CHAINMAIL_MITHRAL:
                        {
                            script.SetArmorRulesType(target, ARMOR_RULES_TYPE_CHAINMAIL_MASTERWORK);
                            value = ArmorRulesTypeValues[ARMOR_RULES_TYPE_CHAINMAIL_MASTERWORK];
                            break;
                        }
                    case ARMOR_RULES_TYPE_FULL_PLATE:
                        {
                            if (ACvsEveryone > 0)
                            {
                                script.SetArmorRulesType(target, ARMOR_RULES_TYPE_FULL_PLATE_MASTERWORK);
                                value = ArmorRulesTypeValues[ARMOR_RULES_TYPE_FULL_PLATE_MASTERWORK];
                            }
                            break;
                        }
                    case ARMOR_RULES_TYPE_FULL_PLATE_DRAGON:
                    case ARMOR_RULES_TYPE_FULL_PLATE_HEAVYMETAL:
                    case ARMOR_RULES_TYPE_FULL_PLATE_LIVING:
                    case ARMOR_RULES_TYPE_FULL_PLATE_MITHRAL:
                        {
                            script.SetArmorRulesType(target, ARMOR_RULES_TYPE_FULL_PLATE_MASTERWORK);
                            value = ArmorRulesTypeValues[ARMOR_RULES_TYPE_FULL_PLATE_MASTERWORK];
                            break;
                        }
                    case ARMOR_RULES_TYPE_HALF_PLATE:
                        {
                            if (ACvsEveryone > 0)
                            {
                                script.SetArmorRulesType(target, ARMOR_RULES_TYPE_HALF_PLATE_MASTERWORK);
                                value = ArmorRulesTypeValues[ARMOR_RULES_TYPE_HALF_PLATE_MASTERWORK];
                            }
                            break;
                        }
                    case ARMOR_RULES_TYPE_HALF_PLATE_DRAGON:
                    case ARMOR_RULES_TYPE_HALF_PLATE_HEAVYMETAL:
                    case ARMOR_RULES_TYPE_HALF_PLATE_LIVING:
                    case ARMOR_RULES_TYPE_HALF_PLATE_MITHRAL:
                        {
                            script.SetArmorRulesType(target, ARMOR_RULES_TYPE_HALF_PLATE_MASTERWORK);
                            value = ArmorRulesTypeValues[ARMOR_RULES_TYPE_HALF_PLATE_MASTERWORK];
                            break;
                        }
                    case ARMOR_RULES_TYPE_HIDE:
                        {
                            if (ACvsEveryone > 0)
                            {
                                script.SetArmorRulesType(target, ARMOR_RULES_TYPE_HIDE_MASTERWORK);
                                value = ArmorRulesTypeValues[ARMOR_RULES_TYPE_HIDE_MASTERWORK];
                            }
                            break;
                        }
                    case ARMOR_RULES_TYPE_HIDE_DRAGON:
                        {
                            script.SetArmorRulesType(target, ARMOR_RULES_TYPE_HIDE_MASTERWORK);
                            value = ArmorRulesTypeValues[ARMOR_RULES_TYPE_HIDE_MASTERWORK];
                            break;
                        }
                    case ARMOR_RULES_TYPE_LEATHER:
                        {
                            if (ACvsEveryone > 0)
                            {
                                script.SetArmorRulesType(target, ARMOR_RULES_TYPE_LEATHER_MASTERWORK);
                                value = ArmorRulesTypeValues[ARMOR_RULES_TYPE_LEATHER_MASTERWORK];
                            }
                            break;
                        }
                    case ARMOR_RULES_TYPE_LEATHER_DRAGON:
                        {
                            script.SetArmorRulesType(target, ARMOR_RULES_TYPE_LEATHER_MASTERWORK);
                            value = ArmorRulesTypeValues[ARMOR_RULES_TYPE_LEATHER_MASTERWORK];
                            break;
                        }
                    case ARMOR_RULES_TYPE_PADDED:
                        {
                            if (ACvsEveryone > 0)
                            {
                                script.SetArmorRulesType(target, ARMOR_RULES_TYPE_PADDED_MASTERWORK);
                                value = ArmorRulesTypeValues[ARMOR_RULES_TYPE_PADDED_MASTERWORK];
                            }
                            break;
                        }
                    case ARMOR_RULES_TYPE_PADDED_DRAGON:
                        {
                            script.SetArmorRulesType(target, ARMOR_RULES_TYPE_PADDED_MASTERWORK);
                            value = ArmorRulesTypeValues[ARMOR_RULES_TYPE_PADDED_MASTERWORK];
                            break;
                        }
                    case ARMOR_RULES_TYPE_SCALE:
                        {
                            if (ACvsEveryone > 0)
                            {
                                script.SetArmorRulesType(target, ARMOR_RULES_TYPE_SCALE_MASTERWORK);
                                value = ArmorRulesTypeValues[ARMOR_RULES_TYPE_SCALE_MASTERWORK];
                            }
                            break;
                        }
                    case ARMOR_RULES_TYPE_SCALE_DRAGON:
                    case ARMOR_RULES_TYPE_SCALE_HEAVYMETAL:
                    case ARMOR_RULES_TYPE_SCALE_LIVING:
                    case ARMOR_RULES_TYPE_SCALE_MITHRAL:
                        {
                            script.SetArmorRulesType(target, ARMOR_RULES_TYPE_SCALE_MASTERWORK);
                            value = ArmorRulesTypeValues[ARMOR_RULES_TYPE_SCALE_MASTERWORK];
                            break;
                        }
                    case ARMOR_RULES_TYPE_SHIELD_HEAVY:
                        {
                            if (ACvsEveryone > 0)
                            {
                                script.SetArmorRulesType(target, ARMOR_RULES_TYPE_SHIELD_HEAVY_MASTERWORK);
                                value = ArmorRulesTypeValues[ARMOR_RULES_TYPE_SHIELD_HEAVY_MASTERWORK];
                            }
                            break;
                        }
                    case ARMOR_RULES_TYPE_SHIELD_HEAVY_DARKWOOD:
                    case ARMOR_RULES_TYPE_SHIELD_HEAVY_DRAGON:
                    case ARMOR_RULES_TYPE_SHIELD_HEAVY_MITHRAL:
                        {
                            script.SetArmorRulesType(target, ARMOR_RULES_TYPE_SHIELD_HEAVY_MASTERWORK);
                            value = ArmorRulesTypeValues[ARMOR_RULES_TYPE_SHIELD_HEAVY_MASTERWORK];
                            break;
                        }
                    case ARMOR_RULES_TYPE_SHIELD_LIGHT:
                        {
                            if (ACvsEveryone > 0)
                            {
                                script.SetArmorRulesType(target, ARMOR_RULES_TYPE_SHIELD_LIGHT_MASTERWORK);
                                value = ArmorRulesTypeValues[ARMOR_RULES_TYPE_SHIELD_LIGHT_MASTERWORK];
                            }
                            break;
                        }
                    case ARMOR_RULES_TYPE_SHIELD_LIGHT_DARKWOOD:
                    case ARMOR_RULES_TYPE_SHIELD_LIGHT_DRAGON:
                    case ARMOR_RULES_TYPE_SHIELD_LIGHT_MITHRAL:
                        {
                            script.SetArmorRulesType(target, ARMOR_RULES_TYPE_SHIELD_LIGHT_MASTERWORK);
                            value = ArmorRulesTypeValues[ARMOR_RULES_TYPE_SHIELD_LIGHT_MASTERWORK];
                            break;
                        }
                    case ARMOR_RULES_TYPE_SHIELD_TOWER:
                        {
                            if (ACvsEveryone > 0)
                            {
                                script.SetArmorRulesType(target, ARMOR_RULES_TYPE_SHIELD_TOWER_MASTERWORK);
                                value = ArmorRulesTypeValues[ARMOR_RULES_TYPE_SHIELD_TOWER_MASTERWORK];
                            }
                            break;
                        }
                    case ARMOR_RULES_TYPE_SHIELD_TOWER_DARKWOOD:
                    case ARMOR_RULES_TYPE_SHIELD_TOWER_DRAGON:
                    case ARMOR_RULES_TYPE_SHIELD_TOWER_MITHRAL:
                        {
                            script.SetArmorRulesType(target, ARMOR_RULES_TYPE_SHIELD_TOWER_MASTERWORK);
                            value = ArmorRulesTypeValues[ARMOR_RULES_TYPE_SHIELD_TOWER_MASTERWORK];
                            break;
                        }
                    case ARMOR_RULES_TYPE_SPLINT:
                        {
                            if (ACvsEveryone > 0)
                            {
                                script.SetArmorRulesType(target, ARMOR_RULES_TYPE_SPLINT_MASTERWORK);
                                value = ArmorRulesTypeValues[ARMOR_RULES_TYPE_SPLINT_MASTERWORK];
                            }
                            break;
                        }
                    case ARMOR_RULES_TYPE_SPLINT_DRAGON:
                    case ARMOR_RULES_TYPE_SPLINT_HEAVYMETAL:
                    case ARMOR_RULES_TYPE_SPLINT_LIVING:
                    case ARMOR_RULES_TYPE_SPLINT_MITHREAL:
                        {
                            script.SetArmorRulesType(target, ARMOR_RULES_TYPE_SPLINT_MASTERWORK);
                            value = ArmorRulesTypeValues[ARMOR_RULES_TYPE_SPLINT_MASTERWORK];
                            break;
                        }
                    case ARMOR_RULES_TYPE_STUDDED_LEATHER:
                        {
                            if (ACvsEveryone > 0)
                            {
                                script.SetArmorRulesType(target, ARMOR_RULES_TYPE_STUDDED_LEATHER_MASTERWORK);
                                value = ArmorRulesTypeValues[ARMOR_RULES_TYPE_STUDDED_LEATHER_MASTERWORK];
                            }
                            break;
                        }
                    case ARMOR_RULES_TYPE_LEATHER_STUDDED_DRAGON:
                        {
                            script.SetArmorRulesType(target, ARMOR_RULES_TYPE_STUDDED_LEATHER_MASTERWORK);
                            value = ArmorRulesTypeValues[ARMOR_RULES_TYPE_STUDDED_LEATHER_MASTERWORK];
                            break;
                        }
                }
            }
            #endregion

            #region Sum Calculated Values
            #region Permanent Properties
            value += enchantmentPenalty;
            bool allSecondary = false;
            if (effectivePlus >= 0.05f)
            {
                allSecondary = true;
                if (effectivePlus >= 1.0f)
                {
                    if (ACvsEveryone < 0.99)
                    {
                        return -1;
                    }
                    value += (int)((effectivePlus * effectivePlus) * 1000);
                }
                else
                {
                    value += (int)(effectivePlus * 1000);
                }
            }

            int costliestProp = 0;
            int propsPrice = 0;
            PricedItemProperty costliestCharge = null;
            PricedItemProperty secondCostliestCharge = null;
            foreach (PricedItemProperty prop in itProps)
            {
                value += prop.Price;
                propsPrice += prop.Price;
                if (costliestProp < prop.Price)
                {
                    costliestProp = prop.Price;
                }
                if (prop.ChargedPrice > 0)
                {
                    if (costliestCharge == null)
                    {
                        costliestCharge = prop;
                    }
                    else if (prop.ChargedPrice > costliestCharge.ChargedPrice)
                    {
                        secondCostliestCharge = costliestCharge;
                        costliestCharge = prop;
                    }
                    else if (secondCostliestCharge == null)
                    {
                        secondCostliestCharge = prop;
                    }
                    else if (prop.ChargedPrice > secondCostliestCharge.ChargedPrice)
                    {
                        secondCostliestCharge = prop;
                    }
                }
            }
            if (allSecondary)
            {
                value += (propsPrice / 2);
            }
            else
            {
                // If the costliest prop is the only prop, 0/2 = 0.
                // otherwise, all secondary props cost 50% more.
                value += ((propsPrice - costliestProp) / 2);
            }
            #endregion

            #region Charge-Consuming Properties
            int chargesCost = 0;
            if (costliestCharge != null)
            {
                if (secondCostliestCharge == null)
                {
                    chargesCost += costliestCharge.ChargedPrice * script.GetItemCharges(target);
                    value += costliestCharge.ChargedPrice * script.GetItemCharges(target);
                }
                else
                {
                    foreach (PricedItemProperty prop in itProps)
                    {
                        if (costliestCharge == prop)
                        {
                            chargesCost += prop.ChargedPrice * script.GetItemCharges(target);
                            value += prop.ChargedPrice * script.GetItemCharges(target);
                        }
                        else if (secondCostliestCharge == prop)
                        {
                            chargesCost += (prop.ChargedPrice * script.GetItemCharges(target) * 3) / 4;
                            value += (prop.ChargedPrice * script.GetItemCharges(target) * 3) / 4;
                        }
                        else
                        {
                            chargesCost += (prop.ChargedPrice * script.GetItemCharges(target)) / 2;
                            value += (prop.ChargedPrice * script.GetItemCharges(target)) / 2;
                        }
                    }
                }
            }
            if (IsClassRestricted)
            {
                value -= (chargesCost - ((chargesCost * 750) / 1800));
            }
            #endregion
            #endregion
            return value;
        }
        private static int GetWeaponPrice(CLRScriptBase script, uint target)
        {
            #region Initialize commonly-used variables
            int value = BaseItemValues[script.GetBaseItemType(target)];
            int itemType = script.GetBaseItemType(target);
            int enchantmentPenalty = 0;
            bool masterworkCounted = false;
            int specialMat = script.GetItemBaseMaterialType(target);
            #endregion

            #region Load item properties into the price calculation collection
            List<PricedItemProperty> itProps = new List<PricedItemProperty>();
            foreach(NWItemProperty prop in script.GetItemPropertiesOnItem(target))
            {
                if (script.GetItemPropertyDurationType(prop) == DURATION_TYPE_PERMANENT)
                {
                    itProps.Add(new PricedItemProperty() { Property = prop, Price = 0 });
                }
            }
            #endregion

            #region Check for Mundane Items
            if (itProps.Count == 0 &&
                (specialMat == GMATERIAL_METAL_IRON || specialMat == GMATERIAL_NONSPECIFIC))
            {
                // No item properties. This is just worth the base item.
                if (GetIsAmmunition(itemType))
                {
                    value /= 100;
                }
                return value;
            }
            #endregion

            #region Clear out Properties that Come from Special Materials; Set Base Price By Special Materials
            if (specialMat != GMATERIAL_METAL_IRON &&
                specialMat != GMATERIAL_NONSPECIFIC)
            {
                #region Adamantine
                if (specialMat == GMATERIAL_METAL_ADAMANTINE)
                {
                    if (GetIsAmmunition(itemType))
                    {
                        value += 1500;
                    }
                    else if (GetIsLightWeapon(itemType))
                    {
                        value += 800;
                    }
                    else if (GetIsHeavyWeapon(itemType))
                    {
                        value += 2000;
                    }
                    else
                    {
                        value += 1400;
                    }
                    if (!GetIsMasterwork(script, itProps))
                    {
                        script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyAttackBonus(1), target, 0.0f);
                    }
                    masterworkCounted = true;
                }
                #endregion

                #region Silver and Alchemical Silver
                else if (specialMat == GMATERIAL_METAL_ALCHEMICAL_SILVER)
                {
                    if (GetIsAlchemicalSilver(script, itProps))
                    {
                        if (GetIsAmmunition(itemType))
                        {
                            value += 200;
                        }
                        else if (GetIsLightWeapon(itemType))
                        {
                            value += 20;
                        }
                        else if (GetIsHeavyWeapon(itemType))
                        {
                            value += 180;
                        }
                        else
                        {
                            value += 90;
                        }
                    }
                    else
                    {
                        if (GetIsAmmunition(itemType))
                        {
                            value += 1500;
                        }
                        else if (GetIsLightWeapon(itemType))
                        {
                            value += 1500;
                        }
                        else if (GetIsHeavyWeapon(itemType))
                        {
                            value += 3500;
                        }
                        else
                        {
                            value += 2500;
                        }
                        if (!GetIsMasterwork(script, itProps))
                        {
                            script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyAttackBonus(1), target, 0.0f);
                        }
                        masterworkCounted = true;
                    }
                }
                #endregion

                #region Arandur
                else if (specialMat == GMATERIAL_ARANDUR)
                {
                    if (GetIsAmmunition(itemType))
                    {
                        value += 1000;
                        if (!GetHasElementalWeaponBonus(script, itProps, IP_CONST_DAMAGETYPE_SONIC, IP_CONST_DAMAGEBONUS_1))
                        {
                            script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyDamageBonus(IP_CONST_DAMAGETYPE_SONIC, IP_CONST_DAMAGEBONUS_1), target, 0.0f);
                        }
                    }
                    else if (GetIsLightWeapon(itemType))
                    {
                        value += 2000;
                        if (!GetHasElementalWeaponBonus(script, itProps, IP_CONST_DAMAGETYPE_SONIC, IP_CONST_DAMAGEBONUS_1))
                        {
                            script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyDamageBonus(IP_CONST_DAMAGETYPE_SONIC, IP_CONST_DAMAGEBONUS_1), target, 0.0f);
                        }
                    }
                    else if (GetIsHeavyWeapon(itemType))
                    {
                        value += 4000;
                        if (!GetHasElementalWeaponBonus(script, itProps, IP_CONST_DAMAGETYPE_SONIC, IP_CONST_DAMAGEBONUS_1d3))
                        {
                            script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyDamageBonus(IP_CONST_DAMAGETYPE_SONIC, IP_CONST_DAMAGEBONUS_1d3), target, 0.0f);
                        }
                    }
                    else
                    {
                        value += 3000;
                        if (!GetHasElementalWeaponBonus(script, itProps, IP_CONST_DAMAGETYPE_SONIC, IP_CONST_DAMAGEBONUS_1d2))
                        {
                            script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyDamageBonus(IP_CONST_DAMAGETYPE_SONIC, IP_CONST_DAMAGEBONUS_1d2), target, 0.0f);
                        }
                    }
                }
                #endregion

                #region Bluewood
                else if (specialMat == GMATERIAL_BLUEWOOD)
                {
                    if (GetIsAmmunition(itemType))
                    {
                        value += 400;
                    }
                    else if (GetIsLightWeapon(itemType))
                    {
                        value += 400;
                    }
                    else if (GetIsHeavyWeapon(itemType))
                    {
                        value += 900;
                    }
                    else
                    {
                        value += 600;
                    }
                    if(!GetIsHalfWeight(script, itProps))
                    {
                        script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyWeightReduction(IP_CONST_REDUCEDWEIGHT_50_PERCENT), target, 0.0f);
                    }
                    if (!GetIsMasterwork(script, itProps))
                    {
                        script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyAttackBonus(1), target, 0.0f);
                    }
                    masterworkCounted = true;
                }
                #endregion

                #region Cold Iron
                else if (specialMat == GMATERIAL_METAL_COLD_IRON)
                {
                    value += BaseItemValues[script.GetBaseItemType(target)];
                    enchantmentPenalty = 2000;
                }
                #endregion

                #region Copper
                // Copper weapons have no special properties or pricing.
                #endregion

                #region Darksteel
                else if (specialMat == GMATERIAL_METAL_DARKSTEEL)
                {
                    if (GetIsAmmunition(itemType))
                    {
                        value += 1000;
                        if (!GetHasElementalWeaponBonus(script, itProps, IP_CONST_DAMAGETYPE_ELECTRICAL, IP_CONST_DAMAGEBONUS_1))
                        {
                            script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyDamageBonus(IP_CONST_DAMAGETYPE_ELECTRICAL, IP_CONST_DAMAGEBONUS_1), target, 0.0f);
                        }
                    }
                    else if (GetIsLightWeapon(itemType))
                    {
                        value += 2000;
                        if (!GetHasElementalWeaponBonus(script, itProps, IP_CONST_DAMAGETYPE_ELECTRICAL, IP_CONST_DAMAGEBONUS_1))
                        {
                            script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyDamageBonus(IP_CONST_DAMAGETYPE_ELECTRICAL, IP_CONST_DAMAGEBONUS_1), target, 0.0f);
                        }
                    }
                    else if (GetIsHeavyWeapon(itemType))
                    {
                        value += 4000;
                        if (!GetHasElementalWeaponBonus(script, itProps, IP_CONST_DAMAGETYPE_ELECTRICAL, IP_CONST_DAMAGEBONUS_1d3))
                        {
                            script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyDamageBonus(IP_CONST_DAMAGETYPE_ELECTRICAL, IP_CONST_DAMAGEBONUS_1d3), target, 0.0f);
                        }
                    }
                    else
                    {
                        value += 3000;
                        if (!GetHasElementalWeaponBonus(script, itProps, IP_CONST_DAMAGETYPE_ELECTRICAL, IP_CONST_DAMAGEBONUS_1d2))
                        {
                            script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyDamageBonus(IP_CONST_DAMAGETYPE_ELECTRICAL, IP_CONST_DAMAGEBONUS_1d2), target, 0.0f);
                        }
                    }
                    if (!GetIsMasterwork(script, itProps))
                    {
                        script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyAttackBonus(1), target, 0.0f);
                    }
                    masterworkCounted = true;
                }
                #endregion

                #region Dlarun
                else if (specialMat == GMATERIAL_DLARUN)
                {
                    if (GetIsAmmunition(itemType))
                    {
                        value += 1000;
                        if (!GetHasElementalWeaponBonus(script, itProps, IP_CONST_DAMAGETYPE_COLD, IP_CONST_DAMAGEBONUS_1))
                        {
                            script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyDamageBonus(IP_CONST_DAMAGETYPE_COLD, IP_CONST_DAMAGEBONUS_1), target, 0.0f);
                        }
                    }
                    else if (GetIsLightWeapon(itemType))
                    {
                        value += 2000;
                        if (!GetHasElementalWeaponBonus(script, itProps, IP_CONST_DAMAGETYPE_COLD, IP_CONST_DAMAGEBONUS_1))
                        {
                            script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyDamageBonus(IP_CONST_DAMAGETYPE_COLD, IP_CONST_DAMAGEBONUS_1), target, 0.0f);
                        }
                    }
                    else if (GetIsHeavyWeapon(itemType))
                    {
                        value += 4000;
                        if (!GetHasElementalWeaponBonus(script, itProps, IP_CONST_DAMAGETYPE_COLD, IP_CONST_DAMAGEBONUS_1d3))
                        {
                            script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyDamageBonus(IP_CONST_DAMAGETYPE_COLD, IP_CONST_DAMAGEBONUS_1d3), target, 0.0f);
                        }
                    }
                    else
                    {
                        value += 3000;
                        if (!GetHasElementalWeaponBonus(script, itProps, IP_CONST_DAMAGETYPE_COLD, IP_CONST_DAMAGEBONUS_1d2))
                        {
                            script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyDamageBonus(IP_CONST_DAMAGETYPE_COLD, IP_CONST_DAMAGEBONUS_1d2), target, 0.0f);
                        }
                    }
                    if (!GetIsMasterwork(script, itProps))
                    {
                        script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyAttackBonus(1), target, 0.0f);
                    }
                    masterworkCounted = true;
                }
                #endregion

                #region Black, Green, or Copper Dragon
                else if (specialMat == GMATERIAL_CREATURE_BLACK_DRAGON ||
                        specialMat == GMATERIAL_CREATURE_GREEN_DRAGON ||
                        specialMat == GMATERIAL_CREATURE_COPPER_DRAGON)
                {
                    value += 2000;
                    if (!GetHasElementalWeaponBonus(script, itProps, IP_CONST_DAMAGETYPE_ACID, IP_CONST_DAMAGEBONUS_1))
                    {
                        script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyDamageBonus(IP_CONST_DAMAGETYPE_ACID, IP_CONST_DAMAGEBONUS_1), target, 0.0f);
                    }
                    if (!GetIsMasterwork(script, itProps))
                    {
                        script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyAttackBonus(1), target, 0.0f);
                    }
                    masterworkCounted = true;
                }
                #endregion

                #region Blue or Brass Dragon
                else if (specialMat == GMATERIAL_CREATURE_BLUE_DRAGON ||
                        specialMat == GMATERIAL_CREATURE_BRONZE_DRAGON)
                {
                    value += 2000;
                    if (!GetHasElementalWeaponBonus(script, itProps, IP_CONST_DAMAGETYPE_ELECTRICAL, IP_CONST_DAMAGEBONUS_1))
                    {
                        script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyDamageBonus(IP_CONST_DAMAGETYPE_ELECTRICAL, IP_CONST_DAMAGEBONUS_1), target, 0.0f);
                    }
                    if (!GetIsMasterwork(script, itProps))
                    {
                        script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyAttackBonus(1), target, 0.0f);
                    }
                    masterworkCounted = true;
                }
                #endregion

                #region Red, Brass, or Gold Dragon
                else if (specialMat == GMATERIAL_CREATURE_RED_DRAGON ||
                        specialMat == GMATERIAL_CREATURE_BRASS_DRAGON ||
                        specialMat == GMATERIAL_CREATURE_GOLD_DRAGON)
                {
                    value += 2000;
                    if (!GetHasElementalWeaponBonus(script, itProps, IP_CONST_DAMAGETYPE_FIRE, IP_CONST_DAMAGEBONUS_1))
                    {
                        script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyDamageBonus(IP_CONST_DAMAGETYPE_FIRE, IP_CONST_DAMAGEBONUS_1), target, 0.0f);
                    }
                    if (!GetIsMasterwork(script, itProps))
                    {
                        script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyAttackBonus(1), target, 0.0f);
                    }
                    masterworkCounted = true;
                }                
                #endregion

                #region White or Silver Dragon
                else if (specialMat == GMATERIAL_CREATURE_WHITE_DRAGON ||
                        specialMat == GMATERIAL_CREATURE_SILVER_DRAGON)
                {
                    value += 2000;
                    if (!GetHasElementalWeaponBonus(script, itProps, IP_CONST_DAMAGETYPE_COLD, IP_CONST_DAMAGEBONUS_1))
                    {
                        script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyDamageBonus(IP_CONST_DAMAGETYPE_COLD, IP_CONST_DAMAGEBONUS_1), target, 0.0f);
                    }
                    if (!GetIsMasterwork(script, itProps))
                    {
                        script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyAttackBonus(1), target, 0.0f);
                    }
                    masterworkCounted = true;
                }
                #endregion

                #region Duskwood
                else if (specialMat == GMATERIAL_WOOD_DUSKWOOD)
                {
                    value += 1000;
                    if (!GetIsMasterwork(script, itProps))
                    {
                        script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyAttackBonus(1), target, 0.0f);
                    }
                    masterworkCounted = true;
                }
                #endregion

                #region Fever Iron
                else if (specialMat == GMATERIAL_FEVER_IRON)
                {
                    if (GetIsAmmunition(itemType))
                    {
                        value += 1000;
                        if (!GetHasElementalWeaponBonus(script, itProps, IP_CONST_DAMAGETYPE_FIRE, IP_CONST_DAMAGEBONUS_1))
                        {
                            script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyDamageBonus(IP_CONST_DAMAGETYPE_FIRE, IP_CONST_DAMAGEBONUS_1), target, 0.0f);
                        }
                    }
                    else if (GetIsLightWeapon(itemType))
                    {
                        value += 2000;
                        if (!GetHasElementalWeaponBonus(script, itProps, IP_CONST_DAMAGETYPE_FIRE, IP_CONST_DAMAGEBONUS_1))
                        {
                            script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyDamageBonus(IP_CONST_DAMAGETYPE_FIRE, IP_CONST_DAMAGEBONUS_1), target, 0.0f);
                        }
                    }
                    else if (GetIsHeavyWeapon(itemType))
                    {
                        value += 4000;
                        if (!GetHasElementalWeaponBonus(script, itProps, IP_CONST_DAMAGETYPE_FIRE, IP_CONST_DAMAGEBONUS_1d3))
                        {
                            script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyDamageBonus(IP_CONST_DAMAGETYPE_FIRE, IP_CONST_DAMAGEBONUS_1d3), target, 0.0f);
                        }
                    }
                    else
                    {
                        value += 3000;
                        if (!GetHasElementalWeaponBonus(script, itProps, IP_CONST_DAMAGETYPE_FIRE, IP_CONST_DAMAGEBONUS_1d2))
                        {
                            script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyDamageBonus(IP_CONST_DAMAGETYPE_FIRE, IP_CONST_DAMAGEBONUS_1d2), target, 0.0f);
                        }
                    }
                    if (!GetIsMasterwork(script, itProps))
                    {
                        script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyAttackBonus(1), target, 0.0f);
                    }
                    masterworkCounted = true;
                }
                #endregion

                #region Fiend Bone
                else if (specialMat == GMATERIAL_FIENDBONE)
                {
                    if (GetIsAmmunition(itemType))
                    {
                        value += 1500;
                    }
                    else if (GetIsLightWeapon(itemType))
                    {
                        value += 1500;
                    }
                    else if (GetIsHeavyWeapon(itemType))
                    {
                        value += 3500;
                    }
                    else
                    {
                        value += 2500;
                    }
                    if(!GetHasVersusAlignmentBonus(script, itProps, IP_CONST_ALIGNMENTGROUP_GOOD, IP_CONST_DAMAGEBONUS_1))
                    {
                        script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyDamageBonusVsAlign(IP_CONST_ALIGNMENTGROUP_GOOD, IP_CONST_DAMAGETYPE_MAGICAL, IP_CONST_DAMAGEBONUS_1), target, 0.0f);
                    }
                    if (!GetIsMasterwork(script, itProps))
                    {
                        script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyAttackBonus(1), target, 0.0f);
                    }
                    masterworkCounted = true;
                }
                #endregion

                #region Frystalline
                else if (specialMat == GMATERIAL_FRYSTALLINE)
                {
                    if (GetIsAmmunition(itemType))
                    {
                        value += 1500;
                    }
                    else if (GetIsLightWeapon(itemType))
                    {
                        value += 1500;
                    }
                    else if (GetIsHeavyWeapon(itemType))
                    {
                        value += 3500;
                    }
                    else
                    {
                        value += 2500;
                    }
                    if (!GetHasVersusAlignmentBonus(script, itProps, IP_CONST_ALIGNMENTGROUP_EVIL, IP_CONST_DAMAGEBONUS_1))
                    {
                        script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyDamageBonusVsAlign(IP_CONST_ALIGNMENTGROUP_EVIL, IP_CONST_DAMAGETYPE_MAGICAL, IP_CONST_DAMAGEBONUS_1), target, 0.0f);
                    }
                    if (!GetIsMasterwork(script, itProps))
                    {
                        script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyAttackBonus(1), target, 0.0f);
                    }
                    masterworkCounted = true;
                }
                #endregion

                #region Gold
                else if (specialMat == GMATERIAL_GOLD)
                {
                    if (GetIsAmmunition(itemType))
                    {
                        value += 1500;
                    }
                    else if (GetIsLightWeapon(itemType))
                    {
                        value += 1500;
                    }
                    else if (GetIsHeavyWeapon(itemType))
                    {
                        value += 2500;
                    }
                    else
                    {
                        value += 3500;
                    }
                    if (!GetIsMasterwork(script, itProps))
                    {
                        script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyAttackBonus(1), target, 0.0f);
                    }
                    masterworkCounted = true;
                }
                #endregion

                #region Hizagkuur
                else if (specialMat == GMATERIAL_FEVER_IRON)
                {
                    if (GetIsAmmunition(itemType))
                    {
                        value += 1000;
                        if (!GetHasElementalWeaponBonus(script, itProps, IP_CONST_DAMAGETYPE_FIRE, IP_CONST_DAMAGEBONUS_1))
                        {
                            script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyDamageBonus(IP_CONST_DAMAGETYPE_FIRE, IP_CONST_DAMAGEBONUS_1), target, 0.0f);
                        }
                    }
                    else if (GetIsLightWeapon(itemType))
                    {
                        value += 2000;
                        if (!GetHasElementalWeaponBonus(script, itProps, IP_CONST_DAMAGETYPE_FIRE, IP_CONST_DAMAGEBONUS_1))
                        {
                            script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyDamageBonus(IP_CONST_DAMAGETYPE_FIRE, IP_CONST_DAMAGEBONUS_1), target, 0.0f);
                        }
                    }
                    else if (GetIsHeavyWeapon(itemType))
                    {
                        value += 4000;
                        if (!GetHasElementalWeaponBonus(script, itProps, IP_CONST_DAMAGETYPE_FIRE, IP_CONST_DAMAGEBONUS_1d3))
                        {
                            script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyDamageBonus(IP_CONST_DAMAGETYPE_FIRE, IP_CONST_DAMAGEBONUS_1d3), target, 0.0f);
                        }
                    }
                    else
                    {
                        value += 3000;
                        if (!GetHasElementalWeaponBonus(script, itProps, IP_CONST_DAMAGETYPE_FIRE, IP_CONST_DAMAGEBONUS_1d2))
                        {
                            script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyDamageBonus(IP_CONST_DAMAGETYPE_FIRE, IP_CONST_DAMAGEBONUS_1d2), target, 0.0f);
                        }
                    }
                    if (!GetIsMasterwork(script, itProps))
                    {
                        script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyAttackBonus(1), target, 0.0f);
                    }
                    masterworkCounted = true;
                }
                #endregion

                #region Living Metal
                else if (specialMat == GMATERIAL_LIVING_METAL)
                {
                    value += 1000;
                    if (!GetIsMasterwork(script, itProps))
                    {
                        script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyAttackBonus(1), target, 0.0f);
                    }
                    masterworkCounted = true;
                }
                #endregion

                #region Mithral
                else if (specialMat == GMATERIAL_METAL_MITHRAL)
                {
                    if (GetIsAmmunition(itemType))
                    {
                        value += 1000;
                    }
                    else if (GetIsLightWeapon(itemType))
                    {
                        value += 1000;
                    }
                    else if (GetIsHeavyWeapon(itemType))
                    {
                        value += 12000;
                    }
                    else
                    {
                        value += 6000;
                    }
                    if (!GetIsHalfWeight(script, itProps))
                    {
                        script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyWeightReduction(IP_CONST_REDUCEDWEIGHT_50_PERCENT), target, 0.0f);
                    }
                    if (!GetIsMasterwork(script, itProps))
                    {
                        script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyAttackBonus(1), target, 0.0f);
                    }
                    masterworkCounted = true;
                }
                #endregion

                #region Platinum
                // Platinum has no special properties as a weapon.
                #endregion

                #region Sondarr
                else if (specialMat == GMATERIAL_LIVING_METAL)
                {
                    value += 1000;
                }
                #endregion

                #region Zalantar
                else if (specialMat == GMATERIAL_WOOD_DARKWOOD)
                {
                    if (GetIsAmmunition(itemType))
                    {
                        value += 300;
                    }
                    else if (GetIsLightWeapon(itemType))
                    {
                        value += 300;
                    }
                    else if (GetIsHeavyWeapon(itemType))
                    {
                        value += 300;
                    }
                    else
                    {
                        value += 300;
                    }
                    int addedVal = 0;
                    if (int.TryParse(script.Get2DAString("baseitems", "TenthLBS", itemType), out addedVal))
                    {
                        value += addedVal;
                    }
                    if (!GetIsHalfWeight(script, itProps))
                    {
                        script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyWeightReduction(IP_CONST_REDUCEDWEIGHT_50_PERCENT), target, 0.0f);
                    }
                    if (!GetIsMasterwork(script, itProps))
                    {
                        script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyAttackBonus(1), target, 0.0f);
                    }
                    masterworkCounted = true;
                }
                #endregion
            }
            #endregion

            #region Check for masterwork and mighty bonuses
            if (!masterworkCounted)
            {
                if (GetIsAmmunition(itemType))
                {
                    if (GetIsMasterworkAmmunition(script, itProps))
                    {
                        value += 300;
                    }
                }
                else if (GetIsMasterwork(script, itProps))
                {
                    value += 300;
                }
            }
            foreach (PricedItemProperty prop in itProps)
            {
                if (script.GetItemPropertyType(prop.Property) == ITEM_PROPERTY_MIGHTY)
                {
                    if (itemType == BASE_ITEM_LONGBOW ||
                       itemType == BASE_ITEM_HEAVYCROSSBOW)
                    {
                        value += (100 * script.GetItemPropertyCostTableValue(prop.Property));
                    }
                    else
                    {
                        value += (75 * script.GetItemPropertyCostTableValue(prop.Property));
                    }
                }
            }
            #endregion

            #region Check for early return, if the item is only masterwork or special material
            if (itProps.Count == 0)
            {
                if (GetIsAmmunition(itemType))
                {
                    value /= 100;
                }
                return value;
            }
            #endregion

            #region Check for Use Restriction
            bool IsClassRestricted = GetIsUseRestrictedByClass(script, itProps);
            #endregion

            #region Calculate Magical Bonuses
            float effectivePlus = 0.0f;
            int ACvsEveryone = 0;
            int attackVsEveryone = 0;
            int enhancementVsEveryone = 0;
            #region Properties that are Indiscriminate
            foreach (PricedItemProperty prop in itProps)
            {
                int propType = script.GetItemPropertyType(prop.Property);
                switch (propType)
                {
                    #region Ability Score Bonus
                    case ITEM_PROPERTY_ABILITY_BONUS:
                        {
                            prop.Price = (script.GetItemPropertyCostTableValue(prop.Property) * script.GetItemPropertyCostTableValue(prop.Property) * 1000);
                            break;
                        }
                    #endregion
                    #region Bonus Armor Class
                    case ITEM_PROPERTY_AC_BONUS:
                        {
                            if (script.GetItemPropertyCostTableValue(prop.Property) > ACvsEveryone)
                            {
                                ACvsEveryone = script.GetItemPropertyCostTableValue(prop.Property);
                            }
                            prop.Price = (ACvsEveryone * ACvsEveryone * 2000);
                            break;
                        }
                    #endregion
                    #region Magical Attack Bonus
                    case ITEM_PROPERTY_ATTACK_BONUS:
                        {
                            attackVsEveryone = script.GetItemPropertyCostTableValue(prop.Property);
                            effectivePlus += attackVsEveryone;
                            break;
                        }
                    #endregion
                    #region Base Item Weight Reduction
                    case ITEM_PROPERTY_BASE_ITEM_WEIGHT_REDUCTION:
                        {
                            // Question: do we call this item illegal?
                            break;
                        }
                    #endregion
                    #region Bonus Feat (disarm only)
                    case ITEM_PROPERTY_BONUS_FEAT:
                        {
                            if (script.GetItemPropertySubType(prop.Property) == IP_CONST_FEAT_DISARM)
                            {
                                effectivePlus += 0.5f;
                            }
                            else
                            {
                                if(debug) script.SendMessageToAllDMs("Illegal weapon because it provides an unsupported feat");
                                return -1;
                            }
                            break;
                        }
                    #endregion
                    #region Bonus Spell Slot
                    case ITEM_PROPERTY_BONUS_SPELL_SLOT_OF_LEVEL_N:
                        {
                            int level = script.GetItemPropertyCostTableValue(prop.Property);
                            if (level == 0)
                            {
                                prop.Price = 500;
                            }
                            else
                            {
                                prop.Price = level * level * 1000;
                            }
                            break;
                        }
                    #endregion
                    #region Cast Spell
                    case ITEM_PROPERTY_CAST_SPELL:
                        {
                            int spell = script.GetItemPropertySubType(prop.Property);
                            if (spell == IP_CONST_CASTSPELL_ACTIVATE_ITEM ||
                               spell == IP_CONST_CASTSPELL_UNIQUE_POWER ||
                               spell == IP_CONST_CASTSPELL_UNIQUE_POWER_SELF_ONLY)
                            {
                                // We can't price these, as their powers are custom scripted.
                                return -2;
                            }
                            float spellLevel = 0.0f;
                            float casterLevel = 0.0f;
                            float.TryParse(script.Get2DAString("iprp_spells", "InnateLvl", spell), out spellLevel);
                            float.TryParse(script.Get2DAString("iprp_spells", "CasterLvl", spell), out casterLevel);
                            if (spellLevel < 0.5f)
                            {
                                spellLevel = 0.5f;
                            }
                            if (casterLevel < 1.0f)
                            {
                                casterLevel = 1.0f;
                            }
                            float multiplier = spellLevel * casterLevel;
                            switch (script.GetItemPropertyCostTableValue(prop.Property))
                            {
                                case IP_CONST_CASTSPELL_NUMUSES_0_CHARGES_PER_USE:
                                    {
                                        if (debug) script.SendMessageToAllDMs("Illegal weapon because it provides infinite spellcasting");
                                        return -1;
                                    }
                                case IP_CONST_CASTSPELL_NUMUSES_1_CHARGE_PER_USE:
                                    {
                                        prop.ChargedPrice = (int)(multiplier * 36);
                                        break;
                                    }
                                case IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY:
                                    {
                                        prop.Price = (int)(multiplier * 360);
                                        break;
                                    }
                                case IP_CONST_CASTSPELL_NUMUSES_2_CHARGES_PER_USE:
                                    {
                                        prop.ChargedPrice = (int)(multiplier * 18);
                                        break;
                                    }
                                case IP_CONST_CASTSPELL_NUMUSES_2_USES_PER_DAY:
                                    {
                                        prop.Price = (int)(multiplier * 720);
                                        break;
                                    }
                                case IP_CONST_CASTSPELL_NUMUSES_3_CHARGES_PER_USE:
                                    {
                                        prop.ChargedPrice = (int)(multiplier * 12);
                                        break;
                                    }
                                case IP_CONST_CASTSPELL_NUMUSES_3_USES_PER_DAY:
                                    {
                                        prop.Price = (int)(multiplier * 1080);
                                        break;
                                    }
                                case IP_CONST_CASTSPELL_NUMUSES_4_CHARGES_PER_USE:
                                    {
                                        prop.ChargedPrice = (int)(multiplier * 9);
                                        break;
                                    }
                                case IP_CONST_CASTSPELL_NUMUSES_4_USES_PER_DAY:
                                    {
                                        prop.Price = (int)(multiplier * 1440);
                                        break;
                                    }
                                case IP_CONST_CASTSPELL_NUMUSES_5_CHARGES_PER_USE:
                                    {
                                        prop.ChargedPrice = (int)(multiplier * 7);
                                        break;
                                    }
                                case IP_CONST_CASTSPELL_NUMUSES_5_USES_PER_DAY:
                                    {
                                        prop.Price = (int)(multiplier * 1800);
                                        break;
                                    }
                                case IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE:
                                    {
                                        if (script.GetItemCharges(target) > 0)
                                        {
                                            if (IsClassRestricted)
                                            {
                                                prop.ChargedPrice = (int)((multiplier * 25) / script.GetItemCharges(target));
                                            }
                                            else
                                            {
                                                prop.ChargedPrice = (int)((multiplier * 50) / script.GetItemCharges(target));
                                            }
                                        }
                                        else
                                        {
                                            if (IsClassRestricted)
                                            {
                                                prop.Price = (int)(multiplier * 25);
                                            }
                                            else
                                            {
                                                prop.Price = (int)(multiplier * 50);
                                            }
                                        }
                                        break;
                                    }
                                case IP_CONST_CASTSPELL_NUMUSES_UNLIMITED_USE:
                                    {
                                        if (debug) script.SendMessageToAllDMs("Illegal weapon because it provides infinite spellcasting");
                                        return -1;
                                    }
                            }
                            break;
                        }
                    #endregion
                    #region Damage Bonus
                    case ITEM_PROPERTY_DAMAGE_BONUS:
                        {
                            switch (script.GetItemPropertySubType(prop.Property))
                            {
                                case IP_CONST_DAMAGETYPE_ACID:
                                case IP_CONST_DAMAGETYPE_BLUDGEONING:
                                case IP_CONST_DAMAGETYPE_COLD:
                                case IP_CONST_DAMAGETYPE_ELECTRICAL:
                                case IP_CONST_DAMAGETYPE_FIRE:
                                case IP_CONST_DAMAGETYPE_PHYSICAL:
                                case IP_CONST_DAMAGETYPE_PIERCING:
                                case IP_CONST_DAMAGETYPE_SLASHING:
                                case IP_CONST_DAMAGETYPE_SONIC:
                                case IP_CONST_DAMAGETYPE_SUBDUAL:
                                    {
                                        switch (script.GetItemPropertyCostTableValue(prop.Property))
                                        {
                                            case IP_CONST_DAMAGEBONUS_1d4:
                                                {
                                                    effectivePlus += 1.0f;
                                                    break;
                                                }
                                            case IP_CONST_DAMAGEBONUS_1d6:
                                                {
                                                    effectivePlus += 1.5f;
                                                    break;
                                                }
                                            case IP_CONST_DAMAGEBONUS_1d8:
                                                {
                                                    effectivePlus += 2.2f;
                                                    break;
                                                }
                                            case IP_CONST_DAMAGEBONUS_1:
                                                {
                                                    effectivePlus += 0.4f;
                                                    break;
                                                }
                                            case IP_CONST_DAMAGEBONUS_2:
                                                {
                                                    effectivePlus += 0.8f;
                                                    break;
                                                }
                                            case IP_CONST_DAMAGEBONUS_3:
                                                {
                                                    effectivePlus += 1.2f;
                                                    break;
                                                }
                                            case IP_CONST_DAMAGEBONUS_4:
                                                {
                                                    effectivePlus += 1.6f;
                                                    break;
                                                }
                                            case IP_CONST_DAMAGEBONUS_5:
                                                {
                                                    effectivePlus += 2.0f;
                                                    break;
                                                }
                                            default:
                                                {
                                                    if (debug) script.SendMessageToAllDMs("Illegal weapon because it provides an unsupported damage bonus");
                                                    return -1;
                                                }
                                        }
                                        break;
                                    }
                                case IP_CONST_DAMAGETYPE_NEGATIVE:
                                    {
                                        switch (script.GetItemPropertyCostTableValue(prop.Property))
                                        {
                                            case IP_CONST_DAMAGEBONUS_1d4:
                                                {
                                                    effectivePlus += 1.1f;
                                                    break;
                                                }
                                            case IP_CONST_DAMAGEBONUS_1d6:
                                                {
                                                    effectivePlus += 1.7f;
                                                    break;
                                                }
                                            case IP_CONST_DAMAGEBONUS_1d8:
                                                {
                                                    effectivePlus += 2.4f;
                                                    break;
                                                }
                                            case IP_CONST_DAMAGEBONUS_1:
                                                {
                                                    effectivePlus += 0.5f;
                                                    break;
                                                }
                                            case IP_CONST_DAMAGEBONUS_2:
                                                {
                                                    effectivePlus += 0.9f;
                                                    break;
                                                }
                                            case IP_CONST_DAMAGEBONUS_3:
                                                {
                                                    effectivePlus += 1.3f;
                                                    break;
                                                }
                                            case IP_CONST_DAMAGEBONUS_4:
                                                {
                                                    effectivePlus += 1.8f;
                                                    break;
                                                }
                                            case IP_CONST_DAMAGEBONUS_5:
                                                {
                                                    effectivePlus += 2.2f;
                                                    break;
                                                }
                                            default:
                                                {
                                                    if (debug) script.SendMessageToAllDMs("Illegal weapon because it provides an unsupported damage bonus");
                                                    return -1;
                                                }
                                        }                                        
                                        break;
                                    }
                                case IP_CONST_DAMAGETYPE_DIVINE:
                                case IP_CONST_DAMAGETYPE_MAGICAL:
                                case IP_CONST_DAMAGETYPE_POSITIVE:
                                    {
                                        switch (script.GetItemPropertyCostTableValue(prop.Property))
                                        {
                                            case IP_CONST_DAMAGEBONUS_1d4:
                                                {
                                                    effectivePlus += 1.3f;
                                                    break;
                                                }
                                            case IP_CONST_DAMAGEBONUS_1d6:
                                                {
                                                    effectivePlus += 2.0f;
                                                    break;
                                                }
                                            case IP_CONST_DAMAGEBONUS_1d8:
                                                {
                                                    effectivePlus += 2.7f;
                                                    break;
                                                }
                                            case IP_CONST_DAMAGEBONUS_1:
                                                {
                                                    effectivePlus += 0.7f;
                                                    break;
                                                }
                                            case IP_CONST_DAMAGEBONUS_2:
                                                {
                                                    effectivePlus += 1.1f;
                                                    break;
                                                }
                                            case IP_CONST_DAMAGEBONUS_3:
                                                {
                                                    effectivePlus += 1.5f;
                                                    break;
                                                }
                                            case IP_CONST_DAMAGEBONUS_4:
                                                {
                                                    effectivePlus += 2.1f;
                                                    break;
                                                }
                                            case IP_CONST_DAMAGEBONUS_5:
                                                {
                                                    effectivePlus += 2.5f;
                                                    break;
                                                }
                                            default:
                                                {
                                                    if (debug) script.SendMessageToAllDMs("Illegal weapon because it provides an unsupported damage bonus");
                                                    return -1;
                                                }
                                        } 
                                        break;
                                    }
                            }
                            break;
                        }
                    #endregion
                    #region Damage Resistance
                    case ITEM_PROPERTY_DAMAGE_RESISTANCE:
                        {
                            switch (script.GetItemPropertySubType(prop.Property))
                            {
                                case IP_CONST_DAMAGETYPE_ACID:
                                case IP_CONST_DAMAGETYPE_COLD:
                                case IP_CONST_DAMAGETYPE_ELECTRICAL:
                                case IP_CONST_DAMAGETYPE_FIRE:
                                case IP_CONST_DAMAGETYPE_SONIC:
                                    {
                                        switch (script.GetItemPropertyCostTableValue(prop.Property))
                                        {
                                            case IP_CONST_DAMAGERESIST_5:
                                                {
                                                    prop.Price = 4000;
                                                    break;
                                                }
                                            case IP_CONST_DAMAGERESIST_10:
                                                {
                                                    prop.Price = 12000;
                                                    break;
                                                }
                                            case IP_CONST_DAMAGERESIST_15:
                                                {
                                                    prop.Price = 20000;
                                                    break;
                                                }
                                            case IP_CONST_DAMAGERESIST_20:
                                                {
                                                    prop.Price = 28000;
                                                    break;
                                                }
                                            case IP_CONST_DAMAGERESIST_25:
                                                {
                                                    prop.Price = 36000;
                                                    break;
                                                }
                                            case IP_CONST_DAMAGERESIST_30:
                                                {
                                                    prop.Price = 44000;
                                                    break;
                                                }
                                            default:
                                                {
                                                    if (debug) script.SendMessageToAllDMs("Illegal weapon because it provides an unsupported damage resistance");
                                                    return -1;
                                                }
                                        }
                                        break;
                                    }
                                case IP_CONST_DAMAGETYPE_NEGATIVE:
                                    {
                                        switch (script.GetItemPropertyCostTableValue(prop.Property))
                                        {
                                            case IP_CONST_DAMAGERESIST_5:
                                                {
                                                    prop.Price = 6000;
                                                    break;
                                                }
                                            case IP_CONST_DAMAGERESIST_10:
                                                {
                                                    prop.Price = 18000;
                                                    break;
                                                }
                                            case IP_CONST_DAMAGERESIST_15:
                                                {
                                                    prop.Price = 30000;
                                                    break;
                                                }
                                            case IP_CONST_DAMAGERESIST_20:
                                                {
                                                    prop.Price = 42000;
                                                    break;
                                                }
                                            case IP_CONST_DAMAGERESIST_25:
                                                {
                                                    prop.Price = 54000;
                                                    break;
                                                }
                                            case IP_CONST_DAMAGERESIST_30:
                                                {
                                                    prop.Price = 66000;
                                                    break;
                                                }
                                            default:
                                                {
                                                    if (debug) script.SendMessageToAllDMs("Illegal weapon because it provides an unsupported damage resistance");
                                                    return -1;
                                                }
                                        }
                                        break;
                                    }
                                default:
                                    {
                                        if (debug) script.SendMessageToAllDMs("Illegal weapon because it provides an illegal type of damage resistance");
                                        return -1;
                                    }
                            }
                            break;
                        }
                    #endregion
                    #region Freedom of Movement
                    case ITEM_PROPERTY_FREEDOM_OF_MOVEMENT:
                        {
                            prop.Price = 40000;
                            break;
                        }
                    #endregion
                    #region Enhancement Bonus
                    case ITEM_PROPERTY_ENHANCEMENT_BONUS:
                        {
                            enhancementVsEveryone = script.GetItemPropertyCostTableValue(prop.Property);
                            effectivePlus += enhancementVsEveryone;
                            break;
                        }
                    #endregion
                    #region Immunities
                    case ITEM_PROPERTY_IMMUNITY_MISCELLANEOUS:
                        {
                            switch (script.GetItemPropertySubType(prop.Property))
                            {
                                case IP_CONST_IMMUNITYMISC_DEATH_MAGIC:
                                    {
                                        prop.Price = 80000;
                                        break;
                                    }
                                case IP_CONST_IMMUNITYMISC_DISEASE:
                                    {
                                        prop.Price = 7500;
                                        break;
                                    }
                                case IP_CONST_IMMUNITYMISC_FEAR:
                                    {
                                        prop.Price = 10000;
                                        break;
                                    }
                                case IP_CONST_IMMUNITYMISC_KNOCKDOWN:
                                    {
                                        prop.Price = 22500;
                                        break;
                                    }
                                case IP_CONST_IMMUNITYMISC_LEVEL_ABIL_DRAIN:
                                    {
                                        prop.Price = 40000;
                                        break;
                                    }
                                case IP_CONST_IMMUNITYMISC_PARALYSIS:
                                    {
                                        prop.Price = 15000;
                                        break;
                                    }
                                case IP_CONST_IMMUNITYMISC_POISON:
                                    {
                                        prop.Price = 25000;
                                        break;
                                    }
                                default:
                                    {
                                        if (debug) script.SendMessageToAllDMs("Illegal weapon because it provides a disallowed immunity");
                                        return -1;
                                    }
                            }
                            break;
                        }
                    #endregion
                    #region Immunity to Specific Spell
                    case ITEM_PROPERTY_IMMUNITY_SPECIFIC_SPELL:
                        {
                            float spellLevel = 0.0f;
                            float.TryParse(script.Get2DAString("spells", "Innate", script.GetItemPropertyCostTableValue(prop.Property)), out spellLevel);
                            if (spellLevel < 0.5f)
                            {
                                spellLevel = 0.5f;
                            }
                            prop.Price = (int)(((spellLevel * spellLevel) + 1) * 1000);
                            break;
                        }
                    #endregion
                    #region Keen
                    case ITEM_PROPERTY_KEEN:
                        {
                            effectivePlus += 1.0f;
                            break;
                        }
                    #endregion
                    #region Light
                    case ITEM_PROPERTY_LIGHT:
                        {
                            prop.Price = script.GetItemPropertyCostTableValue(prop.Property) * 100;
                            break;
                        }
                    #endregion
                    #region Massive Criticals
                    case ITEM_PROPERTY_MASSIVE_CRITICALS:
                        {
                            switch (script.GetItemPropertyCostTableValue(prop.Property))
                            {
                                case IP_CONST_DAMAGEBONUS_1d4:
                                    {
                                        effectivePlus += 0.3f;
                                        break;
                                    }
                                case IP_CONST_DAMAGEBONUS_1d6:
                                    {
                                        effectivePlus += 0.4f;
                                        break;
                                    }
                                case IP_CONST_DAMAGEBONUS_1d8:
                                    {
                                        effectivePlus += 0.6f;
                                        break;
                                    }
                                case IP_CONST_DAMAGEBONUS_1d10:
                                    {
                                        effectivePlus += 0.8f;
                                        break;
                                    }
                                case IP_CONST_DAMAGEBONUS_1d12:
                                    {
                                        effectivePlus += 1.0f;
                                        break;
                                    }
                                case IP_CONST_DAMAGEBONUS_2d4:
                                    {
                                        effectivePlus += 0.7f;
                                        break;
                                    }
                                case IP_CONST_DAMAGEBONUS_2d6:
                                    {
                                        effectivePlus += 1.1f;
                                        break;
                                    }
                                case IP_CONST_DAMAGEBONUS_1:
                                    {
                                        effectivePlus += 0.1f;
                                        break;
                                    }
                                case IP_CONST_DAMAGEBONUS_2:
                                    {
                                        effectivePlus += 0.2f;
                                        break;
                                    }
                                case IP_CONST_DAMAGEBONUS_3:
                                    {
                                        effectivePlus += 0.3f;
                                        break;
                                    }
                                case IP_CONST_DAMAGEBONUS_4:
                                    {
                                        effectivePlus += 0.4f;
                                        break;
                                    }
                                case IP_CONST_DAMAGEBONUS_5:
                                    {
                                        effectivePlus += 0.6f;
                                        break;
                                    }
                                case IP_CONST_DAMAGEBONUS_6:
                                    {
                                        effectivePlus += 0.8f;
                                        break;
                                    }
                            }
                            break;
                        }
                    #endregion
                    #region Regeneration: Vampiric
                    case ITEM_PROPERTY_REGENERATION_VAMPIRIC:
                        {
                            int val = script.GetItemPropertyCostTableValue(prop.Property);
                            if (val > 2)
                            {
                                if (debug) script.SendMessageToAllDMs("Illegal weapon because it provides more than 2 points of vampiric regeneration");
                                return -1;
                            }
                            effectivePlus = val * 0.5f;
                            break;
                        }
                    #endregion
                    #region Bonus to Saving Throw Subtypes
                    case ITEM_PROPERTY_SAVING_THROW_BONUS:
                        {
                            int val = script.GetItemPropertyCostTableValue(prop.Property);
                            if (val > 5)
                            {
                                if (debug) script.SendMessageToAllDMs("Illegal weapon because it provides a bonus to saving throws greater than five");
                                return -1;
                            }
                            if (script.GetItemPropertySubType(prop.Property) == IP_CONST_SAVEVS_UNIVERSAL)
                            {
                                prop.Price = (val * val) * 1000;
                            }
                            else if (script.GetItemPropertyCostTableValue(prop.Property) == IP_CONST_SAVEVS_MINDAFFECTING)
                            {
                                prop.Price = (val * val) * 500;
                            }
                            else
                            {
                                prop.Price = (val * val) * 250;
                            }
                            break;
                        }
                    #endregion
                    #region Bonus to Saving Throw Types
                    case ITEM_PROPERTY_SAVING_THROW_BONUS_SPECIFIC:
                        {
                            int val = script.GetItemPropertyCostTableValue(prop.Property);
                            if (val > 5)
                            {
                                if (debug) script.SendMessageToAllDMs("Illegal weapon because it provides a saving throw bonus greater than five.");
                                return -1;
                            }
                            prop.Price = (val * val) * 250;                            
                            break;
                        }
                    #endregion
                    #region Skill Bonus
                    case ITEM_PROPERTY_SKILL_BONUS:
                        {
                            int val = script.GetItemPropertyCostTableValue(prop.Property);
                            prop.Price = (val * val) * 100;
                            break;
                        }
                    #endregion
                    #region Spell Resistance
                    case ITEM_PROPERTY_SPELL_RESISTANCE:
                        {
                            switch (script.GetItemPropertyCostTableValue(prop.Property))
                            {
                                case IP_CONST_SPELLRESISTANCEBONUS_10:
                                    {
                                        prop.Price = 6000;
                                        break;
                                    }
                                case IP_CONST_SPELLRESISTANCEBONUS_12:
                                    {
                                        prop.Price = 10000;
                                        break;
                                    }
                                case IP_CONST_SPELLRESISTANCEBONUS_14:
                                    {
                                        prop.Price = 20000;
                                        break;
                                    }
                                case IP_CONST_SPELLRESISTANCEBONUS_16:
                                    {
                                        prop.Price = 40000;
                                        break;
                                    }
                                case IP_CONST_SPELLRESISTANCEBONUS_18:
                                    {
                                        prop.Price = 60000;
                                        break;
                                    }
                                case IP_CONST_SPELLRESISTANCEBONUS_20:
                                    {
                                        prop.Price = 80000;
                                        break;
                                    }
                                case IP_CONST_SPELLRESISTANCEBONUS_22:
                                    {
                                        prop.Price = 100000;
                                        break;
                                    }
                                case IP_CONST_SPELLRESISTANCEBONUS_24:
                                    {
                                        prop.Price = 120000;
                                        break;
                                    }
                                case IP_CONST_SPELLRESISTANCEBONUS_26:
                                    {
                                        prop.Price = 140000;
                                        break;
                                    }
                                default:
                                    {
                                        if (debug) script.SendMessageToAllDMs("Illegal weapon because it provides a spell resistance bonus greater than 26.");
                                        return -1;
                                    }
                            }
                            break;
                        }
                    #endregion
                    #region Unlimited Ammunition
                    case ITEM_PROPERTY_UNLIMITED_AMMUNITION:
                        {
                            effectivePlus += 0.5f;
                            switch (script.GetItemPropertyCostTableValue(prop.Property))
                            {
                                // Basic unlimited ammo just has the 0.5 above.
                                case IP_CONST_UNLIMITEDAMMO_BASIC:
                                    {
                                        break;
                                    }
                                // These are bonus elemental damage. Price as such.
                                case IP_CONST_UNLIMITEDAMMO_1D6COLD:
                                case IP_CONST_UNLIMITEDAMMO_1D6FIRE:
                                case IP_CONST_UNLIMITEDAMMO_1D6LIGHT:
                                    {
                                        effectivePlus += 1.5f;
                                        break;
                                    }
                                // These are actually only bonus physical damage. Price as such.
                                case IP_CONST_UNLIMITEDAMMO_PLUS1:
                                    {
                                        effectivePlus += +0.4f;
                                        break;
                                    }
                                case IP_CONST_UNLIMITEDAMMO_PLUS2:
                                    {
                                        effectivePlus += 0.8f;
                                        break;
                                    }
                                case IP_CONST_UNLIMITEDAMMO_PLUS3:
                                    {
                                        effectivePlus += 1.2f;
                                        break;
                                    }
                                case IP_CONST_UNLIMITEDAMMO_PLUS4:
                                    {
                                        effectivePlus += 1.6f;
                                        break;
                                    }
                                case IP_CONST_UNLIMITEDAMMO_PLUS5:
                                    {
                                        effectivePlus += 2.0f;
                                        break;
                                    }
                                default:
                                    {
                                        if (debug) script.SendMessageToAllDMs("Illegal weapon because it provides a variety of unlimited ammunition which is illegal.");
                                        return -1;
                                    }
                            }
                            break;
                        }
                    #endregion
                    #region Banned Properties
                    case ITEM_PROPERTY_BONUS_HITPOINTS:
                    case ITEM_PROPERTY_DAMAGE_REDUCTION:
                    case ITEM_PROPERTY_DARKVISION:
                    case ITEM_PROPERTY_ENHANCED_CONTAINER_REDUCED_WEIGHT:
                    case ITEM_PROPERTY_EXTRA_MELEE_DAMAGE_TYPE:
                    case ITEM_PROPERTY_EXTRA_RANGED_DAMAGE_TYPE:
                    case ITEM_PROPERTY_HASTE:
                    case ITEM_PROPERTY_HEALERS_KIT:
                    case ITEM_PROPERTY_HOLY_AVENGER:
                    case ITEM_PROPERTY_IMMUNITY_DAMAGE_TYPE:
                    case ITEM_PROPERTY_IMMUNITY_SPELL_SCHOOL:
                    case ITEM_PROPERTY_IMMUNITY_SPELLS_BY_LEVEL:
                    case ITEM_PROPERTY_IMPROVED_EVASION:
                    case ITEM_PROPERTY_MIND_BLANK:
                    case ITEM_PROPERTY_MONSTER_DAMAGE:
                    case ITEM_PROPERTY_ON_HIT_PROPERTIES:
                    case ITEM_PROPERTY_ON_MONSTER_HIT:
                    case ITEM_PROPERTY_ONHITCASTSPELL:
                    case ITEM_PROPERTY_POISON:
                    case ITEM_PROPERTY_REGENERATION:
                    case ITEM_PROPERTY_SPECIAL_WALK:
                    case ITEM_PROPERTY_THIEVES_TOOLS:
                    case ITEM_PROPERTY_TRAP:
                    case ITEM_PROPERTY_TRUE_SEEING:
                    case ITEM_PROPERTY_TURN_RESISTANCE:
                        {
                            if (debug) script.SendMessageToAllDMs("Illegal weapon because it provides an illegal property base type.");
                            return -1;
                        }
                    #endregion
                    #region Penalties and Non-Price-Affecting Properties
                    case ITEM_PROPERTY_DAMAGE_REDUCTION_DEPRECATED:
                    case ITEM_PROPERTY_DAMAGE_VULNERABILITY:
                    case ITEM_PROPERTY_DECREASED_ABILITY_SCORE:
                    case ITEM_PROPERTY_DECREASED_AC:
                    case ITEM_PROPERTY_DECREASED_ATTACK_MODIFIER:
                    case ITEM_PROPERTY_DECREASED_DAMAGE:
                    case ITEM_PROPERTY_DECREASED_ENHANCEMENT_MODIFIER:
                    case ITEM_PROPERTY_DECREASED_SAVING_THROWS:
                    case ITEM_PROPERTY_DECREASED_SAVING_THROWS_SPECIFIC:
                    case ITEM_PROPERTY_DECREASED_SKILL_MODIFIER:
                    case ITEM_PROPERTY_NO_DAMAGE:
                    case ITEM_PROPERTY_USE_LIMITATION_ALIGNMENT_GROUP:
                    case ITEM_PROPERTY_USE_LIMITATION_CLASS:
                    case ITEM_PROPERTY_USE_LIMITATION_RACIAL_TYPE:
                    case ITEM_PROPERTY_USE_LIMITATION_SPECIFIC_ALIGNMENT:
                    case ITEM_PROPERTY_VISUALEFFECT:
                    case ITEM_PROPERTY_WEIGHT_INCREASE:
                        {
                            // these props don't affect the price. break.
                            break;
                        }
                    #endregion
                }
            }
            #endregion

            #region Properties that are vs. Specifics
            foreach (PricedItemProperty prop in itProps)
            {
                if (prop.Price > 0) { continue; }
                int propType = script.GetItemPropertyType(prop.Property);
                switch (propType)
                {
                    #region AC Bonus vs. Alignement Group
                    case ITEM_PROPERTY_AC_BONUS_VS_ALIGNMENT_GROUP:
                        {
                            int ACvsGroup = script.GetItemPropertyCostTableValue(prop.Property);
                            if (ACvsGroup > ACvsEveryone)
                            {
                                float multiplier = 0.40f;
                                if (script.GetItemPropertySubType(prop.Property) == IP_CONST_ALIGNMENTGROUP_NEUTRAL)
                                {
                                    multiplier = 2.0f / 3.0f;
                                }
                                if (script.GetItemPropertySubType(prop.Property) == IP_CONST_ALIGNMENTGROUP_EVIL)
                                {
                                    multiplier = 0.50f;
                                }
                                float effectiveBonus = ((ACvsGroup - ACvsEveryone) * multiplier) + ACvsEveryone;
                                prop.Price = (int)((effectiveBonus * effectiveBonus * 2000) - (ACvsEveryone * ACvsEveryone * 2000));
                            }
                            break;
                        }
                    #endregion
                    #region AC Bonus vs. Damage Type
                    case ITEM_PROPERTY_AC_BONUS_VS_DAMAGE_TYPE:
                        {
                            int ACvsGroup = script.GetItemPropertyCostTableValue(prop.Property);
                            if (ACvsGroup > ACvsEveryone)
                            {
                                float multiplier = 1.0f / 3.0f;
                                float effectiveBonus = ((ACvsGroup - ACvsEveryone) * multiplier) + ACvsEveryone;
                                prop.Price = (int)((effectiveBonus * effectiveBonus * 2000) - (ACvsEveryone * ACvsEveryone * 2000));
                            }
                            break;
                        }
                    #endregion
                    #region AC Bonus vs. Racial Type
                    case ITEM_PROPERTY_AC_BONUS_VS_RACIAL_GROUP:
                        {
                            int ACvsGroup = script.GetItemPropertyCostTableValue(prop.Property);
                            if (ACvsGroup > ACvsEveryone)
                            {
                                float multiplier = 1.0f / 3.0f;
                                float effectiveBonus = ((ACvsGroup - ACvsEveryone) * multiplier) + ACvsEveryone;
                                prop.Price = (int)((effectiveBonus * effectiveBonus * 2000) - (ACvsEveryone * ACvsEveryone * 2000));
                            }
                            break;
                        }
                    #endregion
                    #region AC Bonus vs. Specific Alignment
                    case ITEM_PROPERTY_AC_BONUS_VS_SPECIFIC_ALIGNMENT:
                        {
                            int ACvsGroup = script.GetItemPropertyCostTableValue(prop.Property);
                            if (ACvsGroup > ACvsEveryone)
                            {
                                float multiplier = 1.0f / 6.0f;
                                float effectiveBonus = ((ACvsGroup - ACvsEveryone) * multiplier) + ACvsEveryone;
                                prop.Price = (int)((effectiveBonus * effectiveBonus * 2000) - (ACvsEveryone * ACvsEveryone * 2000));
                            }
                            break;
                        }
                    #endregion
                    #region Attack Bonus vs. Alignment Group
                    case ITEM_PROPERTY_ATTACK_BONUS_VS_ALIGNMENT_GROUP:
                        {
                            int attackVsGroup = script.GetItemPropertyCostTableValue(prop.Property);
                            if (attackVsGroup > attackVsEveryone)
                            {
                                float multiplier = 0.40f;
                                if (script.GetItemPropertySubType(prop.Property) == IP_CONST_ALIGNMENTGROUP_NEUTRAL)
                                {
                                    multiplier = 2.0f / 3.0f;
                                }
                                if (script.GetItemPropertySubType(prop.Property) == IP_CONST_ALIGNMENTGROUP_EVIL)
                                {
                                    multiplier = 0.50f;
                                }
                                effectivePlus += ((attackVsGroup - attackVsEveryone) * multiplier);
                            }
                            break;
                        }
                    #endregion
                    #region Attack Bonus vs. Racial Group
                    case ITEM_PROPERTY_ATTACK_BONUS_VS_RACIAL_GROUP:
                        {
                            int attackVsGroup = script.GetItemPropertyCostTableValue(prop.Property);
                            if (attackVsGroup > attackVsEveryone)
                            {
                                float multiplier = 1.0f / 3.0f;
                                effectivePlus += ((attackVsGroup - attackVsEveryone) * multiplier);
                            }
                            break;
                        }
                    #endregion
                    #region Attack Bonus vs. Specific Alignment
                    case ITEM_PROPERTY_ATTACK_BONUS_VS_SPECIFIC_ALIGNMENT:
                        {
                            int attackVsGroup = script.GetItemPropertyCostTableValue(prop.Property);
                            if (attackVsGroup > attackVsEveryone)
                            {
                                float multiplier = 1.0f/6.0f;
                                effectivePlus += ((attackVsGroup - attackVsEveryone) * multiplier);
                            }
                            break;
                        }
                    #endregion
                    #region Damage Bonus vs. Alignment Group
                    case ITEM_PROPERTY_DAMAGE_BONUS_VS_ALIGNMENT_GROUP:
                        {
                            float multiplier = 0.40f;
                            if (script.GetItemPropertySubType(prop.Property) == IP_CONST_ALIGNMENTGROUP_NEUTRAL)
                            {
                                multiplier = 2.0f / 3.0f;
                            }
                            if (script.GetItemPropertySubType(prop.Property) == IP_CONST_ALIGNMENTGROUP_EVIL)
                            {
                                multiplier = 0.50f;
                            }
                            switch (script.GetItemPropertyCostTableValue(prop.Property))
                            {
                                case IP_CONST_DAMAGEBONUS_1d4:
                                    {
                                        effectivePlus += (1.3f * multiplier);
                                        break;
                                    }
                                case IP_CONST_DAMAGEBONUS_1d6:
                                    {
                                        effectivePlus += (2.0f * multiplier);
                                        break;
                                    }
                                case IP_CONST_DAMAGEBONUS_1d8:
                                    {
                                        effectivePlus += (2.7f * multiplier);
                                        break;
                                    }
                                case IP_CONST_DAMAGEBONUS_2d4:
                                    {
                                        effectivePlus += (3.0f * multiplier);
                                        break;
                                    }
                                case IP_CONST_DAMAGEBONUS_1:
                                    {
                                        effectivePlus += (0.7f * multiplier);
                                        break;
                                    }
                                case IP_CONST_DAMAGEBONUS_2:
                                    {
                                        effectivePlus += (1.1f * multiplier);
                                        break;
                                    }
                                case IP_CONST_DAMAGEBONUS_3:
                                    {
                                        effectivePlus += (1.5f * multiplier);
                                        break;
                                    }
                                case IP_CONST_DAMAGEBONUS_4:
                                    {
                                        effectivePlus += (2.1f * multiplier);
                                        break;
                                    }
                                case IP_CONST_DAMAGEBONUS_5:
                                    {
                                        effectivePlus += (2.5f * multiplier);
                                        break;
                                    }
                                default:
                                    {
                                        if (debug) script.SendMessageToAllDMs("Illegal weapon because it provides an unsupported damage type vs. alignment groups.");
                                        return -1;
                                    }
                            }
                            break;
                        }
                    #endregion
                    #region Damage Bonus vs. Racial Group
                    case ITEM_PROPERTY_DAMAGE_BONUS_VS_RACIAL_GROUP:
                        {
                            float multiplier = 1.0f / 3.0f;
                            switch (script.GetItemPropertyCostTableValue(prop.Property))
                            {
                                case IP_CONST_DAMAGEBONUS_1d4:
                                    {
                                        effectivePlus += (1.3f * multiplier);
                                        break;
                                    }
                                case IP_CONST_DAMAGEBONUS_1d6:
                                    {
                                        effectivePlus += (2.0f * multiplier);
                                        break;
                                    }
                                case IP_CONST_DAMAGEBONUS_1d8:
                                    {
                                        effectivePlus += (2.7f * multiplier);
                                        break;
                                    }
                                case IP_CONST_DAMAGEBONUS_2d4:
                                    {
                                        effectivePlus += (3.0f * multiplier);
                                        break;
                                    }
                                case IP_CONST_DAMAGEBONUS_1:
                                    {
                                        effectivePlus += (0.7f * multiplier);
                                        break;
                                    }
                                case IP_CONST_DAMAGEBONUS_2:
                                    {
                                        effectivePlus += (1.1f * multiplier);
                                        break;
                                    }
                                case IP_CONST_DAMAGEBONUS_3:
                                    {
                                        effectivePlus += (1.5f * multiplier);
                                        break;
                                    }
                                case IP_CONST_DAMAGEBONUS_4:
                                    {
                                        effectivePlus += (2.1f * multiplier);
                                        break;
                                    }
                                case IP_CONST_DAMAGEBONUS_5:
                                    {
                                        effectivePlus += (2.5f * multiplier);
                                        break;
                                    }
                                default:
                                    {
                                        if (debug) script.SendMessageToAllDMs("Illegal weapon because it provides an unsupported damage type vs. racial groups.");
                                        return -1;
                                    }
                            }
                            break;
                        }
                    #endregion
                    #region Damage Bonus vs. Specific Alignment
                    case ITEM_PROPERTY_DAMAGE_BONUS_VS_SPECIFIC_ALIGNMENT:
                        {
                            float multiplier = 1.0f / 6.0f;
                            switch (script.GetItemPropertyCostTableValue(prop.Property))
                            {
                                case IP_CONST_DAMAGEBONUS_1d4:
                                    {
                                        effectivePlus += (1.3f * multiplier);
                                        break;
                                    }
                                case IP_CONST_DAMAGEBONUS_1d6:
                                    {
                                        effectivePlus += (2.0f * multiplier);
                                        break;
                                    }
                                case IP_CONST_DAMAGEBONUS_1d8:
                                    {
                                        effectivePlus += (2.7f * multiplier);
                                        break;
                                    }
                                case IP_CONST_DAMAGEBONUS_2d4:
                                    {
                                        effectivePlus += (3.0f * multiplier);
                                        break;
                                    }
                                case IP_CONST_DAMAGEBONUS_1:
                                    {
                                        effectivePlus += (0.7f * multiplier);
                                        break;
                                    }
                                case IP_CONST_DAMAGEBONUS_2:
                                    {
                                        effectivePlus += (1.1f * multiplier);
                                        break;
                                    }
                                case IP_CONST_DAMAGEBONUS_3:
                                    {
                                        effectivePlus += (1.5f * multiplier);
                                        break;
                                    }
                                case IP_CONST_DAMAGEBONUS_4:
                                    {
                                        effectivePlus += (2.1f * multiplier);
                                        break;
                                    }
                                case IP_CONST_DAMAGEBONUS_5:
                                    {
                                        effectivePlus += (2.5f * multiplier);
                                        break;
                                    }
                                default:
                                    {
                                        if (debug) script.SendMessageToAllDMs("Illegal weapon because it provides an unsupported damage type vs. specific alignments.");
                                        return -1;
                                    }
                            }
                            break;
                        }
                    #endregion
                    #region Enhancement Bonus vs. Alignment Group
                    case ITEM_PROPERTY_ENHANCEMENT_BONUS_VS_ALIGNMENT_GROUP:
                        {
                            int enhancementVsGroup = script.GetItemPropertyCostTableValue(prop.Property);
                            if (enhancementVsGroup > enhancementVsEveryone)
                            {
                                float multiplier = 0.40f;
                                if (script.GetItemPropertySubType(prop.Property) == IP_CONST_ALIGNMENTGROUP_NEUTRAL)
                                {
                                    multiplier = 2.0f / 3.0f;
                                }
                                if (script.GetItemPropertySubType(prop.Property) == IP_CONST_ALIGNMENTGROUP_EVIL)
                                {
                                    multiplier = 0.50f;
                                }
                                effectivePlus += ((enhancementVsGroup - enhancementVsEveryone) * multiplier);
                            }
                            break;
                        }
                    #endregion
                    #region Enhancement Bonus vs. Racial Group
                    case ITEM_PROPERTY_ENHANCEMENT_BONUS_VS_RACIAL_GROUP:
                        {
                            int enhancementVsGroup = script.GetItemPropertyCostTableValue(prop.Property);
                            if (enhancementVsGroup > enhancementVsEveryone)
                            {
                                float multiplier = 1.0f / 3.0f;
                                effectivePlus += ((enhancementVsGroup - enhancementVsEveryone) * multiplier);
                            }
                            break;
                        }
                    #endregion
                    #region Enhancement Bonus vs. Specific Alignment
                    case ITEM_PROPERTY_ENHANCEMENT_BONUS_VS_SPECIFIC_ALIGNEMENT:
                        {
                            int enhancementVsGroup = script.GetItemPropertyCostTableValue(prop.Property);
                            if (enhancementVsGroup > enhancementVsEveryone)
                            {
                                float multiplier = 1.0f / 6.0f;
                                effectivePlus += ((enhancementVsGroup - enhancementVsEveryone) * multiplier);
                            }
                            break;
                        }
                    #endregion
                }
            }
            #endregion
            #endregion

            #region Sum Calculated Values
            #region Permanent Properties
            value += enchantmentPenalty;
            bool allSecondary = false;
            if (effectivePlus >= 0.05f)
            {
                allSecondary = true;
                if (effectivePlus >= 1.0f)
                {
                    if (enhancementVsEveryone < 0.99 && !GetIsAmmunition(itemType))
                    {
                        script.SendMessageToAllDMs("Illegal weapon because total enhancement is 1 or greater, but no baseline enhancement bonus is established.");
                        return -1;
                    }
                    value += (int)((effectivePlus * effectivePlus) * 2000);
                }
                else
                {
                    value += (int)(effectivePlus * 2000);
                }
            }
            int costliestProp = 0;
            int propsPrice = 0;
            PricedItemProperty costliestCharge = null;
            PricedItemProperty secondCostliestCharge = null;
            foreach (PricedItemProperty prop in itProps)
            {
                value += prop.Price;
                propsPrice += prop.Price;
                if (costliestProp < prop.Price)
                {
                    costliestProp = prop.Price;
                }
                if (prop.ChargedPrice > 0)
                {
                    if (costliestCharge == null)
                    {
                        costliestCharge = prop;
                    }
                    else if (prop.ChargedPrice > costliestCharge.ChargedPrice)
                    {
                        secondCostliestCharge = costliestCharge;
                        costliestCharge = prop;
                    }
                    else if(secondCostliestCharge == null)
                    {
                        secondCostliestCharge = prop;
                    }
                    else if (prop.ChargedPrice > secondCostliestCharge.ChargedPrice)
                    {
                        secondCostliestCharge = prop;
                    }
                }
            }
            if (allSecondary)
            {
                value += (propsPrice / 2);
            }
            else
            {
                // If the costliest prop is the only prop, 0/2 = 0.
                // otherwise, all secondary props cost 50% more.
                value += ((propsPrice - costliestProp) / 2);
            }
            #endregion

            #region Charge-Consuming Properties
            int chargesCost = 0;
            if (costliestCharge != null)
            {
                if (secondCostliestCharge == null)
                {
                    chargesCost += costliestCharge.ChargedPrice * script.GetItemCharges(target);
                    value += costliestCharge.ChargedPrice * script.GetItemCharges(target);
                }
                else
                {
                    foreach (PricedItemProperty prop in itProps)
                    {
                        if (costliestCharge == prop)
                        {
                            chargesCost += prop.ChargedPrice * script.GetItemCharges(target);
                            value += prop.ChargedPrice * script.GetItemCharges(target);
                        }
                        else if (secondCostliestCharge == prop)
                        {
                            chargesCost += (prop.ChargedPrice * script.GetItemCharges(target) * 3) / 4;
                            value += (prop.ChargedPrice * script.GetItemCharges(target) * 3) / 4;
                        }
                        else
                        {
                            chargesCost += (prop.ChargedPrice * script.GetItemCharges(target)) / 2;
                            value += (prop.ChargedPrice * script.GetItemCharges(target)) / 2;
                        }
                    }
                }
            }
            if (IsClassRestricted)
            {
                value -= (chargesCost - ((chargesCost * 750) / 1800));
            }
            #endregion
            #endregion

            #region Correct for Ammunition
            if (GetIsAmmunition(itemType))
            {
                value /= 100;
            }
            #endregion
            return value;
        }
        public bool recalculate(CLRScriptBase script)
        {
            // Ensure that both our hide and our creature are still valid.
            if (script.GetIsObjectValid(m_oCreature) == CLRScriptBase.FALSE || script.GetIsObjectValid(m_oCreature) == CLRScriptBase.FALSE)
            {
                return false;
            }

            // Recreate the hide.
            script.AssignCommand(m_oCreature, delegate { script.ClearAllActions(CLRScriptBase.FALSE); });
            uint oOldHide = getHide(script);
            m_oHide = script.CreateItemOnObject("acr_pchide", m_oCreature, 1, "acr_pchide", CLRScriptBase.FALSE);

            // Temp variables to store bonuses, to allow stacking from different sources.
            Dictionary<int, int> saveBonuses = new Dictionary<int, int>();
            Dictionary<int, int> skillBonuses = new Dictionary<int, int>();
            Dictionary<string, int> otherBonuses = new Dictionary<string, int>();

            // Initialize dictionaries.
            for (int i = 0; i < 68; i++)
            {
                skillBonuses.Add(i, 0);
            }
            for (int i = 0; i < 4; i++)
            {
                saveBonuses.Add(i, 0);
            }

            #region Skill Focus feats
            // Handle all new shiny skill focus feats.
            if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_BALANCE, m_oCreature, 1) == CLRScriptBase.TRUE) skillBonuses[(int)SKILLS.SKILL_BALANCE] += 3;
            if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_CLIMB, m_oCreature, 1) == CLRScriptBase.TRUE) skillBonuses[(int)SKILLS.SKILL_CLIMB] += 3;
            if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_CRFT_ALCH, m_oCreature, 1) == CLRScriptBase.TRUE) skillBonuses[(int)SKILLS.SKILL_CRAFT_ALCHEMY] += 3;
            if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_CRFT_ARM, m_oCreature, 1) == CLRScriptBase.TRUE) skillBonuses[(int)SKILLS.SKILL_CRAFT_ARMORSMITHING] += 3;
            if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_CRFT_BOW, m_oCreature, 1) == CLRScriptBase.TRUE) skillBonuses[(int)SKILLS.SKILL_CRAFT_BOWMAKING] += 3;
            if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_CRFT_WPN, m_oCreature, 1) == CLRScriptBase.TRUE) skillBonuses[(int)SKILLS.SKILL_CRAFT_WEAPONSMITHING] += 3;
            if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_DECIPHER, m_oCreature, 1) == CLRScriptBase.TRUE) skillBonuses[(int)SKILLS.SKILL_DECIPHER_SCRIPT] += 3;
            if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_DISGUISE, m_oCreature, 1) == CLRScriptBase.TRUE) skillBonuses[(int)SKILLS.SKILL_DISGUISE] += 3;
            if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_ESC_ART, m_oCreature, 1) == CLRScriptBase.TRUE) skillBonuses[(int)SKILLS.SKILL_ESCAPE_ARTIST] += 3;
            if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_HAND_ANIM, m_oCreature, 1) == CLRScriptBase.TRUE) skillBonuses[(int)SKILLS.SKILL_HANDLE_ANIMAL] += 3;
            if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_JUMP, m_oCreature, 1) == CLRScriptBase.TRUE) skillBonuses[(int)SKILLS.SKILL_JUMP] += 3;
            if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_KNOW_ARC, m_oCreature, 1) == CLRScriptBase.TRUE) skillBonuses[(int)SKILLS.SKILL_KNOWLEDGE_ARCANA] += 3;
            if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_KNOW_DUNG, m_oCreature, 1) == CLRScriptBase.TRUE) skillBonuses[(int)SKILLS.SKILL_KNOWLEDGE_DUNGEONEERING] += 3;
            if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_KNOW_ENG, m_oCreature, 1) == CLRScriptBase.TRUE) skillBonuses[(int)SKILLS.SKILL_KNOWLEDGE_ENGINEERING] += 3;
            if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_KNOW_GEO, m_oCreature, 1) == CLRScriptBase.TRUE) skillBonuses[(int)SKILLS.SKILL_KNOWLEDGE_GEOGRAPHY] += 3;
            if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_KNOW_HIST, m_oCreature, 1) == CLRScriptBase.TRUE) skillBonuses[(int)SKILLS.SKILL_KNOWLEDGE_HISTORY] += 3;
            if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_KNOW_LOC, m_oCreature, 1) == CLRScriptBase.TRUE) skillBonuses[(int)SKILLS.SKILL_KNOWLEDGE_LOCAL] += 3;
            if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_KNOW_NATR, m_oCreature, 1) == CLRScriptBase.TRUE) skillBonuses[(int)SKILLS.SKILL_KNOWLEDGE_NATURE] += 3;
            if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_KNOW_NOBL, m_oCreature, 1) == CLRScriptBase.TRUE) skillBonuses[(int)SKILLS.SKILL_KNOWLEDGE_NOBILITY] += 3;
            if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_KNOW_PLAN, m_oCreature, 1) == CLRScriptBase.TRUE) skillBonuses[(int)SKILLS.SKILL_KNOWLEDGE_THE_PLANES] += 3;
            if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_KNOW_RELG, m_oCreature, 1) == CLRScriptBase.TRUE) skillBonuses[(int)SKILLS.SKILL_KNOWLEDGE_RELIGION] += 3;
            if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_PERF_ACT, m_oCreature, 1) == CLRScriptBase.TRUE) skillBonuses[(int)SKILLS.SKILL_PERFORM_ACT] += 3;
            if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_PERF_COMD, m_oCreature, 1) == CLRScriptBase.TRUE) skillBonuses[(int)SKILLS.SKILL_PERFORM_COMEDY] += 3;
            if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_PERF_DANC, m_oCreature, 1) == CLRScriptBase.TRUE) skillBonuses[(int)SKILLS.SKILL_PERFORM_DANCE] += 3;
            if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_PERF_KEYB, m_oCreature, 1) == CLRScriptBase.TRUE) skillBonuses[(int)SKILLS.SKILL_PERFORM_KEYBOARD] += 3;
            if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_PERF_ORAT, m_oCreature, 1) == CLRScriptBase.TRUE) skillBonuses[(int)SKILLS.SKILL_PERFORM_ORATORY] += 3;
            if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_PERF_PERC, m_oCreature, 1) == CLRScriptBase.TRUE) skillBonuses[(int)SKILLS.SKILL_PERFORM_PERCUSSION] += 3;
            if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_PERF_SING, m_oCreature, 1) == CLRScriptBase.TRUE) skillBonuses[(int)SKILLS.SKILL_PERFORM_SING] += 3;
            if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_PERF_STRG, m_oCreature, 1) == CLRScriptBase.TRUE) skillBonuses[(int)SKILLS.SKILL_PERFORM_STRING_INSTRUMENTS] += 3;
            if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_PERF_WIND, m_oCreature, 1) == CLRScriptBase.TRUE) skillBonuses[(int)SKILLS.SKILL_PERFORM_WIND_INSTRUMENTS] += 3;
            if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_PROF, m_oCreature, 1) == CLRScriptBase.TRUE) skillBonuses[(int)SKILLS.SKILL_PROFESSION] += 3;
            if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_RIDE, m_oCreature, 1) == CLRScriptBase.TRUE) skillBonuses[(int)SKILLS.SKILL_RIDE] += 3;
            if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_SENS_MOTV, m_oCreature, 1) == CLRScriptBase.TRUE) skillBonuses[(int)SKILLS.SKILL_SPEAK_LANGUAGE] += 3;
            if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_SPK_LANG, m_oCreature, 1) == CLRScriptBase.TRUE) skillBonuses[(int)SKILLS.SKILL_KNOWLEDGE_LOCAL] += 3;
            if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_SWIM, m_oCreature, 1) == CLRScriptBase.TRUE) skillBonuses[(int)SKILLS.SKILL_SWIM] += 3;
            if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_USE_ROPE, m_oCreature, 1) == CLRScriptBase.TRUE) skillBonuses[(int)SKILLS.SKILL_USE_ROPE] += 3;
            #endregion

            // Artist is one bad-ass feat.
            if (script.GetHasFeat(CLRScriptBase.FEAT_ARTIST, m_oCreature, 1) == CLRScriptBase.TRUE)
            {
                // Previously: +2 perform, +2 diplomacy
                // Currently: +2 perform (all), 3 extra bardic music uses per day
                skillBonuses[CLRScriptBase.SKILL_DIPLOMACY] -= 2;
                skillBonuses[(int)SKILLS.SKILL_PERFORM_ACT] += 2;
                skillBonuses[(int)SKILLS.SKILL_PERFORM_COMEDY] += 2;
                skillBonuses[(int)SKILLS.SKILL_PERFORM_DANCE] += 2;
                skillBonuses[(int)SKILLS.SKILL_PERFORM_KEYBOARD] += 2;
                skillBonuses[(int)SKILLS.SKILL_PERFORM_ORATORY] += 2;
                skillBonuses[(int)SKILLS.SKILL_PERFORM_PERCUSSION] += 2;
                skillBonuses[(int)SKILLS.SKILL_PERFORM_SING] += 2;
                skillBonuses[(int)SKILLS.SKILL_PERFORM_STRING_INSTRUMENTS] += 2;
                skillBonuses[(int)SKILLS.SKILL_PERFORM_WIND_INSTRUMENTS] += 2;
            }

            // Add skill bonuses to item.
            foreach (int skill in skillBonuses.Keys)
            {
                if (skillBonuses[skill] == 0)
                {
                    continue;
                }
                else if (skillBonuses[skill] > 0)
                {
                    script.AddItemProperty(CLRScriptBase.DURATION_TYPE_PERMANENT, script.ItemPropertySkillBonus(skill, skillBonuses[skill]), m_oHide, 0.0f);
                }
                else if (skillBonuses[skill] < 0)
                {
                    script.AddItemProperty(CLRScriptBase.DURATION_TYPE_PERMANENT, script.ItemPropertyDecreaseSkill(skill, Math.Abs(skillBonuses[skill])), m_oHide, 0.0f);
                }
            }

            // Add save bonuses to item.
            foreach (int save in saveBonuses.Keys)
            {
                if (saveBonuses[save] == 0)
                {
                    continue;
                }
                else if (saveBonuses[save] > 0)
                {
                    script.AddItemProperty(CLRScriptBase.DURATION_TYPE_PERMANENT, script.ItemPropertyBonusSavingThrow(save, saveBonuses[save]), m_oHide, 0.0f);
                }
                else if (saveBonuses[save] < 0)
                {
                    script.AddItemProperty(CLRScriptBase.DURATION_TYPE_PERMANENT, script.ItemPropertyReducedSavingThrow(save, Math.Abs(saveBonuses[save])), m_oHide, 0.0f);
                }
            }

            // Make the person equip the new item.
            script.AssignCommand(m_oCreature, delegate { script.ClearAllActions(CLRScriptBase.FALSE); });
            script.AssignCommand(m_oCreature, delegate { script.ActionEquipItem(m_oHide, CLRScriptBase.INVENTORY_SLOT_CARMOUR); });
            script.DestroyObject(oOldHide, 0.0f, CLRScriptBase.FALSE);
            script.SendMessageToPC(m_oCreature, "PC Hide refreshed.");

            // Everything looks fine, return our success.
            return true;
        }
 public static int NewBoots(CLRScriptBase script, int maxValue)
 {
     List<int> potentialAbilities = new List<int>();
     foreach (KeyValuePair<int, int> ability in AvailableAbilities)
     {
         if (ability.Value <= maxValue)
         {
             potentialAbilities.Add(ability.Key);
         }
     }
     if (potentialAbilities.Count == 0)
     {
         return 0;
     }
     int selectedAbility = potentialAbilities[Generation.rand.Next(potentialAbilities.Count)];
     uint Boots = script.CreateItemOnObject("zitem_boot2", script.OBJECT_SELF, 1, "", FALSE);
     switch (selectedAbility)
     {
         #region Boots of Ability Boosts
         case ITEM_PROPERTY_ABILITY_BONUS:
             {
                 int abilityScore = AvailableAbilityScores[Generation.rand.Next(AvailableAbilityScores.Count)];
                 string name = AbilityScoreNames[abilityScore];
                 if (maxValue >= 36000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyAbilityBonus(abilityScore, 6), Boots, 0.0f);
                     script.SetFirstName(Boots, name + " +6");
                     Pricing.CalculatePrice(script, Boots);
                     return 36000;
                 }
                 else if (maxValue >= 25000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyAbilityBonus(abilityScore, 5), Boots, 0.0f);
                     script.SetFirstName(Boots, name + " +5");
                     Pricing.CalculatePrice(script, Boots);
                     return 25000;
                 }
                 else if (maxValue >= 16000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyAbilityBonus(abilityScore, 4), Boots, 0.0f);
                     script.SetFirstName(Boots, name + " +4");
                     Pricing.CalculatePrice(script, Boots);
                     return 16000;
                 }
                 else if (maxValue >= 9000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyAbilityBonus(abilityScore, 3), Boots, 0.0f);
                     script.SetFirstName(Boots, name + " +3");
                     Pricing.CalculatePrice(script, Boots);
                     return 9000;
                 }
                 else if (maxValue >= 4000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyAbilityBonus(abilityScore, 2), Boots, 0.0f);
                     script.SetFirstName(Boots, name + " +2");
                     Pricing.CalculatePrice(script, Boots);
                     return 4000;
                 }
                 else if (maxValue >= 1000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyAbilityBonus(abilityScore, 1), Boots, 0.0f);
                     script.SetFirstName(Boots, name + " +1");
                     Pricing.CalculatePrice(script, Boots);
                     return 1000;
                 }
                 else
                 {
                     return 0;
                 }
             }
         #endregion
         #region Freedom of Movement
         case ITEM_PROPERTY_FREEDOM_OF_MOVEMENT:
             {
                 script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyFreeAction(), Boots, 0.0f);
                 script.SetFirstName(Boots, "Boots of Freedom");
                 Pricing.CalculatePrice(script, Boots);
                 return 40000;
             }
         #endregion
         #region Immunities
         case ITEM_PROPERTY_IMMUNITY_MISCELLANEOUS:
             {
                 List<int> possibleImmunities = new List<int>();
                 foreach (KeyValuePair<int, int> immunity in AvailableImmunities)
                 {
                     if (immunity.Value <= maxValue)
                     {
                         possibleImmunities.Add(immunity.Key);
                     }
                 }
                 if (possibleImmunities.Count == 0)
                 {
                     return 0;
                 }
                 int selectedImmunity = possibleImmunities[Generation.rand.Next(possibleImmunities.Count)];
                 script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyImmunityMisc(selectedImmunity), Boots, 0.0f);
                 script.SetFirstName(Boots, ImmunityNames[selectedImmunity]);
                 Pricing.CalculatePrice(script, Boots);
                 return AvailableImmunities[selectedImmunity];
             }
         #endregion
         #region Skill Bonus
         case ITEM_PROPERTY_SKILL_BONUS:
             {
                 int skillBonus = AvailableSkills[Generation.rand.Next(AvailableSkills.Count)];
                 script.SetFirstName(Boots, SkillNames[skillBonus]);
                 if (maxValue >= 10000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertySkillBonus(skillBonus, 10), Boots, 0.0f);
                     script.SetFirstName(Boots, script.GetName(Boots) + " +10");
                     Pricing.CalculatePrice(script, Boots);
                     return 10000;
                 }
                 else if (maxValue >= 8100)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertySkillBonus(skillBonus, 9), Boots, 0.0f);
                     script.SetFirstName(Boots, script.GetName(Boots) + " +9");
                     Pricing.CalculatePrice(script, Boots);
                     return 8100;
                 }
                 else if (maxValue >= 6400)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertySkillBonus(skillBonus, 8), Boots, 0.0f);
                     script.SetFirstName(Boots, script.GetName(Boots) + " +8");
                     Pricing.CalculatePrice(script, Boots);
                     return 6400;
                 }
                 else if (maxValue >= 4900)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertySkillBonus(skillBonus, 7), Boots, 0.0f);
                     script.SetFirstName(Boots, script.GetName(Boots) + " +7");
                     Pricing.CalculatePrice(script, Boots);
                     return 4900;
                 }
                 else if (maxValue >= 3600)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertySkillBonus(skillBonus, 6), Boots, 0.0f);
                     script.SetFirstName(Boots, script.GetName(Boots) + " +6");
                     Pricing.CalculatePrice(script, Boots);
                     return 3600;
                 }
                 else if (maxValue >= 2500)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertySkillBonus(skillBonus, 5), Boots, 0.0f);
                     script.SetFirstName(Boots, script.GetName(Boots) + " +5");
                     Pricing.CalculatePrice(script, Boots);
                     return 2500;
                 }
                 else if (maxValue >= 1600)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertySkillBonus(skillBonus, 4), Boots, 0.0f);
                     script.SetFirstName(Boots, script.GetName(Boots) + " +4");
                     Pricing.CalculatePrice(script, Boots);
                     return 1600;
                 }
                 else if (maxValue >= 900)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertySkillBonus(skillBonus, 3), Boots, 0.0f);
                     script.SetFirstName(Boots, script.GetName(Boots) + " +3");
                     Pricing.CalculatePrice(script, Boots);
                     return 900;
                 }
                 else if (maxValue >= 400)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertySkillBonus(skillBonus, 2), Boots, 0.0f);
                     script.SetFirstName(Boots, script.GetName(Boots) + " +2");
                     Pricing.CalculatePrice(script, Boots);
                     return 400;
                 }
                 else if (maxValue >= 100)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertySkillBonus(skillBonus, 1), Boots, 0.0f);
                     script.SetFirstName(Boots, script.GetName(Boots) + " +1");
                     Pricing.CalculatePrice(script, Boots);
                     return 100;
                 }
                 else
                 {
                     return 0;
                 }
             }
         #endregion
     }
     script.DestroyObject(Boots, 0.0f, FALSE);
     return 0;
 }
 public static int NewRing(CLRScriptBase script, int maxValue)
 {
     List<int> potentialAbilities = new List<int>();
     foreach (KeyValuePair<int, int> ability in AvailableAbilities)
     {
         if (ability.Value <= maxValue)
         {
             potentialAbilities.Add(ability.Key);
         }
     }
     if (potentialAbilities.Count == 0)
     {
         return 0;
     }
     int selectedAbility = potentialAbilities[Generation.rand.Next(potentialAbilities.Count)];
     uint ring = script.CreateItemOnObject("nw_it_mring021", script.OBJECT_SELF, 1, "", FALSE);
     switch (selectedAbility)
     {
         #region Rings of Deflection
         case ITEM_PROPERTY_AC_BONUS:
             {
                 string name = AbilityNames[selectedAbility];
                 if (maxValue >= 50000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyACBonus(5), ring, 0.0f);
                     script.SetFirstName(ring, name + " +5");
                     Pricing.CalculatePrice(script, ring);
                     return 50000;
                 }
                 else if (maxValue >= 32000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyACBonus(4), ring, 0.0f);
                     script.SetFirstName(ring, name + " +4");
                     Pricing.CalculatePrice(script, ring);
                     return 32000;
                 }
                 else if (maxValue >= 18000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyACBonus(3), ring, 0.0f);
                     script.SetFirstName(ring, name + " +3");
                     Pricing.CalculatePrice(script, ring);
                     return 18000;
                 }
                 else if (maxValue >= 8000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyACBonus(2), ring, 0.0f);
                     script.SetFirstName(ring, name + " +2");
                     Pricing.CalculatePrice(script, ring);
                     return 8000;
                 }
                 else if (maxValue >= 2000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyACBonus(1), ring, 0.0f);
                     script.SetFirstName(ring, name + " +1");
                     Pricing.CalculatePrice(script, ring);
                     return 2000;
                 }
                 else
                 {
                     return 0;
                 }
             }
         #endregion
         #region Rings of Ability Scores
         case ITEM_PROPERTY_ABILITY_BONUS:
             {
                 int abilityScore = AvailableAbilityScores[Generation.rand.Next(AvailableAbilityScores.Count)];
                 string name = AbilityScoreNames[abilityScore];
                 if (maxValue >= 36000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyAbilityBonus(abilityScore, 6), ring, 0.0f);
                     script.SetFirstName(ring, name + " +6");
                     Pricing.CalculatePrice(script, ring);
                     return 36000;
                 }
                 else if (maxValue >= 25000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyAbilityBonus(abilityScore, 5), ring, 0.0f);
                     script.SetFirstName(ring, name + " +5");
                     Pricing.CalculatePrice(script, ring);
                     return 25000;
                 }
                 else if (maxValue >= 16000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyAbilityBonus(abilityScore, 4), ring, 0.0f);
                     script.SetFirstName(ring, name + " +4");
                     Pricing.CalculatePrice(script, ring);
                     return 16000;
                 }
                 else if (maxValue >= 9000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyAbilityBonus(abilityScore, 3), ring, 0.0f);
                     script.SetFirstName(ring, name + " +3");
                     Pricing.CalculatePrice(script, ring);
                     return 9000;
                 }
                 else if (maxValue >= 4000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyAbilityBonus(abilityScore, 2), ring, 0.0f);
                     script.SetFirstName(ring, name + " +2");
                     Pricing.CalculatePrice(script, ring);
                     return 4000;
                 }
                 else if (maxValue >= 1000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyAbilityBonus(abilityScore, 1), ring, 0.0f);
                     script.SetFirstName(ring, name + " +1");
                     Pricing.CalculatePrice(script, ring);
                     return 1000;
                 }
                 else
                 {
                     return 0;
                 }
             }
         #endregion
         #region Rings with Bonus Feats
         case ITEM_PROPERTY_BONUS_FEAT:
             {
                 List<int> possibleFeats = new List<int>();
                 foreach (KeyValuePair<int, int> feat in AvailableFeats)
                 {
                     if (feat.Value <= maxValue)
                     {
                         possibleFeats.Add(feat.Key);
                     }
                 }
                 if (possibleFeats.Count == 0)
                 {
                     return 0;
                 }
                 int selectedFeat = possibleFeats[Generation.rand.Next(possibleFeats.Count)];
                 script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyBonusFeat(selectedFeat), ring, 0.0f);
                 script.SetFirstName(ring, FeatNames[selectedFeat]);
                 Pricing.CalculatePrice(script, ring);
                 return AvailableFeats[selectedFeat];
             }
         #endregion
         #region Bonus Spell Slots
         case ITEM_PROPERTY_BONUS_SPELL_SLOT_OF_LEVEL_N:
             {
                 int bonusType = AvailableBonusSpells[Generation.rand.Next(AvailableBonusSpells.Count)];
                 string name = BonusSpellNames[bonusType];
                 if (maxValue >= 81000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyBonusLevelSpell(bonusType, IP_CONST_SPELLLEVEL_9), ring, 0.0f);
                     script.SetFirstName(ring, name + " IX");
                     Pricing.CalculatePrice(script, ring);
                     return 81000;
                 }
                 else if (maxValue >= 64000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyBonusLevelSpell(bonusType, IP_CONST_SPELLLEVEL_8), ring, 0.0f);
                     script.SetFirstName(ring, name + " VIII");
                     Pricing.CalculatePrice(script, ring);
                     return 64000;
                 }
                 else if (maxValue >= 49000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyBonusLevelSpell(bonusType, IP_CONST_SPELLLEVEL_7), ring, 0.0f);
                     script.SetFirstName(ring, name + " VII");
                     Pricing.CalculatePrice(script, ring);
                     return 49000;
                 }
                 else if (maxValue >= 36000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyBonusLevelSpell(bonusType, IP_CONST_SPELLLEVEL_6), ring, 0.0f);
                     script.SetFirstName(ring, name + " VI");
                     Pricing.CalculatePrice(script, ring);
                     return 36000;
                 }
                 else if (maxValue >= 25000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyBonusLevelSpell(bonusType, IP_CONST_SPELLLEVEL_5), ring, 0.0f);
                     script.SetFirstName(ring, name + " V");
                     Pricing.CalculatePrice(script, ring);
                     return 25000;
                 }
                 else if (maxValue >= 16000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyBonusLevelSpell(bonusType, IP_CONST_SPELLLEVEL_4), ring, 0.0f);
                     script.SetFirstName(ring, name + " IV");
                     Pricing.CalculatePrice(script, ring);
                     return 16000;
                 }
                 else if (maxValue >= 9000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyBonusLevelSpell(bonusType, IP_CONST_SPELLLEVEL_3), ring, 0.0f);
                     script.SetFirstName(ring, name + " III");
                     Pricing.CalculatePrice(script, ring);
                     return 9000;
                 }
                 else if (maxValue >= 4000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyBonusLevelSpell(bonusType, IP_CONST_SPELLLEVEL_2), ring, 0.0f);
                     script.SetFirstName(ring, name + " II");
                     Pricing.CalculatePrice(script, ring);
                     return 4000;
                 }
                 else if (maxValue >= 1000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyBonusLevelSpell(bonusType, IP_CONST_SPELLLEVEL_1), ring, 0.0f);
                     script.SetFirstName(ring, name + " I");
                     Pricing.CalculatePrice(script, ring);
                     return 1000;
                 }
                 else if (maxValue >= 500)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyBonusLevelSpell(bonusType, IP_CONST_SPELLLEVEL_0), ring, 0.0f);
                     script.SetFirstName(ring, name + " 0");
                     Pricing.CalculatePrice(script, ring);
                     return 500;
                 }
                 else
                 {
                     return 0;
                 }
             }
         #endregion
         #region Damage Resistance
         case ITEM_PROPERTY_DAMAGE_RESISTANCE:
             {
                 int damageResistType = DamageResistances[Generation.rand.Next(DamageResistances.Count)];
                 if (damageResistType == IP_CONST_DAMAGETYPE_NEGATIVE &&
                     maxValue < 6000)
                 {
                     int attempts = 0;
                     while (damageResistType == IP_CONST_DAMAGETYPE_NEGATIVE)
                     {
                         damageResistType = DamageResistances[Generation.rand.Next(DamageResistances.Count)];
                         attempts++;
                         if (attempts == 10)
                         {
                             // something is wrong. Break out and just go with fire or something.
                             damageResistType = IP_CONST_DAMAGETYPE_FIRE;
                             break;
                         }
                     }
                 }
                 if (damageResistType == IP_CONST_DAMAGETYPE_NEGATIVE)
                 {
                     if (maxValue >= 66000)
                     {
                         script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyDamageResistance(damageResistType, IP_CONST_DAMAGERESIST_30), ring, 0.0f);
                         script.SetFirstName(ring, DamageResistanceNames[damageResistType] + ", 30");
                         Pricing.CalculatePrice(script, ring);
                         return 66000;
                     }
                     else if (maxValue >= 54000)
                     {
                         script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyDamageResistance(damageResistType, IP_CONST_DAMAGERESIST_25), ring, 0.0f);
                         script.SetFirstName(ring, DamageResistanceNames[damageResistType] + ", 25");
                         Pricing.CalculatePrice(script, ring);
                         return 54000;
                     }
                     else if (maxValue >= 42000)
                     {
                         script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyDamageResistance(damageResistType, IP_CONST_DAMAGERESIST_20), ring, 0.0f);
                         script.SetFirstName(ring, DamageResistanceNames[damageResistType] + ", 20");
                         Pricing.CalculatePrice(script, ring);
                         return 42000;
                     }
                     else if (maxValue >= 30000)
                     {
                         script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyDamageResistance(damageResistType, IP_CONST_DAMAGERESIST_15), ring, 0.0f);
                         script.SetFirstName(ring, DamageResistanceNames[damageResistType] + ", 15");
                         Pricing.CalculatePrice(script, ring);
                         return 30000;
                     }
                     else if (maxValue >= 18000)
                     {
                         script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyDamageResistance(damageResistType, IP_CONST_DAMAGERESIST_10), ring, 0.0f);
                         script.SetFirstName(ring, DamageResistanceNames[damageResistType] + ", 10");
                         Pricing.CalculatePrice(script, ring);
                         return 18000;
                     }
                     else if (maxValue >= 6000)
                     {
                         script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyDamageResistance(damageResistType, IP_CONST_DAMAGERESIST_5), ring, 0.0f);
                         script.SetFirstName(ring, DamageResistanceNames[damageResistType] + ", 5");
                         Pricing.CalculatePrice(script, ring);
                         return 6000;
                     }
                 }
                 else
                 {
                     if (maxValue >= 44000)
                     {
                         script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyDamageResistance(damageResistType, IP_CONST_DAMAGERESIST_30), ring, 0.0f);
                         script.SetFirstName(ring, DamageResistanceNames[damageResistType] + ", 30");
                         Pricing.CalculatePrice(script, ring);
                         return 44000;
                     }
                     else if (maxValue >= 36000)
                     {
                         script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyDamageResistance(damageResistType, IP_CONST_DAMAGERESIST_25), ring, 0.0f);
                         script.SetFirstName(ring, DamageResistanceNames[damageResistType] + ", 25");
                         Pricing.CalculatePrice(script, ring);
                         return 36000;
                     }
                     else if (maxValue >= 28000)
                     {
                         script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyDamageResistance(damageResistType, IP_CONST_DAMAGERESIST_20), ring, 0.0f);
                         script.SetFirstName(ring, DamageResistanceNames[damageResistType] + ", 20");
                         Pricing.CalculatePrice(script, ring);
                         return 28000;
                     }
                     else if (maxValue >= 20000)
                     {
                         script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyDamageResistance(damageResistType, IP_CONST_DAMAGERESIST_15), ring, 0.0f);
                         script.SetFirstName(ring, DamageResistanceNames[damageResistType] + ", 15");
                         Pricing.CalculatePrice(script, ring);
                         return 20000;
                     }
                     else if (maxValue >= 12000)
                     {
                         script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyDamageResistance(damageResistType, IP_CONST_DAMAGERESIST_10), ring, 0.0f);
                         script.SetFirstName(ring, DamageResistanceNames[damageResistType] + ", 10");
                         Pricing.CalculatePrice(script, ring);
                         return 12000;
                     }
                     else if (maxValue >= 4000)
                     {
                         script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyDamageResistance(damageResistType, IP_CONST_DAMAGERESIST_5), ring, 0.0f);
                         script.SetFirstName(ring, DamageResistanceNames[damageResistType] + ", 5");
                         Pricing.CalculatePrice(script, ring);
                         return 4000;
                     }
                 }
                 break;
             }
         #endregion
         #region Freedom of Movement
         case ITEM_PROPERTY_FREEDOM_OF_MOVEMENT:
             {
                 script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyFreeAction(), ring, 0.0f);
                 script.SetFirstName(ring, "Ring of Freedom");
                 Pricing.CalculatePrice(script, ring);
                 return 40000;
             }
         #endregion
         #region Immunities
         case ITEM_PROPERTY_IMMUNITY_MISCELLANEOUS:
             {
                 List<int> possibleImmunities = new List<int>();
                 foreach (KeyValuePair<int, int> immunity in AvailableImmunities)
                 {
                     if (immunity.Value <= maxValue)
                     {
                         possibleImmunities.Add(immunity.Key);
                     }
                 }
                 if (possibleImmunities.Count == 0)
                 {
                     return 0;
                 }
                 int selectedImmunity = possibleImmunities[Generation.rand.Next(possibleImmunities.Count)];
                 script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyImmunityMisc(selectedImmunity), ring, 0.0f);
                 script.SetFirstName(ring, ImmunityNames[selectedImmunity]);
                 Pricing.CalculatePrice(script, ring);
                 return AvailableImmunities[selectedImmunity];
             }
         #endregion
         #region Light
         case ITEM_PROPERTY_LIGHT:
             {
                 int lightColor = LightColors[Generation.rand.Next(LightColors.Count)]; ;
                 script.SetFirstName(ring, AbilityNames[selectedAbility]);
                 if (maxValue >= 400)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyLight(IP_CONST_LIGHTBRIGHTNESS_BRIGHT, lightColor), ring, 0.0f);
                     Pricing.CalculatePrice(script, ring);
                     return 400;
                 }
                 else if (maxValue >= 300)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyLight(IP_CONST_LIGHTBRIGHTNESS_NORMAL, lightColor), ring, 0.0f);
                     Pricing.CalculatePrice(script, ring);
                     return 300;
                 }
                 else if (maxValue >= 200)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyLight(IP_CONST_LIGHTBRIGHTNESS_LOW, lightColor), ring, 0.0f);
                     Pricing.CalculatePrice(script, ring);
                     return 200;
                 }
                 else if (maxValue >= 100)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyLight(IP_CONST_LIGHTBRIGHTNESS_DIM, lightColor), ring, 0.0f);
                     Pricing.CalculatePrice(script, ring);
                     return 100;
                 }
                 else
                 {
                     return 0;
                 }
             }
         #endregion
         #region Saving Throws
         case ITEM_PROPERTY_SAVING_THROW_BONUS:
             {
                 if (maxValue >= 25000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyBonusSavingThrowVsX(IP_CONST_SAVEVS_UNIVERSAL, 5), ring, 0.0f);
                     script.SetFirstName(ring, "Ring of Resistance +5");
                     Pricing.CalculatePrice(script, ring);
                     return 25000;
                 }
                 else if (maxValue >= 16000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyBonusSavingThrowVsX(IP_CONST_SAVEVS_UNIVERSAL, 4), ring, 0.0f);
                     script.SetFirstName(ring, "Ring of Resistance +4");
                     Pricing.CalculatePrice(script, ring);
                     return 16000;
                 }
                 else if (maxValue >= 9000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyBonusSavingThrowVsX(IP_CONST_SAVEVS_UNIVERSAL, 3), ring, 0.0f);
                     script.SetFirstName(ring, "Ring of Resistance +3");
                     Pricing.CalculatePrice(script, ring);
                     return 9000;
                 }
                 else if (maxValue >= 4000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyBonusSavingThrowVsX(IP_CONST_SAVEVS_UNIVERSAL, 2), ring, 0.0f);
                     script.SetFirstName(ring, "Ring of Resistance +2");
                     Pricing.CalculatePrice(script, ring);
                     return 4000;
                 }
                 else if (maxValue >= 1000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyBonusSavingThrowVsX(IP_CONST_SAVEVS_UNIVERSAL, 1), ring, 0.0f);
                     script.SetFirstName(ring, "Ring of Resistance +1");
                     Pricing.CalculatePrice(script, ring);
                     return 1000;
                 }
                 else
                 {
                     return 0;
                 }
             }
         #endregion
         #region Saving Throws vs. Specific
         case ITEM_PROPERTY_SAVING_THROW_BONUS_SPECIFIC:
             {
                 int saveType = AvailableSaveTypes[Generation.rand.Next(AvailableSaveTypes.Count)];
                 script.SetFirstName(ring, SaveTypeNames[saveType]);
                 if (maxValue >= 6250)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyBonusSavingThrowVsX(saveType, 5), ring, 0.0f);
                     script.SetFirstName(ring, String.Format("{0} +5", script.GetName(ring)));
                     Pricing.CalculatePrice(script, ring);
                     return 6250;
                 }
                 else if (maxValue >= 4000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyBonusSavingThrowVsX(saveType, 4), ring, 0.0f);
                     script.SetFirstName(ring, String.Format("{0} +4", script.GetName(ring)));
                     Pricing.CalculatePrice(script, ring);
                     return 4000;
                 }
                 else if (maxValue >= 2250)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyBonusSavingThrowVsX(saveType, 3), ring, 0.0f);
                     script.SetFirstName(ring, String.Format("{0} +3", script.GetName(ring)));
                     Pricing.CalculatePrice(script, ring);
                     return 2250;
                 }
                 else if (maxValue >= 1000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyBonusSavingThrowVsX(saveType, 2), ring, 0.0f);
                     script.SetFirstName(ring, String.Format("{0} +2", script.GetName(ring)));
                     Pricing.CalculatePrice(script, ring);
                     return 1000;
                 }
                 else if (maxValue >= 250)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyBonusSavingThrowVsX(saveType, 1), ring, 0.0f);
                     script.SetFirstName(ring, String.Format("{0} +1", script.GetName(ring)));
                     Pricing.CalculatePrice(script, ring);
                     return 250;
                 }
                 break;
             }
         #endregion
         #region Skill Bonus
         case ITEM_PROPERTY_SKILL_BONUS:
             {
                 int skillBonus = AvailableSkills[Generation.rand.Next(AvailableSkills.Count)];
                 script.SetFirstName(ring, SkillNames[skillBonus]);
                 if (maxValue >= 10000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertySkillBonus(skillBonus, 10), ring, 0.0f);
                     script.SetFirstName(ring, script.GetName(ring) + " +10");
                     Pricing.CalculatePrice(script, ring);
                     return 10000;
                 }
                 else if (maxValue >= 8100)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertySkillBonus(skillBonus, 9), ring, 0.0f);
                     script.SetFirstName(ring, script.GetName(ring) + " +9");
                     Pricing.CalculatePrice(script, ring);
                     return 8100;
                 }
                 else if (maxValue >= 6400)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertySkillBonus(skillBonus, 8), ring, 0.0f);
                     script.SetFirstName(ring, script.GetName(ring) + " +8");
                     Pricing.CalculatePrice(script, ring);
                     return 6400;
                 }
                 else if (maxValue >= 4900)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertySkillBonus(skillBonus, 7), ring, 0.0f);
                     script.SetFirstName(ring, script.GetName(ring) + " +7");
                     Pricing.CalculatePrice(script, ring);
                     return 4900;
                 }
                 else if (maxValue >= 3600)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertySkillBonus(skillBonus, 6), ring, 0.0f);
                     script.SetFirstName(ring, script.GetName(ring) + " +6");
                     Pricing.CalculatePrice(script, ring);
                     return 3600;
                 }
                 else if (maxValue >= 2500)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertySkillBonus(skillBonus, 5), ring, 0.0f);
                     script.SetFirstName(ring, script.GetName(ring) + " +5");
                     Pricing.CalculatePrice(script, ring);
                     return 2500;
                 }
                 else if (maxValue >= 1600)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertySkillBonus(skillBonus, 4), ring, 0.0f);
                     script.SetFirstName(ring, script.GetName(ring) + " +4");
                     Pricing.CalculatePrice(script, ring);
                     return 1600;
                 }
                 else if (maxValue >= 900)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertySkillBonus(skillBonus, 3), ring, 0.0f);
                     script.SetFirstName(ring, script.GetName(ring) + " +3");
                     Pricing.CalculatePrice(script, ring);
                     return 900;
                 }
                 else if (maxValue >= 400)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertySkillBonus(skillBonus, 2), ring, 0.0f);
                     script.SetFirstName(ring, script.GetName(ring) + " +2");
                     Pricing.CalculatePrice(script, ring);
                     return 400;
                 }
                 else if (maxValue >= 100)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertySkillBonus(skillBonus, 1), ring, 0.0f);
                     script.SetFirstName(ring, script.GetName(ring) + " +1");
                     Pricing.CalculatePrice(script, ring);
                     return 100;
                 }
                 else
                 {
                     return 0;
                 }
             }
         #endregion
         #region Spell Resistance
         case ITEM_PROPERTY_SPELL_RESISTANCE:
             {
                 if (maxValue >= 140000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyBonusSpellResistance(IP_CONST_SPELLRESISTANCEBONUS_26), ring, 0.0f);
                     script.SetFirstName(ring, "Ring of Spell Resistance, 26");
                     Pricing.CalculatePrice(script, ring);
                     return 140000;
                 }
                 else if (maxValue >= 120000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyBonusSpellResistance(IP_CONST_SPELLRESISTANCEBONUS_24), ring, 0.0f);
                     script.SetFirstName(ring, "Ring of Spell Resistance, 24");
                     Pricing.CalculatePrice(script, ring);
                     return 120000;
                 }
                 else if (maxValue >= 100000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyBonusSpellResistance(IP_CONST_SPELLRESISTANCEBONUS_22), ring, 0.0f);
                     script.SetFirstName(ring, "Ring of Spell Resistance, 22");
                     Pricing.CalculatePrice(script, ring);
                     return 100000;
                 }
                 else if (maxValue >= 80000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyBonusSpellResistance(IP_CONST_SPELLRESISTANCEBONUS_20), ring, 0.0f);
                     script.SetFirstName(ring, "Ring of Spell Resistance, 20");
                     Pricing.CalculatePrice(script, ring);
                     return 80000;
                 }
                 else if (maxValue >= 60000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyBonusSpellResistance(IP_CONST_SPELLRESISTANCEBONUS_18), ring, 0.0f);
                     script.SetFirstName(ring, "Ring of Spell Resistance, 18");
                     Pricing.CalculatePrice(script, ring);
                     return 60000;
                 }
                 else if (maxValue >= 40000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyBonusSpellResistance(IP_CONST_SPELLRESISTANCEBONUS_16), ring, 0.0f);
                     script.SetFirstName(ring, "Ring of Spell Resistance, 16");
                     Pricing.CalculatePrice(script, ring);
                     return 40000;
                 }
                 else if (maxValue >= 20000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyBonusSpellResistance(IP_CONST_SPELLRESISTANCEBONUS_14), ring, 0.0f);
                     script.SetFirstName(ring, "Ring of Spell Resistance, 14");
                     Pricing.CalculatePrice(script, ring);
                     return 20000;
                 }
                 else if (maxValue >= 10000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyBonusSpellResistance(IP_CONST_SPELLRESISTANCEBONUS_12), ring, 0.0f);
                     script.SetFirstName(ring, "Ring of Spell Resistance, 12");
                     Pricing.CalculatePrice(script, ring);
                     return 10000;
                 }
                 else if (maxValue >= 6000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyBonusSpellResistance(IP_CONST_SPELLRESISTANCEBONUS_10), ring, 0.0f);
                     script.SetFirstName(ring, "Ring of Spell Resistance, 10");
                     Pricing.CalculatePrice(script, ring);
                     return 6000;
                 }
                 else
                 {
                     return 0;
                 }
             }
         #endregion
     }
     script.DestroyObject(ring, 0.0f, FALSE);
     return 0;
 }
 public static int NewHelmet(CLRScriptBase script, int maxValue)
 {
     List<int> potentialAbilities = new List<int>();
     foreach (KeyValuePair<int, int> ability in AvailableAbilities)
     {
         if (ability.Value <= maxValue)
         {
             potentialAbilities.Add(ability.Key);
         }
     }
     if (potentialAbilities.Count == 0)
     {
         return 0;
     }
     int selectedAbility = potentialAbilities[Generation.rand.Next(potentialAbilities.Count)];
     uint helmet = script.CreateItemOnObject("zitem_helm2", script.OBJECT_SELF, 1, "", FALSE);
     switch (selectedAbility)
     {
         #region Helmets of Ability Scores
         case ITEM_PROPERTY_ABILITY_BONUS:
             {
                 int abilityScore = AvailableAbilityScores[Generation.rand.Next(AvailableAbilityScores.Count)];
                 string name = AbilityScoreNames[abilityScore];
                 if (maxValue >= 36000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyAbilityBonus(abilityScore, 6), helmet, 0.0f);
                     script.SetFirstName(helmet, name + " +6");
                     Pricing.CalculatePrice(script, helmet);
                     return 36000;
                 }
                 else if (maxValue >= 25000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyAbilityBonus(abilityScore, 5), helmet, 0.0f);
                     script.SetFirstName(helmet, name + " +5");
                     Pricing.CalculatePrice(script, helmet);
                     return 25000;
                 }
                 else if (maxValue >= 16000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyAbilityBonus(abilityScore, 4), helmet, 0.0f);
                     script.SetFirstName(helmet, name + " +4");
                     Pricing.CalculatePrice(script, helmet);
                     return 16000;
                 }
                 else if (maxValue >= 9000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyAbilityBonus(abilityScore, 3), helmet, 0.0f);
                     script.SetFirstName(helmet, name + " +3");
                     Pricing.CalculatePrice(script, helmet);
                     return 9000;
                 }
                 else if (maxValue >= 4000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyAbilityBonus(abilityScore, 2), helmet, 0.0f);
                     script.SetFirstName(helmet, name + " +2");
                     Pricing.CalculatePrice(script, helmet);
                     return 4000;
                 }
                 else if (maxValue >= 1000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyAbilityBonus(abilityScore, 1), helmet, 0.0f);
                     script.SetFirstName(helmet, name + " +1");
                     Pricing.CalculatePrice(script, helmet);
                     return 1000;
                 }
                 else
                 {
                     return 0;
                 }
             }
         #endregion
         #region Helmets with Bonus Feats
         case ITEM_PROPERTY_BONUS_FEAT:
             {
                 List<int> possibleFeats = new List<int>();
                 foreach (KeyValuePair<int, int> feat in AvailableFeats)
                 {
                     if (feat.Value <= maxValue)
                     {
                         possibleFeats.Add(feat.Key);
                     }
                 }
                 if (possibleFeats.Count == 0)
                 {
                     return 0;
                 }
                 int selectedFeat = possibleFeats[Generation.rand.Next(possibleFeats.Count)];
                 script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyBonusFeat(selectedFeat), helmet, 0.0f);
                 script.SetFirstName(helmet, FeatNames[selectedFeat]);
                 Pricing.CalculatePrice(script, helmet);
                 return AvailableFeats[selectedFeat];
             }
         #endregion
         #region Bonus Spell Slots
         case ITEM_PROPERTY_BONUS_SPELL_SLOT_OF_LEVEL_N:
             {
                 int bonusType = AvailableBonusSpells[Generation.rand.Next(AvailableBonusSpells.Count)];
                 string name = BonusSpellNames[bonusType];
                 if (maxValue >= 81000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyBonusLevelSpell(bonusType, IP_CONST_SPELLLEVEL_9), helmet, 0.0f);
                     script.SetFirstName(helmet, name + " IX");
                     Pricing.CalculatePrice(script, helmet);
                     return 81000;
                 }
                 else if (maxValue >= 64000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyBonusLevelSpell(bonusType, IP_CONST_SPELLLEVEL_8), helmet, 0.0f);
                     script.SetFirstName(helmet, name + " VIII");
                     Pricing.CalculatePrice(script, helmet);
                     return 64000;
                 }
                 else if (maxValue >= 49000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyBonusLevelSpell(bonusType, IP_CONST_SPELLLEVEL_7), helmet, 0.0f);
                     script.SetFirstName(helmet, name + " VII");
                     Pricing.CalculatePrice(script, helmet);
                     return 49000;
                 }
                 else if (maxValue >= 36000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyBonusLevelSpell(bonusType, IP_CONST_SPELLLEVEL_6), helmet, 0.0f);
                     script.SetFirstName(helmet, name + " VI");
                     Pricing.CalculatePrice(script, helmet);
                     return 36000;
                 }
                 else if (maxValue >= 25000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyBonusLevelSpell(bonusType, IP_CONST_SPELLLEVEL_5), helmet, 0.0f);
                     script.SetFirstName(helmet, name + " V");
                     Pricing.CalculatePrice(script, helmet);
                     return 25000;
                 }
                 else if (maxValue >= 16000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyBonusLevelSpell(bonusType, IP_CONST_SPELLLEVEL_4), helmet, 0.0f);
                     script.SetFirstName(helmet, name + " IV");
                     Pricing.CalculatePrice(script, helmet);
                     return 16000;
                 }
                 else if (maxValue >= 9000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyBonusLevelSpell(bonusType, IP_CONST_SPELLLEVEL_3), helmet, 0.0f);
                     script.SetFirstName(helmet, name + " III");
                     Pricing.CalculatePrice(script, helmet);
                     return 9000;
                 }
                 else if (maxValue >= 4000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyBonusLevelSpell(bonusType, IP_CONST_SPELLLEVEL_2), helmet, 0.0f);
                     script.SetFirstName(helmet, name + " II");
                     Pricing.CalculatePrice(script, helmet);
                     return 4000;
                 }
                 else if (maxValue >= 1000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyBonusLevelSpell(bonusType, IP_CONST_SPELLLEVEL_1), helmet, 0.0f);
                     script.SetFirstName(helmet, name + " I");
                     Pricing.CalculatePrice(script, helmet);
                     return 1000;
                 }
                 else if (maxValue >= 500)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyBonusLevelSpell(bonusType, IP_CONST_SPELLLEVEL_0), helmet, 0.0f);
                     script.SetFirstName(helmet, name + " 0");
                     Pricing.CalculatePrice(script, helmet);
                     return 500;
                 }
                 else
                 {
                     return 0;
                 }
             }
         #endregion
         #region Immunities
         case ITEM_PROPERTY_IMMUNITY_MISCELLANEOUS:
             {
                 List<int> possibleImmunities = new List<int>();
                 foreach (KeyValuePair<int, int> immunity in AvailableImmunities)
                 {
                     if (immunity.Value <= maxValue)
                     {
                         possibleImmunities.Add(immunity.Key);
                     }
                 }
                 if (possibleImmunities.Count == 0)
                 {
                     return 0;
                 }
                 int selectedImmunity = possibleImmunities[Generation.rand.Next(possibleImmunities.Count)];
                 script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyImmunityMisc(selectedImmunity), helmet, 0.0f);
                 script.SetFirstName(helmet, ImmunityNames[selectedImmunity]);
                 Pricing.CalculatePrice(script, helmet);
                 return AvailableImmunities[selectedImmunity];
             }
         #endregion
         #region Saving Throws vs. Specific
         case ITEM_PROPERTY_SAVING_THROW_BONUS_SPECIFIC:
             {
                 int saveType = AvailableSaveTypes[Generation.rand.Next(AvailableSaveTypes.Count)];
                 script.SetFirstName(helmet, SaveTypeNames[saveType]);
                 if (maxValue >= 6250)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyBonusSavingThrowVsX(saveType, 5), helmet, 0.0f);
                     script.SetFirstName(helmet, String.Format("{0} +5", script.GetName(helmet)));
                     Pricing.CalculatePrice(script, helmet);
                     return 6250;
                 }
                 else if (maxValue >= 4000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyBonusSavingThrowVsX(saveType, 4), helmet, 0.0f);
                     script.SetFirstName(helmet, String.Format("{0} +4", script.GetName(helmet)));
                     Pricing.CalculatePrice(script, helmet);
                     return 4000;
                 }
                 else if (maxValue >= 2250)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyBonusSavingThrowVsX(saveType, 3), helmet, 0.0f);
                     script.SetFirstName(helmet, String.Format("{0} +3", script.GetName(helmet)));
                     Pricing.CalculatePrice(script, helmet);
                     return 2250;
                 }
                 else if (maxValue >= 1000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyBonusSavingThrowVsX(saveType, 2), helmet, 0.0f);
                     script.SetFirstName(helmet, String.Format("{0} +2", script.GetName(helmet)));
                     Pricing.CalculatePrice(script, helmet);
                     return 1000;
                 }
                 else if (maxValue >= 250)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyBonusSavingThrowVsX(saveType, 1), helmet, 0.0f);
                     script.SetFirstName(helmet, String.Format("{0} +1", script.GetName(helmet)));
                     Pricing.CalculatePrice(script, helmet);
                     return 250;
                 }
                 break;
             }
         #endregion
         #region Skill Bonus
         case ITEM_PROPERTY_SKILL_BONUS:
             {
                 int skillBonus = AvailableSkills[Generation.rand.Next(AvailableSkills.Count)];
                 script.SetFirstName(helmet, SkillNames[skillBonus]);
                 if (maxValue >= 10000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertySkillBonus(skillBonus, 10), helmet, 0.0f);
                     script.SetFirstName(helmet, script.GetName(helmet) + " +10");
                     Pricing.CalculatePrice(script, helmet);
                     return 10000;
                 }
                 else if (maxValue >= 8100)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertySkillBonus(skillBonus, 9), helmet, 0.0f);
                     script.SetFirstName(helmet, script.GetName(helmet) + " +9");
                     Pricing.CalculatePrice(script, helmet);
                     return 8100;
                 }
                 else if (maxValue >= 6400)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertySkillBonus(skillBonus, 8), helmet, 0.0f);
                     script.SetFirstName(helmet, script.GetName(helmet) + " +8");
                     Pricing.CalculatePrice(script, helmet);
                     return 6400;
                 }
                 else if (maxValue >= 4900)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertySkillBonus(skillBonus, 7), helmet, 0.0f);
                     script.SetFirstName(helmet, script.GetName(helmet) + " +7");
                     Pricing.CalculatePrice(script, helmet);
                     return 4900;
                 }
                 else if (maxValue >= 3600)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertySkillBonus(skillBonus, 6), helmet, 0.0f);
                     script.SetFirstName(helmet, script.GetName(helmet) + " +6");
                     Pricing.CalculatePrice(script, helmet);
                     return 3600;
                 }
                 else if (maxValue >= 2500)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertySkillBonus(skillBonus, 5), helmet, 0.0f);
                     script.SetFirstName(helmet, script.GetName(helmet) + " +5");
                     Pricing.CalculatePrice(script, helmet);
                     return 2500;
                 }
                 else if (maxValue >= 1600)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertySkillBonus(skillBonus, 4), helmet, 0.0f);
                     script.SetFirstName(helmet, script.GetName(helmet) + " +4");
                     Pricing.CalculatePrice(script, helmet);
                     return 1600;
                 }
                 else if (maxValue >= 900)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertySkillBonus(skillBonus, 3), helmet, 0.0f);
                     script.SetFirstName(helmet, script.GetName(helmet) + " +3");
                     Pricing.CalculatePrice(script, helmet);
                     return 900;
                 }
                 else if (maxValue >= 400)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertySkillBonus(skillBonus, 2), helmet, 0.0f);
                     script.SetFirstName(helmet, script.GetName(helmet) + " +2");
                     Pricing.CalculatePrice(script, helmet);
                     return 400;
                 }
                 else if (maxValue >= 100)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertySkillBonus(skillBonus, 1), helmet, 0.0f);
                     script.SetFirstName(helmet, script.GetName(helmet) + " +1");
                     Pricing.CalculatePrice(script, helmet);
                     return 100;
                 }
                 else
                 {
                     return 0;
                 }
             }
         #endregion
     }
     script.DestroyObject(helmet, 0.0f, FALSE);
     return 0;
 }
 private static void SetPersonalityProperties(CLRScriptBase script, uint armor, Generation.Theme theme, int baseEnhancement, ref double effectivePlusRemaining, ref double currentEffectivePlus)
 {
     switch (theme)
     {
         case Generation.Theme.Acid:
         case Generation.Theme.Cold:
         case Generation.Theme.Fire:
         case Generation.Theme.Electricity:
         case Generation.Theme.Sound:
             {
                 if (effectivePlusRemaining >= (1.0 / 3.0))
                 {
                     int vsElementalAC = 0;
                     if (effectivePlusRemaining >= (4.0 / 3.0))
                     {
                         vsElementalAC = baseEnhancement + 4;
                     }
                     else if (effectivePlusRemaining >= 1.0)
                     {
                         vsElementalAC = baseEnhancement + 3;
                     }
                     else if (effectivePlusRemaining >= (2.0 / 3.0))
                     {
                         vsElementalAC = baseEnhancement + 2;
                     }
                     else
                     {
                         vsElementalAC = baseEnhancement + 1;
                     }
                     if (vsElementalAC > 5) vsElementalAC = 5;
                     if (vsElementalAC > baseEnhancement)
                     {
                         script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyACBonusVsRace(IP_CONST_RACIALTYPE_ELEMENTAL, vsElementalAC), armor, 0.0f);
                         script.SetFirstName(armor, String.Format("{0} of Elementalwarding", script.GetName(armor)));
                         effectivePlusRemaining -= ((double)(vsElementalAC - baseEnhancement)) / 3.0;
                         currentEffectivePlus += ((double)(vsElementalAC - baseEnhancement)) / 3.0;
                         return;
                     }
                 }
                 return;
             }
         case Generation.Theme.ConstructSlaying:
             {
                 if (effectivePlusRemaining >= (1.0 / 3.0))
                 {
                     int vsConstructAC = 0;
                     if (effectivePlusRemaining >= (4.0 / 3.0))
                     {
                         vsConstructAC = baseEnhancement + 4;
                     }
                     else if (effectivePlusRemaining >= 1.0)
                     {
                         vsConstructAC = baseEnhancement + 3;
                     }
                     else if (effectivePlusRemaining >= (2.0 / 3.0))
                     {
                         vsConstructAC = baseEnhancement + 2;
                     }
                     else
                     {
                         vsConstructAC = baseEnhancement + 1;
                     }
                     if (vsConstructAC > 5) vsConstructAC = 5;
                     if (vsConstructAC > baseEnhancement)
                     {
                         script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyACBonusVsRace(IP_CONST_RACIALTYPE_CONSTRUCT, vsConstructAC), armor, 0.0f);
                         script.SetFirstName(armor, String.Format("{0} of Golemwarding", script.GetName(armor)));
                         effectivePlusRemaining -= ((double)(vsConstructAC - baseEnhancement)) / 3.0;
                         currentEffectivePlus += ((double)(vsConstructAC - baseEnhancement)) / 3.0;
                         return;
                     }
                 }
                 return;
             }
         case Generation.Theme.DemonSlaying:
         case Generation.Theme.DevilSlaying:
             {
                 if (effectivePlusRemaining >= (1.0 / 3.0))
                 {
                     int vsOutsiderAC = 0;
                     if (effectivePlusRemaining >= (4.0 / 3.0))
                     {
                         vsOutsiderAC = baseEnhancement + 4;
                     }
                     else if (effectivePlusRemaining >= 1.0)
                     {
                         vsOutsiderAC = baseEnhancement + 3;
                     }
                     else if (effectivePlusRemaining >= (2.0 / 3.0))
                     {
                         vsOutsiderAC = baseEnhancement + 2;
                     }
                     else
                     {
                         vsOutsiderAC = baseEnhancement + 1;
                     }
                     if (vsOutsiderAC > 5) vsOutsiderAC = 5;
                     if (vsOutsiderAC > baseEnhancement)
                     {
                         script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyACBonusVsRace(IP_CONST_RACIALTYPE_OUTSIDER, vsOutsiderAC), armor, 0.0f);
                         script.SetFirstName(armor, String.Format("{0} of Fiendwarding", script.GetName(armor)));
                         effectivePlusRemaining -= ((double)(vsOutsiderAC - baseEnhancement)) / 3.0;
                         currentEffectivePlus += ((double)(vsOutsiderAC - baseEnhancement)) / 3.0;
                         return;
                     }
                 }
                 return;
             }
         case Generation.Theme.DragonSlaying:
             {
                 if (effectivePlusRemaining >= (1.0 / 3.0))
                 {
                     int vsDragonAC = 0;
                     if (effectivePlusRemaining >= (4.0 / 3.0))
                     {
                         vsDragonAC = baseEnhancement + 4;
                     }
                     else if (effectivePlusRemaining >= 1.0)
                     {
                         vsDragonAC = baseEnhancement + 3;
                     }
                     else if (effectivePlusRemaining >= (2.0 / 3.0))
                     {
                         vsDragonAC = baseEnhancement + 2;
                     }
                     else
                     {
                         vsDragonAC = baseEnhancement + 1;
                     }
                     if (vsDragonAC > 5) vsDragonAC = 5;
                     if (vsDragonAC > baseEnhancement)
                     {
                         script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyACBonusVsRace(IP_CONST_RACIALTYPE_DRAGON, vsDragonAC), armor, 0.0f);
                         script.SetFirstName(armor, String.Format("{0} of Dragonwarding", script.GetName(armor)));
                         effectivePlusRemaining -= ((double)(vsDragonAC - baseEnhancement)) / 3.0;
                         currentEffectivePlus += ((double)(vsDragonAC - baseEnhancement)) / 3.0;
                         return;
                     }
                 }
                 return;
             }
         case Generation.Theme.FeySlaying:
             {
                 if (effectivePlusRemaining >= (1.0 / 3.0))
                 {
                     int vsFeyAC = 0;
                     if (effectivePlusRemaining >= (4.0 / 3.0))
                     {
                         vsFeyAC = baseEnhancement + 4;
                     }
                     else if (effectivePlusRemaining >= 1.0)
                     {
                         vsFeyAC = baseEnhancement + 3;
                     }
                     else if (effectivePlusRemaining >= (2.0 / 3.0))
                     {
                         vsFeyAC = baseEnhancement + 2;
                     }
                     else
                     {
                         vsFeyAC = baseEnhancement + 1;
                     }
                     if (vsFeyAC > 5) vsFeyAC = 5;
                     if (vsFeyAC > baseEnhancement)
                     {
                         script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyACBonusVsRace(IP_CONST_RACIALTYPE_FEY, vsFeyAC), armor, 0.0f);
                         script.SetFirstName(armor, String.Format("{0} of Feywarding", script.GetName(armor)));
                         effectivePlusRemaining -= ((double)(vsFeyAC - baseEnhancement)) / 3.0;
                         currentEffectivePlus += ((double)(vsFeyAC - baseEnhancement)) / 3.0;
                         return;
                     }
                 }
                 return;
             }
         case Generation.Theme.GiantSlaying:
             {
                 if (effectivePlusRemaining >= (1.0 / 3.0))
                 {
                     int vsGiantAC = 0;
                     if (effectivePlusRemaining >= (4.0 / 3.0))
                     {
                         vsGiantAC = baseEnhancement + 4;
                     }
                     else if (effectivePlusRemaining >= 1.0)
                     {
                         vsGiantAC = baseEnhancement + 3;
                     }
                     else if (effectivePlusRemaining >= (2.0 / 3.0))
                     {
                         vsGiantAC = baseEnhancement + 2;
                     }
                     else
                     {
                         vsGiantAC = baseEnhancement + 1;
                     }
                     if (vsGiantAC > 5) vsGiantAC = 5;
                     if (vsGiantAC > baseEnhancement)
                     {
                         script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyACBonusVsRace(IP_CONST_RACIALTYPE_GIANT, vsGiantAC), armor, 0.0f);
                         script.SetFirstName(armor, String.Format("{0} of Giantwarding", script.GetName(armor)));
                         effectivePlusRemaining -= ((double)(vsGiantAC - baseEnhancement)) / 3.0;
                         currentEffectivePlus += ((double)(vsGiantAC - baseEnhancement)) / 3.0;
                         return;
                     }
                 }
                 return;
             }
         case Generation.Theme.Holy:
             {
                 if (effectivePlusRemaining >= 0.5)
                 {
                     int vsEvilAC = 0;
                     if (effectivePlusRemaining >= 2.0)
                     {
                         vsEvilAC = baseEnhancement + 4;
                     }
                     else if (effectivePlusRemaining >= 1.5)
                     {
                         vsEvilAC = baseEnhancement + 3;
                     }
                     else if (effectivePlusRemaining >= 1.0)
                     {
                         vsEvilAC = baseEnhancement + 2;
                     }
                     else if (effectivePlusRemaining >= 0.5)
                     {
                         vsEvilAC = baseEnhancement + 1;
                     }
                     if (vsEvilAC > 5) vsEvilAC = 5;
                     if (vsEvilAC > baseEnhancement)
                     {
                         script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyACBonusVsAlign(IP_CONST_ALIGNMENTGROUP_EVIL, vsEvilAC), armor, 0.0f);
                         script.SetFirstName(armor, String.Format("Holy {0}", script.GetName(armor)));
                         effectivePlusRemaining -= ((double)(vsEvilAC - baseEnhancement)) / 2.0;
                         currentEffectivePlus += ((double)(vsEvilAC - baseEnhancement)) / 2.0;
                         return;
                     }
                 }
                 return;
             }
         case Generation.Theme.Themeless:
             {
                 // Not much we can do with no theme. Return a less-than-max-value item
                 return;
             }
         case Generation.Theme.UndeadSlaying:
             {
                 if (effectivePlusRemaining >= (1.0 / 3.0))
                 {
                     int vsUndeadAC = 0;
                     if (effectivePlusRemaining >= (4.0 / 3.0))
                     {
                         vsUndeadAC = baseEnhancement + 4;
                     }
                     else if (effectivePlusRemaining >= 1.0)
                     {
                         vsUndeadAC = baseEnhancement + 3;
                     }
                     else if (effectivePlusRemaining >= (2.0 / 3.0))
                     {
                         vsUndeadAC = baseEnhancement + 2;
                     }
                     else
                     {
                         vsUndeadAC = baseEnhancement + 1;
                     }
                     if (vsUndeadAC > 5) vsUndeadAC = 5;
                     if (vsUndeadAC > baseEnhancement)
                     {
                         script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyACBonusVsRace(IP_CONST_RACIALTYPE_UNDEAD, vsUndeadAC), armor, 0.0f);
                         script.SetFirstName(armor, String.Format("{0} of Undeadwarding", script.GetName(armor)));
                         effectivePlusRemaining -= ((double)(vsUndeadAC - baseEnhancement)) / 3.0;
                         currentEffectivePlus += ((double)(vsUndeadAC - baseEnhancement)) / 3.0;
                         return;
                     }
                 }
                 return;
             }
         case Generation.Theme.Unholy:
             {
                 if (effectivePlusRemaining >= 0.5)
                 {
                     int vsGoodAC = 0;
                     if (effectivePlusRemaining >= 1.6)
                     {
                         vsGoodAC = baseEnhancement + 4;
                     }
                     else if (effectivePlusRemaining >= 1.2)
                     {
                         vsGoodAC = baseEnhancement + 3;
                     }
                     else if (effectivePlusRemaining >= 0.8)
                     {
                         vsGoodAC = baseEnhancement + 2;
                     }
                     else if (effectivePlusRemaining >= 0.4)
                     {
                         vsGoodAC = baseEnhancement + 1;
                     }
                     if (vsGoodAC > 5) vsGoodAC = 5;
                     if (vsGoodAC > baseEnhancement)
                     {
                         script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyACBonusVsAlign(IP_CONST_ALIGNMENTGROUP_GOOD, vsGoodAC), armor, 0.0f);
                         script.SetFirstName(armor, String.Format("Unholy {0}", script.GetName(armor)));
                         effectivePlusRemaining -= ((double)(vsGoodAC - baseEnhancement)) * 2.0 / 5.0;
                         currentEffectivePlus += ((double)(vsGoodAC - baseEnhancement)) * 2.0 / 5.0;
                         return;
                     }
                 }
                 return;
             }
     }
 }
        public static int NewArmor(CLRScriptBase script, int maxValue)
        {
            #region Calculate Armor Type
            List<int> possibleBaseItems = new List<int>();
            foreach (int armorType in ArmorResRefs.Keys)
            {
                if (Pricing.ArmorRulesTypeValues[armorType] <= maxValue)
                {
                    possibleBaseItems.Add(armorType);
                }
            }
            if (possibleBaseItems.Count == 0)
            {
                // Can't afford any armor. What are we doing here?
                return 0;
            }
            int selectedArmorType = possibleBaseItems[Generation.rand.Next(possibleBaseItems.Count)];
            int armorValue = Pricing.ArmorRulesTypeValues[selectedArmorType];
            maxValue -= armorValue;
            uint armor = script.CreateItemOnObject(ArmorResRefs[selectedArmorType], script.OBJECT_SELF, 1, "", FALSE);
            #endregion

            #region Armor Appearance
            Generation.Theme armorTheme = Generation.GetEnchantmentTheme();
            if (script.GetBaseItemType(armor) == BASE_ITEM_ARMOR)
            {
                script.StoreCampaignObject(ACR_Items.ItemChangeDBName, ACR_Items.ModelChangeVarName, armor, script.OBJECT_SELF);
                ArmorSet set = null;
                switch (selectedArmorType)
                {
                    case ARMOR_RULES_TYPE_BANDED:
                        set = ACR_Items.ArmorSetLibrary[ACR_Items.ArmorSetTypes.Banded][Generation.rand.Next(ACR_Items.ArmorSetLibrary[ACR_Items.ArmorSetTypes.Banded].Count)];
                        break;
                    case ARMOR_RULES_TYPE_BREASTPLATE:
                        set = ACR_Items.ArmorSetLibrary[ACR_Items.ArmorSetTypes.Breastplate][Generation.rand.Next(ACR_Items.ArmorSetLibrary[ACR_Items.ArmorSetTypes.Breastplate].Count)];
                        break;
                    case ARMOR_RULES_TYPE_CHAIN_SHIRT:
                        set = ACR_Items.ArmorSetLibrary[ACR_Items.ArmorSetTypes.ChainShirt][Generation.rand.Next(ACR_Items.ArmorSetLibrary[ACR_Items.ArmorSetTypes.ChainShirt].Count)];
                        break;
                    case ARMOR_RULES_TYPE_CHAINMAIL:
                        set = ACR_Items.ArmorSetLibrary[ACR_Items.ArmorSetTypes.Chainmail][Generation.rand.Next(ACR_Items.ArmorSetLibrary[ACR_Items.ArmorSetTypes.Chainmail].Count)];
                        break;
                    case ARMOR_RULES_TYPE_CLOTH:
                        set = ACR_Items.ArmorSetLibrary[ACR_Items.ArmorSetTypes.Cloth][Generation.rand.Next(ACR_Items.ArmorSetLibrary[ACR_Items.ArmorSetTypes.Cloth].Count)];
                        break;
                    case ARMOR_RULES_TYPE_FULL_PLATE:
                        set = ACR_Items.ArmorSetLibrary[ACR_Items.ArmorSetTypes.FullPlate][Generation.rand.Next(ACR_Items.ArmorSetLibrary[ACR_Items.ArmorSetTypes.FullPlate].Count)];
                        break;
                    case ARMOR_RULES_TYPE_HALF_PLATE:
                        set = ACR_Items.ArmorSetLibrary[ACR_Items.ArmorSetTypes.HalfPlate][Generation.rand.Next(ACR_Items.ArmorSetLibrary[ACR_Items.ArmorSetTypes.HalfPlate].Count)];
                        break;
                    case ARMOR_RULES_TYPE_HIDE:
                        set = ACR_Items.ArmorSetLibrary[ACR_Items.ArmorSetTypes.Hide][Generation.rand.Next(ACR_Items.ArmorSetLibrary[ACR_Items.ArmorSetTypes.Hide].Count)];
                        break;
                    case ARMOR_RULES_TYPE_LEATHER:
                        set = ACR_Items.ArmorSetLibrary[ACR_Items.ArmorSetTypes.Leather][Generation.rand.Next(ACR_Items.ArmorSetLibrary[ACR_Items.ArmorSetTypes.Leather].Count)];
                        break;
                    case ARMOR_RULES_TYPE_PADDED:
                        set = ACR_Items.ArmorSetLibrary[ACR_Items.ArmorSetTypes.Padded][Generation.rand.Next(ACR_Items.ArmorSetLibrary[ACR_Items.ArmorSetTypes.Padded].Count)];
                        break;
                    case ARMOR_RULES_TYPE_SCALE:
                        set = ACR_Items.ArmorSetLibrary[ACR_Items.ArmorSetTypes.Scale][Generation.rand.Next(ACR_Items.ArmorSetLibrary[ACR_Items.ArmorSetTypes.Scale].Count)];
                        break;
                    case ARMOR_RULES_TYPE_STUDDED_LEATHER:
                        set = ACR_Items.ArmorSetLibrary[ACR_Items.ArmorSetTypes.StuddedLeather][Generation.rand.Next(ACR_Items.ArmorSetLibrary[ACR_Items.ArmorSetTypes.StuddedLeather].Count)];
                        break;
                }
                if (set != null)
                {
                    ItemModels.TakeArmorStyle(ALFA.Shared.Modules.InfoStore.ModifiedGff[ACR_Items.ModelChangeVarName], set);
                }
                ColorPair color = GeneratedColors.ColorPairs[armorTheme][Generation.rand.Next(GeneratedColors.ColorPairs[armorTheme].Count)];
                ItemColors.SetColorThemes(ALFA.Shared.Modules.InfoStore.ModifiedGff[ACR_Items.ModelChangeVarName], color.Primary, color.Accent);
                script.DestroyObject(armor, 0.0f, TRUE);
                armor = script.RetrieveCampaignObject(ACR_Items.ItemChangeDBName, ACR_Items.ModelChangeVarName, script.GetLocation(script.OBJECT_SELF), script.OBJECT_SELF, script.OBJECT_SELF);
            }
            #endregion

            #region See if We Want This to be Masterwork
            if (maxValue >= 150)
            {
                switch (selectedArmorType)
                {
                    case ARMOR_RULES_TYPE_BANDED:
                        script.SetArmorRulesType(armor, ARMOR_RULES_TYPE_BANDED_MASTERWORK);
                        armorValue += 150;
                        maxValue -= 150;
                        break;
                    case ARMOR_RULES_TYPE_BREASTPLATE:
                        script.SetArmorRulesType(armor, ARMOR_RULES_TYPE_BREASTPLATE_MASTERWORK);
                        armorValue += 150;
                        maxValue -= 150;
                        break;
                    case ARMOR_RULES_TYPE_CHAIN_SHIRT:
                        script.SetArmorRulesType(armor, ARMOR_RULES_TYPE_CHAIN_SHIRT_MASTERWORK);
                        armorValue += 150;
                        maxValue -= 150;
                        break;
                    case ARMOR_RULES_TYPE_CHAINMAIL:
                        script.SetArmorRulesType(armor, ARMOR_RULES_TYPE_CHAINMAIL_MASTERWORK);
                        armorValue += 150;
                        maxValue -= 150;
                        break;
                    case ARMOR_RULES_TYPE_FULL_PLATE:
                        script.SetArmorRulesType(armor, ARMOR_RULES_TYPE_FULL_PLATE_MASTERWORK);
                        armorValue += 150;
                        maxValue -= 150;
                        break;
                    case ARMOR_RULES_TYPE_HALF_PLATE:
                        script.SetArmorRulesType(armor, ARMOR_RULES_TYPE_HALF_PLATE_MASTERWORK);
                        armorValue += 150;
                        maxValue -= 150;
                        break;
                    case ARMOR_RULES_TYPE_HIDE:
                        script.SetArmorRulesType(armor, ARMOR_RULES_TYPE_HIDE_MASTERWORK);
                        armorValue += 150;
                        maxValue -= 150;
                        break;
                    case ARMOR_RULES_TYPE_LEATHER:
                        script.SetArmorRulesType(armor, ARMOR_RULES_TYPE_LEATHER_MASTERWORK);
                        armorValue += 150;
                        maxValue -= 150;
                        break;
                    case ARMOR_RULES_TYPE_PADDED:
                        script.SetArmorRulesType(armor, ARMOR_RULES_TYPE_PADDED_MASTERWORK);
                        armorValue += 150;
                        maxValue -= 150;
                        break;
                    case ARMOR_RULES_TYPE_SCALE:
                        script.SetArmorRulesType(armor, ARMOR_RULES_TYPE_SCALE_MASTERWORK);
                        armorValue += 150;
                        maxValue -= 150;
                        break;
                    case ARMOR_RULES_TYPE_SHIELD_HEAVY:
                        script.SetArmorRulesType(armor, ARMOR_RULES_TYPE_SHIELD_HEAVY_MASTERWORK);
                        armorValue += 150;
                        maxValue -= 150;
                        break;
                    case ARMOR_RULES_TYPE_SHIELD_LIGHT:
                        script.SetArmorRulesType(armor, ARMOR_RULES_TYPE_SHIELD_LIGHT_MASTERWORK);
                        armorValue += 150;
                        maxValue -= 150;
                        break;
                    case ARMOR_RULES_TYPE_SHIELD_TOWER:
                        script.SetArmorRulesType(armor, ARMOR_RULES_TYPE_SHIELD_TOWER_MASTERWORK);
                        armorValue += 150;
                        maxValue -= 150;
                        break;
                    case ARMOR_RULES_TYPE_SPLINT:
                        script.SetArmorRulesType(armor, ARMOR_RULES_TYPE_SPLINT_MASTERWORK);
                        armorValue += 150;
                        maxValue -= 150;
                        break;
                    case ARMOR_RULES_TYPE_STUDDED_LEATHER:
                        script.SetArmorRulesType(armor, ARMOR_RULES_TYPE_STUDDED_LEATHER_MASTERWORK);
                        armorValue += 150;
                        maxValue -= 150;
                        break;
                }
            }
            else
            {
                // We can't even afford masterwork. Carry on.
                return armorValue;
            }
            #endregion

            #region Calculate Effective Plus
            double effectivePlusRemaining = Math.Sqrt((double)(maxValue / 1000)); // we cast after the division because we're going to turn this into an int later.
            double currentEffectivePlus = 0.0;
            #endregion

            #region Set Base Properties
            int enhancementBonus = 0;
            if (effectivePlusRemaining >= 1.0)
            {
                enhancementBonus = 1;
                effectivePlusRemaining -= 1;
                currentEffectivePlus = 1;
                bool quirkAdded = false;
                while (effectivePlusRemaining >= 1)
                {
                    if (Generation.rand.Next(100) > 95)
                    {
                        // The remainder of the enchantment will
                        // be personality heavy.
                        break;
                    }
                    if (!quirkAdded && Generation.rand.Next(100) < 75)
                    {
                        enhancementBonus += 1;
                        effectivePlusRemaining -= 1;
                        currentEffectivePlus += 1;
                    }
                    else
                    {
                        List<EnhancementTypes> quirks = BuildBaseEnchantmentPossibilities(script.GetBaseItemType(armor), effectivePlusRemaining);
                        if (quirks.Count > 0)
                        {
                            EnhancementTypes quirk = quirks[Generation.rand.Next(quirks.Count)];
                            if (selectedArmorType == ARMOR_RULES_TYPE_CLOTH &&
                                quirk == EnhancementTypes.Twilight)
                            {
                                quirk = EnhancementTypes.SpellFocus;
                            }
                            switch (quirk)
                            {
                                case EnhancementTypes.CombatCasting:
                                    script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyBonusFeat(IP_CONST_FEAT_COMBAT_CASTING), armor, 0.0f);
                                    script.SetFirstName(armor, String.Format("Battlemage's {0}", script.GetName(armor)));
                                    effectivePlusRemaining -= 1;
                                    currentEffectivePlus += 1;
                                    break;
                                case EnhancementTypes.DeflectArrows:
                                    script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyBonusFeat(IP_CONST_FEAT_DEFLECT_ARROWS), armor, 0.0f);
                                    script.SetFirstName(armor, String.Format("Arrowcatching {0}", script.GetName(armor)));
                                    effectivePlusRemaining -= 2;
                                    currentEffectivePlus += 2;
                                    break;
                                case EnhancementTypes.Dodge:
                                    script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyBonusFeat(IP_CONST_FEAT_DODGE), armor, 0.0f);
                                    script.SetFirstName(armor, String.Format("Nimble {0}", script.GetName(armor)));
                                    effectivePlusRemaining -= 1;
                                    currentEffectivePlus += 1;
                                    break;
                                case EnhancementTypes.ExtraTurning:
                                    script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyBonusFeat(IP_CONST_FEAT_EXTRA_TURNING), armor, 0.0f);
                                    script.SetFirstName(armor, String.Format("Turning {0}", script.GetName(armor)));
                                    effectivePlusRemaining -= 1;
                                    currentEffectivePlus += 1;
                                    break;
                                case EnhancementTypes.SpellFocus:
                                    int primarySchool = Generation.SpellSchoolFocus[Generation.rand.Next(Generation.SpellSchoolFocus.Count)];
                                    script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyBonusFeat(primarySchool), armor, 0.0f);
                                    script.SetFirstName(armor, String.Format("Mage's {0}", script.GetName(armor)));
                                    effectivePlusRemaining -= 1;
                                    currentEffectivePlus += 1;
                                    if (effectivePlusRemaining >= 0.5)
                                    {
                                        script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyBonusFeat(Generation.SpellFocusLeft[primarySchool]), armor, 0.0f);
                                        effectivePlusRemaining -= 0.5;
                                        currentEffectivePlus += 0.5;
                                    }
                                    if (effectivePlusRemaining >= 0.5)
                                    {
                                        script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyBonusFeat(Generation.SpellFocusRight[primarySchool]), armor, 0.0f);
                                        effectivePlusRemaining -= 0.5;
                                        currentEffectivePlus += 0.5;
                                    }
                                    break;
                                case EnhancementTypes.SpellPenetration:
                                    script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyBonusFeat(IP_CONST_FEAT_SPELLPENETRATION), armor, 0.0f);
                                    script.SetFirstName(armor, String.Format("Mage's {0}", script.GetName(armor)));
                                    effectivePlusRemaining -= 1.5;
                                    currentEffectivePlus += 1.5;
                                    break;
                                case EnhancementTypes.SR12:
                                    script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyBonusSpellResistance(IP_CONST_SPELLRESISTANCEBONUS_12), armor, 0.0f);
                                    script.SetFirstName(armor, String.Format("Spellsoaking {0}", script.GetName(armor)));
                                    effectivePlusRemaining -= 2;
                                    currentEffectivePlus += 2;
                                    break;
                                case EnhancementTypes.SR14:
                                    script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyBonusSpellResistance(IP_CONST_SPELLRESISTANCEBONUS_14), armor, 0.0f);
                                    script.SetFirstName(armor, String.Format("Spellsoaking {0}", script.GetName(armor)));
                                    effectivePlusRemaining -= 3;
                                    currentEffectivePlus += 3;
                                    break;
                                case EnhancementTypes.SR16:
                                    script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyBonusSpellResistance(IP_CONST_SPELLRESISTANCEBONUS_16), armor, 0.0f);
                                    script.SetFirstName(armor, String.Format("Spellsoaking {0}", script.GetName(armor)));
                                    effectivePlusRemaining -= 4;
                                    currentEffectivePlus += 4;
                                    break;
                                case EnhancementTypes.SR18:
                                    script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyBonusSpellResistance(IP_CONST_SPELLRESISTANCEBONUS_18), armor, 0.0f);
                                    script.SetFirstName(armor, String.Format("Spellsoaking {0}", script.GetName(armor)));
                                    effectivePlusRemaining -= 5;
                                    currentEffectivePlus += 5;
                                    break;
                                case EnhancementTypes.Twilight:
                                    script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyArcaneSpellFailure(IP_CONST_ARCANE_SPELL_FAILURE_MINUS_10_PERCENT), armor, 0.0f);
                                    script.SetFirstName(armor, String.Format("Twilight {0}", script.GetName(armor)));
                                    effectivePlusRemaining -= 1;
                                    currentEffectivePlus += 1;
                                    break;
                            }
                        }
                        quirkAdded = true;
                    }
                }
                script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyACBonus(enhancementBonus), armor, 0.0f);
                script.SetFirstName(armor, String.Format("{0} +{1}", script.GetName(armor), enhancementBonus));
            }
            #endregion

            #region Armor Personality
            SetPersonalityProperties(script, armor, armorTheme, enhancementBonus, ref effectivePlusRemaining, ref currentEffectivePlus);
            armorValue += (int)(currentEffectivePlus * currentEffectivePlus * 1000);
            Pricing.CalculatePrice(script, armor);
            return armorValue;
            #endregion
        }
        public static int NewWeapon(CLRScriptBase script, int maxValue)
        {
            int itemType = SelectWeaponType(ref maxValue);
            int weaponValue = Pricing.BaseItemValues[itemType];
            maxValue -= weaponValue;
            generateId++;
            uint weapon = script.CreateItemOnObject(WeaponResrefs[itemType], script.OBJECT_SELF, 1, WeaponResrefs[itemType]+generateId.ToString(), FALSE);

            #region About +1.4 weapons
            if (maxValue > 4220)
            {
                if (Generation.rand.Next(10) > 0)
                {
                    if (Pricing.GetIsAmmunition(itemType))
                    {
                        if (itemType == BASE_ITEM_BULLET)
                        {
                            script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyDamageBonus(IP_CONST_DAMAGETYPE_BLUDGEONING, 1), weapon, 0.0f);
                        }
                        else
                        {
                            script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyDamageBonus(IP_CONST_DAMAGETYPE_PIERCING, 1), weapon, 0.0f);
                        }
                    }
                    else
                    {
                        script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyEnhancementBonus(1), weapon, 0.0f);
                    }
                    switch (Generation.rand.Next(7))
                    {
                        case 0:
                            script.SetFirstName(weapon, "Flametouched " + script.GetName(weapon) + " +1");
                            script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyDamageBonus(IP_CONST_DAMAGETYPE_FIRE, 1), weapon, 0.0f);
                            if (Pricing.GetIsAmmunition(itemType))
                            {
                                weaponValue += 1600;
                            }
                            else
                            {
                                weaponValue += 4220;
                            }
                            break;
                        case 1:
                            script.SetFirstName(weapon, "Frosttouched " + script.GetName(weapon) + " +1");
                            script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyDamageBonus(IP_CONST_DAMAGETYPE_COLD, 1), weapon, 0.0f);
                            if (Pricing.GetIsAmmunition(itemType))
                            {
                                weaponValue += 1600;
                            }
                            else
                            {
                                weaponValue += 4220;
                            }
                            break;
                        case 3:
                            script.SetFirstName(weapon, "Acidtouched " + script.GetName(weapon) + " +1");
                            script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyDamageBonus(IP_CONST_DAMAGETYPE_ACID, 1), weapon, 0.0f);
                            if (Pricing.GetIsAmmunition(itemType))
                            {
                                weaponValue += 1600;
                            }
                            else
                            {
                                weaponValue += 4220;
                            }
                            break;
                        case 4:
                            script.SetFirstName(weapon, "Sparktouched " + script.GetName(weapon) + " +1");
                            script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyDamageBonus(IP_CONST_DAMAGETYPE_ELECTRICAL, 1), weapon, 0.0f);
                            if (Pricing.GetIsAmmunition(itemType))
                            {
                                weaponValue += 1600;
                            }
                            else
                            {
                                weaponValue += 4220;
                            }
                            break;
                        case 5:
                            script.SetFirstName(weapon, "Humming " + script.GetName(weapon) + " +1");
                            script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyDamageBonus(IP_CONST_DAMAGETYPE_SONIC, 1), weapon, 0.0f);
                            if (Pricing.GetIsAmmunition(itemType))
                            {
                                weaponValue += 1600;
                            }
                            else
                            {
                                weaponValue += 4220;
                            }
                            break;
                        case 6:
                            script.SetFirstName(weapon, "Blessed " + script.GetName(weapon) + " +1");
                            script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyDamageBonusVsAlign(IP_CONST_ALIGNMENTGROUP_EVIL, IP_CONST_DAMAGETYPE_MAGICAL, 1), weapon, 0.0f);
                            if (Pricing.GetIsAmmunition(itemType))
                            {
                                weaponValue += 1500;
                            }
                            else
                            {
                                weaponValue += 3945;
                            }
                            break;
                    }
                }
                else
                {
                    script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyEnhancementBonus(1), weapon, 0.0f);
                    script.SetFirstName(weapon, script.GetName(weapon) + " +1");
                    weaponValue += 2300;
                }
            }
            #endregion

            #region Simple Enchantment, +1
            else if (maxValue > 2300)
            {
                if (Generation.rand.Next(10) > 0)
                {
                    script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyEnhancementBonus(1), weapon, 0.0f);
                    script.SetFirstName(weapon, script.GetName(weapon) + " +1");
                    weaponValue += 2300;
                }
                else
                {
                    script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyAttackBonus(1), weapon, 0.0f);
                    script.SetFirstName(weapon, "Masterwork " + script.GetName(weapon));
                    weaponValue += 300;
                }
            }
            #endregion

            #region Simple Bonus Damage, < +1 equiv
            else if (maxValue > 1100)
            {
                if (Generation.rand.Next(10) > 0)
                {
                    script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyAttackBonus(1), weapon, 0.0f);
                    switch (Generation.rand.Next(7))
                    {
                        case 0:
                            script.SetFirstName(weapon, "Flametouched " + script.GetName(weapon));
                            script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyDamageBonus(IP_CONST_DAMAGETYPE_FIRE, 1), weapon, 0.0f);
                            weaponValue += 1100;
                            break;
                        case 1:
                            script.SetFirstName(weapon, "Frosttouched " + script.GetName(weapon));
                            script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyDamageBonus(IP_CONST_DAMAGETYPE_COLD, 1), weapon, 0.0f);
                            weaponValue += 1100;
                            break;
                        case 3:
                            script.SetFirstName(weapon, "Acidtouched " + script.GetName(weapon));
                            script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyDamageBonus(IP_CONST_DAMAGETYPE_ACID, 1), weapon, 0.0f);
                            weaponValue += 1100;
                            break;
                        case 4:
                            script.SetFirstName(weapon, "Sparktouched " + script.GetName(weapon));
                            script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyDamageBonus(IP_CONST_DAMAGETYPE_ELECTRICAL, 1), weapon, 0.0f);
                            weaponValue += 1100;
                            break;
                        case 5:
                            script.SetFirstName(weapon, "Humming " + script.GetName(weapon));
                            script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyDamageBonus(IP_CONST_DAMAGETYPE_SONIC, 1), weapon, 0.0f);
                            weaponValue += 1100;
                            break;
                        case 6:
                            script.SetFirstName(weapon, "Blessed " + script.GetName(weapon));
                            script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyDamageBonusVsAlign(IP_CONST_ALIGNMENTGROUP_EVIL, IP_CONST_DAMAGETYPE_MAGICAL, 1), weapon, 0.0f);
                            weaponValue += 1000;
                            break;
                    }
                }
                else
                {
                    script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyAttackBonus(1), weapon, 0.0f);
                    script.SetFirstName(weapon, "Masterwork " + script.GetName(weapon));
                    weaponValue += 300;
                }

            }
            #endregion

            #region Masterwork Only
            else if (maxValue > 300)
            {
                if (Generation.rand.Next(10) > 0)
                {
                    script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyAttackBonus(1), weapon, 0.0f);
                    script.SetFirstName(weapon, "Masterwork " + script.GetName(weapon));
                    weaponValue += 300;
                }
            }
            #endregion

            if (Pricing.GetIsAmmunition(itemType))
            {
                script.SetItemStackSize(weapon, 50, FALSE);
                weaponValue /= 2;
            }
            Pricing.CalculatePrice(script, weapon);

            return weaponValue;
        }
 public static int NewCloak(CLRScriptBase script, int maxValue)
 {
     List<int> potentialAbilities = new List<int>();
     foreach (KeyValuePair<int, int> ability in AvailableAbilities)
     {
         if (ability.Value <= maxValue)
         {
             potentialAbilities.Add(ability.Key);
         }
     }
     if (potentialAbilities.Count == 0)
     {
         return 0;
     }
     int selectedAbility = potentialAbilities[Generation.rand.Next(potentialAbilities.Count)];
     uint cloak = script.CreateItemOnObject("zitem_cloak", script.OBJECT_SELF, 1, "", FALSE);
     switch (selectedAbility)
     {
         #region Cloaks of Deflection
         case ITEM_PROPERTY_AC_BONUS:
             {
                 string name = AbilityNames[selectedAbility];
                 if (maxValue >= 50000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyACBonus(5), cloak, 0.0f);
                     script.SetFirstName(cloak, name + " +5");
                     Pricing.CalculatePrice(script, cloak);
                     return 50000;
                 }
                 else if (maxValue >= 32000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyACBonus(4), cloak, 0.0f);
                     script.SetFirstName(cloak, name + " +4");
                     Pricing.CalculatePrice(script, cloak);
                     return 32000;
                 }
                 else if (maxValue >= 18000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyACBonus(3), cloak, 0.0f);
                     script.SetFirstName(cloak, name + " +3");
                     Pricing.CalculatePrice(script, cloak);
                     return 18000;
                 }
                 else if (maxValue >= 8000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyACBonus(2), cloak, 0.0f);
                     script.SetFirstName(cloak, name + " +2");
                     Pricing.CalculatePrice(script, cloak);
                     return 8000;
                 }
                 else if (maxValue >= 2000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyACBonus(1), cloak, 0.0f);
                     script.SetFirstName(cloak, name + " +1");
                     Pricing.CalculatePrice(script, cloak);
                     return 2000;
                 }
                 else
                 {
                     return 0;
                 }
             }
         #endregion
         #region Cloaks of Ability Scores
         case ITEM_PROPERTY_ABILITY_BONUS:
             {
                 int abilityScore = AvailableAbilityScores[Generation.rand.Next(AvailableAbilityScores.Count)];
                 string name = AbilityScoreNames[abilityScore];
                 if (maxValue >= 36000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyAbilityBonus(abilityScore, 6), cloak, 0.0f);
                     script.SetFirstName(cloak, name + " +6");
                     Pricing.CalculatePrice(script, cloak);
                     return 36000;
                 }
                 else if (maxValue >= 25000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyAbilityBonus(abilityScore, 5), cloak, 0.0f);
                     script.SetFirstName(cloak, name + " +5");
                     Pricing.CalculatePrice(script, cloak);
                     return 25000;
                 }
                 else if (maxValue >= 16000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyAbilityBonus(abilityScore, 4), cloak, 0.0f);
                     script.SetFirstName(cloak, name + " +4");
                     Pricing.CalculatePrice(script, cloak);
                     return 16000;
                 }
                 else if (maxValue >= 9000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyAbilityBonus(abilityScore, 3), cloak, 0.0f);
                     script.SetFirstName(cloak, name + " +3");
                     Pricing.CalculatePrice(script, cloak);
                     return 9000;
                 }
                 else if (maxValue >= 4000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyAbilityBonus(abilityScore, 2), cloak, 0.0f);
                     script.SetFirstName(cloak, name + " +2");
                     Pricing.CalculatePrice(script, cloak);
                     return 4000;
                 }
                 else if (maxValue >= 1000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyAbilityBonus(abilityScore, 1), cloak, 0.0f);
                     script.SetFirstName(cloak, name + " +1");
                     Pricing.CalculatePrice(script, cloak);
                     return 1000;
                 }
                 else
                 {
                     return 0;
                 }
             }
         #endregion
         #region Damage Resistance
         case ITEM_PROPERTY_DAMAGE_RESISTANCE:
             {
                 int damageResistType = DamageResistances[Generation.rand.Next(DamageResistances.Count)];
                 if (damageResistType == IP_CONST_DAMAGETYPE_NEGATIVE &&
                     maxValue < 6000)
                 {
                     int attempts = 0;
                     while (damageResistType == IP_CONST_DAMAGETYPE_NEGATIVE)
                     {
                         damageResistType = DamageResistances[Generation.rand.Next(DamageResistances.Count)];
                         attempts++;
                         if (attempts == 10)
                         {
                             // something is wrong. Break out and just go with fire or something.
                             damageResistType = IP_CONST_DAMAGETYPE_FIRE;
                             break;
                         }
                     }
                 }
                 if (damageResistType == IP_CONST_DAMAGETYPE_NEGATIVE)
                 {
                     if (maxValue >= 66000)
                     {
                         script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyDamageResistance(damageResistType, IP_CONST_DAMAGERESIST_30), cloak, 0.0f);
                         script.SetFirstName(cloak, DamageResistanceNames[damageResistType] + ", 30");
                         Pricing.CalculatePrice(script, cloak);
                         return 66000;
                     }
                     else if (maxValue >= 54000)
                     {
                         script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyDamageResistance(damageResistType, IP_CONST_DAMAGERESIST_25), cloak, 0.0f);
                         script.SetFirstName(cloak, DamageResistanceNames[damageResistType] + ", 25");
                         Pricing.CalculatePrice(script, cloak);
                         return 54000;
                     }
                     else if (maxValue >= 42000)
                     {
                         script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyDamageResistance(damageResistType, IP_CONST_DAMAGERESIST_20), cloak, 0.0f);
                         script.SetFirstName(cloak, DamageResistanceNames[damageResistType] + ", 20");
                         Pricing.CalculatePrice(script, cloak);
                         return 42000;
                     }
                     else if (maxValue >= 30000)
                     {
                         script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyDamageResistance(damageResistType, IP_CONST_DAMAGERESIST_15), cloak, 0.0f);
                         script.SetFirstName(cloak, DamageResistanceNames[damageResistType] + ", 15");
                         Pricing.CalculatePrice(script, cloak);
                         return 30000;
                     }
                     else if (maxValue >= 18000)
                     {
                         script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyDamageResistance(damageResistType, IP_CONST_DAMAGERESIST_10), cloak, 0.0f);
                         script.SetFirstName(cloak, DamageResistanceNames[damageResistType] + ", 10");
                         Pricing.CalculatePrice(script, cloak);
                         return 18000;
                     }
                     else if (maxValue >= 6000)
                     {
                         script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyDamageResistance(damageResistType, IP_CONST_DAMAGERESIST_5), cloak, 0.0f);
                         script.SetFirstName(cloak, DamageResistanceNames[damageResistType] + ", 5");
                         Pricing.CalculatePrice(script, cloak);
                         return 6000;
                     }
                 }
                 else
                 {
                     if (maxValue >= 44000)
                     {
                         script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyDamageResistance(damageResistType, IP_CONST_DAMAGERESIST_30), cloak, 0.0f);
                         script.SetFirstName(cloak, DamageResistanceNames[damageResistType] + ", 30");
                         Pricing.CalculatePrice(script, cloak);
                         return 44000;
                     }
                     else if (maxValue >= 36000)
                     {
                         script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyDamageResistance(damageResistType, IP_CONST_DAMAGERESIST_25), cloak, 0.0f);
                         script.SetFirstName(cloak, DamageResistanceNames[damageResistType] + ", 25");
                         Pricing.CalculatePrice(script, cloak);
                         return 36000;
                     }
                     else if (maxValue >= 28000)
                     {
                         script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyDamageResistance(damageResistType, IP_CONST_DAMAGERESIST_20), cloak, 0.0f);
                         script.SetFirstName(cloak, DamageResistanceNames[damageResistType] + ", 20");
                         Pricing.CalculatePrice(script, cloak);
                         return 28000;
                     }
                     else if (maxValue >= 20000)
                     {
                         script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyDamageResistance(damageResistType, IP_CONST_DAMAGERESIST_15), cloak, 0.0f);
                         script.SetFirstName(cloak, DamageResistanceNames[damageResistType] + ", 15");
                         Pricing.CalculatePrice(script, cloak);
                         return 20000;
                     }
                     else if (maxValue >= 12000)
                     {
                         script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyDamageResistance(damageResistType, IP_CONST_DAMAGERESIST_10), cloak, 0.0f);
                         script.SetFirstName(cloak, DamageResistanceNames[damageResistType] + ", 10");
                         Pricing.CalculatePrice(script, cloak);
                         return 12000;
                     }
                     else if (maxValue >= 4000)
                     {
                         script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyDamageResistance(damageResistType, IP_CONST_DAMAGERESIST_5), cloak, 0.0f);
                         script.SetFirstName(cloak, DamageResistanceNames[damageResistType] + ", 5");
                         Pricing.CalculatePrice(script, cloak);
                         return 4000;
                     }
                 }
                 break;
             }
         #endregion
         #region Immunities
         case ITEM_PROPERTY_IMMUNITY_MISCELLANEOUS:
             {
                 List<int> possibleImmunities = new List<int>();
                 foreach (KeyValuePair<int, int> immunity in AvailableImmunities)
                 {
                     if (immunity.Value <= maxValue)
                     {
                         possibleImmunities.Add(immunity.Key);
                     }
                 }
                 if (possibleImmunities.Count == 0)
                 {
                     return 0;
                 }
                 int selectedImmunity = possibleImmunities[Generation.rand.Next(possibleImmunities.Count)];
                 script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyImmunityMisc(selectedImmunity), cloak, 0.0f);
                 script.SetFirstName(cloak, ImmunityNames[selectedImmunity]);
                 Pricing.CalculatePrice(script, cloak);
                 return AvailableImmunities[selectedImmunity];
             }
         #endregion
         #region Saving Throws
         case ITEM_PROPERTY_SAVING_THROW_BONUS:
             {
                 if (maxValue >= 25000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyBonusSavingThrowVsX(IP_CONST_SAVEVS_UNIVERSAL, 5), cloak, 0.0f);
                     script.SetFirstName(cloak, "Cloak of Resistance +5");
                     Pricing.CalculatePrice(script, cloak);
                     return 25000;
                 }
                 else if (maxValue >= 16000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyBonusSavingThrowVsX(IP_CONST_SAVEVS_UNIVERSAL, 4), cloak, 0.0f);
                     script.SetFirstName(cloak, "Cloak of Resistance +4");
                     Pricing.CalculatePrice(script, cloak);
                     return 16000;
                 }
                 else if (maxValue >= 9000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyBonusSavingThrowVsX(IP_CONST_SAVEVS_UNIVERSAL, 3), cloak, 0.0f);
                     script.SetFirstName(cloak, "Cloak of Resistance +3");
                     Pricing.CalculatePrice(script, cloak);
                     return 9000;
                 }
                 else if (maxValue >= 4000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyBonusSavingThrowVsX(IP_CONST_SAVEVS_UNIVERSAL, 2), cloak, 0.0f);
                     script.SetFirstName(cloak, "Cloak of Resistance +2");
                     Pricing.CalculatePrice(script, cloak);
                     return 4000;
                 }
                 else if (maxValue >= 1000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyBonusSavingThrowVsX(IP_CONST_SAVEVS_UNIVERSAL, 1), cloak, 0.0f);
                     script.SetFirstName(cloak, "Cloak of Resistance +1");
                     Pricing.CalculatePrice(script, cloak);
                     return 1000;
                 }
                 else
                 {
                     return 0;
                 }
             }
         #endregion
         #region Saving Throws vs. Specific
         case ITEM_PROPERTY_SAVING_THROW_BONUS_SPECIFIC:
             {
                 int saveType = AvailableSaveTypes[Generation.rand.Next(AvailableSaveTypes.Count)];
                 script.SetFirstName(cloak, SaveTypeNames[saveType]);
                 if (maxValue >= 6250)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyBonusSavingThrowVsX(saveType, 5), cloak, 0.0f);
                     script.SetFirstName(cloak, String.Format("{0} +5", script.GetName(cloak)));
                     Pricing.CalculatePrice(script, cloak);
                     return 6250;
                 }
                 else if (maxValue >= 4000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyBonusSavingThrowVsX(saveType, 4), cloak, 0.0f);
                     script.SetFirstName(cloak, String.Format("{0} +4", script.GetName(cloak)));
                     Pricing.CalculatePrice(script, cloak);
                     return 4000;
                 }
                 else if (maxValue >= 2250)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyBonusSavingThrowVsX(saveType, 3), cloak, 0.0f);
                     script.SetFirstName(cloak, String.Format("{0} +3", script.GetName(cloak)));
                     Pricing.CalculatePrice(script, cloak);
                     return 2250;
                 }
                 else if (maxValue >= 1000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyBonusSavingThrowVsX(saveType, 2), cloak, 0.0f);
                     script.SetFirstName(cloak, String.Format("{0} +2", script.GetName(cloak)));
                     Pricing.CalculatePrice(script, cloak);
                     return 1000;
                 }
                 else if (maxValue >= 250)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyBonusSavingThrowVsX(saveType, 1), cloak, 0.0f);
                     script.SetFirstName(cloak, String.Format("{0} +1", script.GetName(cloak)));
                     Pricing.CalculatePrice(script, cloak);
                     return 250;
                 }
                 break;
             }
         #endregion
         #region Skill Bonus
         case ITEM_PROPERTY_SKILL_BONUS:
             {
                 int skillBonus = AvailableSkills[Generation.rand.Next(AvailableSkills.Count)];
                 script.SetFirstName(cloak, SkillNames[skillBonus]);
                 if (maxValue >= 10000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertySkillBonus(skillBonus, 10), cloak, 0.0f);
                     script.SetFirstName(cloak, script.GetName(cloak) + " +10");
                     Pricing.CalculatePrice(script, cloak);
                     return 10000;
                 }
                 else if (maxValue >= 8100)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertySkillBonus(skillBonus, 9), cloak, 0.0f);
                     script.SetFirstName(cloak, script.GetName(cloak) + " +9");
                     Pricing.CalculatePrice(script, cloak);
                     return 8100;
                 }
                 else if (maxValue >= 6400)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertySkillBonus(skillBonus, 8), cloak, 0.0f);
                     script.SetFirstName(cloak, script.GetName(cloak) + " +8");
                     Pricing.CalculatePrice(script, cloak);
                     return 6400;
                 }
                 else if (maxValue >= 4900)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertySkillBonus(skillBonus, 7), cloak, 0.0f);
                     script.SetFirstName(cloak, script.GetName(cloak) + " +7");
                     Pricing.CalculatePrice(script, cloak);
                     return 4900;
                 }
                 else if (maxValue >= 3600)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertySkillBonus(skillBonus, 6), cloak, 0.0f);
                     script.SetFirstName(cloak, script.GetName(cloak) + " +6");
                     Pricing.CalculatePrice(script, cloak);
                     return 3600;
                 }
                 else if (maxValue >= 2500)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertySkillBonus(skillBonus, 5), cloak, 0.0f);
                     script.SetFirstName(cloak, script.GetName(cloak) + " +5");
                     Pricing.CalculatePrice(script, cloak);
                     return 2500;
                 }
                 else if (maxValue >= 1600)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertySkillBonus(skillBonus, 4), cloak, 0.0f);
                     script.SetFirstName(cloak, script.GetName(cloak) + " +4");
                     Pricing.CalculatePrice(script, cloak);
                     return 1600;
                 }
                 else if (maxValue >= 900)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertySkillBonus(skillBonus, 3), cloak, 0.0f);
                     script.SetFirstName(cloak, script.GetName(cloak) + " +3");
                     Pricing.CalculatePrice(script, cloak);
                     return 900;
                 }
                 else if (maxValue >= 400)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertySkillBonus(skillBonus, 2), cloak, 0.0f);
                     script.SetFirstName(cloak, script.GetName(cloak) + " +2");
                     Pricing.CalculatePrice(script, cloak);
                     return 400;
                 }
                 else if (maxValue >= 100)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertySkillBonus(skillBonus, 1), cloak, 0.0f);
                     script.SetFirstName(cloak, script.GetName(cloak) + " +1");
                     Pricing.CalculatePrice(script, cloak);
                     return 100;
                 }
                 else
                 {
                     return 0;
                 }
             }
         #endregion
         #region Spell Resistance
         case ITEM_PROPERTY_SPELL_RESISTANCE:
             {
                 if (maxValue >= 140000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyBonusSpellResistance(IP_CONST_SPELLRESISTANCEBONUS_26), cloak, 0.0f);
                     script.SetFirstName(cloak, "Cloak of Spell Resistance, 26");
                     Pricing.CalculatePrice(script, cloak);
                     return 140000;
                 }
                 else if (maxValue >= 120000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyBonusSpellResistance(IP_CONST_SPELLRESISTANCEBONUS_24), cloak, 0.0f);
                     script.SetFirstName(cloak, "Cloak of Spell Resistance, 24");
                     Pricing.CalculatePrice(script, cloak);
                     return 120000;
                 }
                 else if (maxValue >= 100000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyBonusSpellResistance(IP_CONST_SPELLRESISTANCEBONUS_22), cloak, 0.0f);
                     script.SetFirstName(cloak, "Cloak of Spell Resistance, 22");
                     Pricing.CalculatePrice(script, cloak);
                     return 100000;
                 }
                 else if (maxValue >= 80000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyBonusSpellResistance(IP_CONST_SPELLRESISTANCEBONUS_20), cloak, 0.0f);
                     script.SetFirstName(cloak, "Cloak of Spell Resistance, 20");
                     Pricing.CalculatePrice(script, cloak);
                     return 80000;
                 }
                 else if (maxValue >= 60000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyBonusSpellResistance(IP_CONST_SPELLRESISTANCEBONUS_18), cloak, 0.0f);
                     script.SetFirstName(cloak, "Cloak of Spell Resistance, 18");
                     Pricing.CalculatePrice(script, cloak);
                     return 60000;
                 }
                 else if (maxValue >= 40000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyBonusSpellResistance(IP_CONST_SPELLRESISTANCEBONUS_16), cloak, 0.0f);
                     script.SetFirstName(cloak, "Cloak of Spell Resistance, 16");
                     Pricing.CalculatePrice(script, cloak);
                     return 40000;
                 }
                 else if (maxValue >= 20000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyBonusSpellResistance(IP_CONST_SPELLRESISTANCEBONUS_14), cloak, 0.0f);
                     script.SetFirstName(cloak, "Cloak of Spell Resistance, 14");
                     Pricing.CalculatePrice(script, cloak);
                     return 20000;
                 }
                 else if (maxValue >= 10000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyBonusSpellResistance(IP_CONST_SPELLRESISTANCEBONUS_12), cloak, 0.0f);
                     script.SetFirstName(cloak, "Cloak of Spell Resistance, 12");
                     Pricing.CalculatePrice(script, cloak);
                     return 10000;
                 }
                 else if (maxValue >= 6000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyBonusSpellResistance(IP_CONST_SPELLRESISTANCEBONUS_10), cloak, 0.0f);
                     script.SetFirstName(cloak, "Cloak of Spell Resistance, 10");
                     Pricing.CalculatePrice(script, cloak);
                     return 6000;
                 }
                 else
                 {
                     return 0;
                 }
             }
         #endregion
     }
     script.DestroyObject(cloak, 0.0f, FALSE);
     return 0;
 }
 public static int NewAmulet(CLRScriptBase script, int maxValue)
 {
     List<int> potentialAbilities = new List<int>();
     foreach (KeyValuePair<int, int> ability in PrimaryAmuletAbility)
     {
         if (ability.Value <= maxValue)
         {
             potentialAbilities.Add(ability.Key);
         }
     }
     if (potentialAbilities.Count == 0)
     {
         return 0;
     }
     int selectedAbility = potentialAbilities[Generation.rand.Next(potentialAbilities.Count)];
     uint amulet = script.CreateItemOnObject("nw_it_mneck020", script.OBJECT_SELF, 1, "", FALSE);
     switch (selectedAbility)
     {
         #region Amulets of Natural Armor
         case ITEM_PROPERTY_AC_BONUS:
             {
                 if (maxValue >= 50000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyACBonus(5), amulet, 0.0f);
                     script.SetFirstName(amulet, "Amulet of Natural Armor +5");
                     Pricing.CalculatePrice(script, amulet);
                     return 50000;
                 }
                 else if (maxValue >= 32000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyACBonus(4), amulet, 0.0f);
                     script.SetFirstName(amulet, "Amulet of Natural Armor +4");
                     Pricing.CalculatePrice(script, amulet);
                     return 32000;
                 }
                 else if (maxValue >= 18000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyACBonus(3), amulet, 0.0f);
                     script.SetFirstName(amulet, "Amulet of Natural Armor +3");
                     Pricing.CalculatePrice(script, amulet);
                     return 18000;
                 }
                 else if (maxValue >= 8000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyACBonus(2), amulet, 0.0f);
                     script.SetFirstName(amulet, "Amulet of Natural Armor +2");
                     Pricing.CalculatePrice(script, amulet);
                     return 8000;
                 }
                 else if (maxValue >= 2000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyACBonus(1), amulet, 0.0f);
                     script.SetFirstName(amulet, "Amulet of Natural Armor +1");
                     Pricing.CalculatePrice(script, amulet);
                     return 2000;
                 }
                 else
                 {
                     return 0;
                 }
             }
         #endregion
         #region Amulets of Health and Wisdom
         case ITEM_PROPERTY_ABILITY_BONUS:
             {
                 int abilityScore = IP_CONST_ABILITY_CON;
                 string name = "Amulet of Health";
                 if (script.d2(1) == 1)
                 {
                     abilityScore = IP_CONST_ABILITY_WIS;
                     name = "Amulet of Wisdom";
                 }
                 if (maxValue >= 36000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyAbilityBonus(abilityScore, 6), amulet, 0.0f);
                     script.SetFirstName(amulet, name + " +6");
                     Pricing.CalculatePrice(script, amulet);
                     return 36000;
                 }
                 else if (maxValue >= 25000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyAbilityBonus(abilityScore, 5), amulet, 0.0f);
                     script.SetFirstName(amulet, name + " +5");
                     Pricing.CalculatePrice(script, amulet);
                     return 25000;
                 }
                 else if (maxValue >= 16000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyAbilityBonus(abilityScore, 4), amulet, 0.0f);
                     script.SetFirstName(amulet, name + " +4");
                     Pricing.CalculatePrice(script, amulet);
                     return 16000;
                 }
                 else if (maxValue >= 9000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyAbilityBonus(abilityScore, 3), amulet, 0.0f);
                     script.SetFirstName(amulet, name + " +3");
                     Pricing.CalculatePrice(script, amulet);
                     return 9000;
                 }
                 else if (maxValue >= 4000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyAbilityBonus(abilityScore, 2), amulet, 0.0f);
                     script.SetFirstName(amulet, name + " +2");
                     Pricing.CalculatePrice(script, amulet);
                     return 4000;
                 }
                 else if (maxValue >= 1000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyAbilityBonus(abilityScore, 1), amulet, 0.0f);
                     script.SetFirstName(amulet, name + " +1");
                     Pricing.CalculatePrice(script, amulet);
                     return 1000;
                 }
                 else
                 {
                     return 0;
                 }
             }
         #endregion
         #region Amulets with Bonus Feats
         case ITEM_PROPERTY_BONUS_FEAT:
             {
                 List<int> possibleFeats = new List<int>();
                 foreach (KeyValuePair<int, int> feat in AvailableFeats)
                 {
                     if (feat.Value <= maxValue)
                     {
                         possibleFeats.Add(feat.Key);
                     }
                 }
                 if (possibleFeats.Count == 0)
                 {
                     return 0;
                 }
                 int selectedFeat = possibleFeats[Generation.rand.Next(possibleFeats.Count)];
                 script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyBonusFeat(selectedFeat), amulet, 0.0f);
                 switch (selectedFeat)
                 {
                     case IP_CONST_FEAT_COMBAT_CASTING:
                         script.SetFirstName(amulet, "Amulet of the Battlemage");
                         break;
                     case IP_CONST_FEAT_EXTRA_TURNING:
                         script.SetFirstName(amulet, "Amulet of Turning");
                         break;
                     case IP_CONST_FEAT_DARKVISION:
                         script.SetFirstName(amulet, "Amulet of Darkvision");
                         break;
                 }
                 Pricing.CalculatePrice(script, amulet);
                 return AvailableFeats[selectedFeat];
             }
         #endregion
         #region Damage Resistance
         case ITEM_PROPERTY_DAMAGE_RESISTANCE:
             {
                 int damageResistType = DamageResistances[Generation.rand.Next(DamageResistances.Count)];
                 if (damageResistType == IP_CONST_DAMAGETYPE_NEGATIVE &&
                     maxValue < 6000)
                 {
                     int attempts = 0;
                     while (damageResistType == IP_CONST_DAMAGETYPE_NEGATIVE)
                     {
                         damageResistType = DamageResistances[Generation.rand.Next(DamageResistances.Count)];
                         attempts++;
                         if (attempts == 10)
                         {
                             // something is wrong. Break out and just go with fire or something.
                             damageResistType = IP_CONST_DAMAGETYPE_FIRE;
                             break;
                         }
                     }
                 }
                 if (damageResistType == IP_CONST_DAMAGETYPE_NEGATIVE)
                 {
                     if (maxValue >= 66000)
                     {
                         script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyDamageResistance(damageResistType, IP_CONST_DAMAGERESIST_30), amulet, 0.0f);
                         script.SetFirstName(amulet, DamageResistanceNames[damageResistType] + ", 30");
                         Pricing.CalculatePrice(script, amulet);
                         return 66000;
                     }
                     else if (maxValue >= 54000)
                     {
                         script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyDamageResistance(damageResistType, IP_CONST_DAMAGERESIST_25), amulet, 0.0f);
                         script.SetFirstName(amulet, DamageResistanceNames[damageResistType] + ", 25");
                         Pricing.CalculatePrice(script, amulet);
                         return 54000;
                     }
                     else if (maxValue >= 42000)
                     {
                         script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyDamageResistance(damageResistType, IP_CONST_DAMAGERESIST_20), amulet, 0.0f);
                         script.SetFirstName(amulet, DamageResistanceNames[damageResistType] + ", 20");
                         Pricing.CalculatePrice(script, amulet);
                         return 42000;
                     }
                     else if (maxValue >= 30000)
                     {
                         script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyDamageResistance(damageResistType, IP_CONST_DAMAGERESIST_15), amulet, 0.0f);
                         script.SetFirstName(amulet, DamageResistanceNames[damageResistType] + ", 15");
                         Pricing.CalculatePrice(script, amulet);
                         return 30000;
                     }
                     else if (maxValue >= 18000)
                     {
                         script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyDamageResistance(damageResistType, IP_CONST_DAMAGERESIST_10), amulet, 0.0f);
                         script.SetFirstName(amulet, DamageResistanceNames[damageResistType] + ", 10");
                         Pricing.CalculatePrice(script, amulet);
                         return 18000;
                     }
                     else if (maxValue >= 6000)
                     {
                         script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyDamageResistance(damageResistType, IP_CONST_DAMAGERESIST_5), amulet, 0.0f);
                         script.SetFirstName(amulet, DamageResistanceNames[damageResistType] + ", 5");
                         Pricing.CalculatePrice(script, amulet);
                         return 6000;
                     }
                 }
                 else
                 {
                     if (maxValue >= 44000)
                     {
                         script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyDamageResistance(damageResistType, IP_CONST_DAMAGERESIST_30), amulet, 0.0f);
                         script.SetFirstName(amulet, DamageResistanceNames[damageResistType] + ", 30");
                         Pricing.CalculatePrice(script, amulet);
                         return 44000;
                     }
                     else if (maxValue >= 36000)
                     {
                         script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyDamageResistance(damageResistType, IP_CONST_DAMAGERESIST_25), amulet, 0.0f);
                         script.SetFirstName(amulet, DamageResistanceNames[damageResistType] + ", 25");
                         Pricing.CalculatePrice(script, amulet);
                         return 36000;
                     }
                     else if (maxValue >= 28000)
                     {
                         script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyDamageResistance(damageResistType, IP_CONST_DAMAGERESIST_20), amulet, 0.0f);
                         script.SetFirstName(amulet, DamageResistanceNames[damageResistType] + ", 20");
                         Pricing.CalculatePrice(script, amulet);
                         return 28000;
                     }
                     else if (maxValue >= 20000)
                     {
                         script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyDamageResistance(damageResistType, IP_CONST_DAMAGERESIST_15), amulet, 0.0f);
                         script.SetFirstName(amulet, DamageResistanceNames[damageResistType] + ", 15");
                         Pricing.CalculatePrice(script, amulet);
                         return 20000;
                     }
                     else if (maxValue >= 12000)
                     {
                         script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyDamageResistance(damageResistType, IP_CONST_DAMAGERESIST_10), amulet, 0.0f);
                         script.SetFirstName(amulet, DamageResistanceNames[damageResistType] + ", 10");
                         Pricing.CalculatePrice(script, amulet);
                         return 12000;
                     }
                     else if (maxValue >= 4000)
                     {
                         script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyDamageResistance(damageResistType, IP_CONST_DAMAGERESIST_5), amulet, 0.0f);
                         script.SetFirstName(amulet, DamageResistanceNames[damageResistType] + ", 5");
                         Pricing.CalculatePrice(script, amulet);
                         return 4000;
                     }
                 }
                 break;
             }
         #endregion
         #region Freedom of Movement
         case ITEM_PROPERTY_FREEDOM_OF_MOVEMENT:
             {
                 script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyFreeAction(), amulet, 0.0f);
                 script.SetFirstName(amulet, "Amulet of Freedom");
                 Pricing.CalculatePrice(script, amulet);
                 return 40000;
             }
         #endregion
         #region Immunities
         case ITEM_PROPERTY_IMMUNITY_MISCELLANEOUS:
             {
                 List<int> possibleImmunities = new List<int>();
                 foreach (KeyValuePair<int, int> immunity in AvailableImmunities)
                 {
                     if (immunity.Value <= maxValue)
                     {
                         possibleImmunities.Add(immunity.Key);
                     }
                 }
                 if (possibleImmunities.Count == 0)
                 {
                     return 0;
                 }
                 int selectedImmunity = possibleImmunities[Generation.rand.Next(possibleImmunities.Count)];
                 script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyImmunityMisc(selectedImmunity), amulet, 0.0f);
                 switch (selectedImmunity)
                 {
                     case IP_CONST_IMMUNITYMISC_DEATH_MAGIC:
                         script.SetFirstName(amulet, "Amulet of Lifeshielding");
                         break;
                     case IP_CONST_IMMUNITYMISC_DISEASE:
                         script.SetFirstName(amulet, "Amulet of Good Health");
                         break;
                     case IP_CONST_IMMUNITYMISC_FEAR:
                         script.SetFirstName(amulet, "Amulet of Fearlessness");
                         break;
                     case IP_CONST_IMMUNITYMISC_KNOCKDOWN:
                         script.SetFirstName(amulet, "Amulet of Stability");
                         break;
                     case IP_CONST_IMMUNITYMISC_LEVEL_ABIL_DRAIN:
                         script.SetFirstName(amulet, "Amulet of Undeath's Deflection");
                         break;
                     case IP_CONST_IMMUNITYMISC_PARALYSIS:
                         script.SetFirstName(amulet, "Amulet of Mobility");
                         break;
                     case IP_CONST_IMMUNITYMISC_POISON:
                         script.SetFirstName(amulet, "Amulet of Antivenom");
                         break;
                 }
                 Pricing.CalculatePrice(script, amulet);
                 return AvailableImmunities[selectedImmunity];
             }
         #endregion
         #region Saving Throws
         case ITEM_PROPERTY_SAVING_THROW_BONUS:
             {
                 if (maxValue >= 25000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyBonusSavingThrowVsX(IP_CONST_SAVEVS_UNIVERSAL, 5), amulet, 0.0f);
                     script.SetFirstName(amulet, "Amulet of Resistance +5");
                     Pricing.CalculatePrice(script, amulet);
                     return 25000;
                 }
                 else if (maxValue >= 16000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyBonusSavingThrowVsX(IP_CONST_SAVEVS_UNIVERSAL, 4), amulet, 0.0f);
                     script.SetFirstName(amulet, "Amulet of Resistance +4");
                     Pricing.CalculatePrice(script, amulet);
                     return 16000;
                 }
                 else if (maxValue >= 9000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyBonusSavingThrowVsX(IP_CONST_SAVEVS_UNIVERSAL, 3), amulet, 0.0f);
                     script.SetFirstName(amulet, "Amulet of Resistance +3");
                     Pricing.CalculatePrice(script, amulet);
                     return 9000;
                 }
                 else if (maxValue >= 4000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyBonusSavingThrowVsX(IP_CONST_SAVEVS_UNIVERSAL, 2), amulet, 0.0f);
                     script.SetFirstName(amulet, "Amulet of Resistance +2");
                     Pricing.CalculatePrice(script, amulet);
                     return 4000;
                 }
                 else if (maxValue >= 1000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyBonusSavingThrowVsX(IP_CONST_SAVEVS_UNIVERSAL, 1), amulet, 0.0f);
                     script.SetFirstName(amulet, "Amulet of Resistance +1");
                     Pricing.CalculatePrice(script, amulet);
                     return 1000;
                 }
                 else
                 {
                     return 0;
                 }
             }
         #endregion
         #region Saving Throws vs. Specific
         case ITEM_PROPERTY_SAVING_THROW_BONUS_SPECIFIC:
             {
                 int saveType = AvailableSaveTypes[Generation.rand.Next(AvailableSaveTypes.Count)];
                 script.SetFirstName(amulet, SaveTypeNames[saveType]);
                 if (maxValue >= 6250)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyBonusSavingThrowVsX(saveType, 5), amulet, 0.0f);
                     script.SetFirstName(amulet, String.Format("{0} +5", script.GetName(amulet)));
                     Pricing.CalculatePrice(script, amulet);
                     return 6250;
                 }
                 else if (maxValue >= 4000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyBonusSavingThrowVsX(saveType, 4), amulet, 0.0f);
                     script.SetFirstName(amulet, String.Format("{0} +4", script.GetName(amulet)));
                     Pricing.CalculatePrice(script, amulet);
                     return 4000;
                 }
                 else if (maxValue >= 2250)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyBonusSavingThrowVsX(saveType, 3), amulet, 0.0f);
                     script.SetFirstName(amulet, String.Format("{0} +3", script.GetName(amulet)));
                     Pricing.CalculatePrice(script, amulet);
                     return 2250;
                 }
                 else if (maxValue >= 1000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyBonusSavingThrowVsX(saveType, 2), amulet, 0.0f);
                     script.SetFirstName(amulet, String.Format("{0} +2", script.GetName(amulet)));
                     Pricing.CalculatePrice(script, amulet);
                     return 1000;
                 }
                 else if (maxValue >= 250)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyBonusSavingThrowVsX(saveType, 1), amulet, 0.0f);
                     script.SetFirstName(amulet, String.Format("{0} +1", script.GetName(amulet)));
                     Pricing.CalculatePrice(script, amulet);
                     return 250;
                 }
                 break;
             }
         #endregion
         #region Skill Bonus
         case ITEM_PROPERTY_SKILL_BONUS:
             {
                 int skillBonus = AvailableSkills[Generation.rand.Next(AvailableSkills.Count)];
                 script.SetFirstName(amulet, SkillNames[skillBonus]);
                 if (maxValue >= 10000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertySkillBonus(skillBonus, 10), amulet, 0.0f);
                     script.SetFirstName(amulet, script.GetName(amulet) + " +10");
                     Pricing.CalculatePrice(script, amulet);
                     return 10000;
                 }
                 else if (maxValue >= 8100)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertySkillBonus(skillBonus, 9), amulet, 0.0f);
                     script.SetFirstName(amulet, script.GetName(amulet) + " +9");
                     Pricing.CalculatePrice(script, amulet);
                     return 8100;
                 }
                 else if (maxValue >= 6400)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertySkillBonus(skillBonus, 8), amulet, 0.0f);
                     script.SetFirstName(amulet, script.GetName(amulet) + " +8");
                     Pricing.CalculatePrice(script, amulet);
                     return 6400;
                 }
                 else if (maxValue >= 4900)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertySkillBonus(skillBonus, 7), amulet, 0.0f);
                     script.SetFirstName(amulet, script.GetName(amulet) + " +7");
                     Pricing.CalculatePrice(script, amulet);
                     return 4900;
                 }
                 else if (maxValue >= 3600)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertySkillBonus(skillBonus, 6), amulet, 0.0f);
                     script.SetFirstName(amulet, script.GetName(amulet) + " +6");
                     Pricing.CalculatePrice(script, amulet);
                     return 3600;
                 }
                 else if (maxValue >= 2500)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertySkillBonus(skillBonus, 5), amulet, 0.0f);
                     script.SetFirstName(amulet, script.GetName(amulet) + " +5");
                     Pricing.CalculatePrice(script, amulet);
                     return 2500;
                 }
                 else if (maxValue >= 1600)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertySkillBonus(skillBonus, 4), amulet, 0.0f);
                     script.SetFirstName(amulet, script.GetName(amulet) + " +4");
                     Pricing.CalculatePrice(script, amulet);
                     return 1600;
                 }
                 else if (maxValue >= 900)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertySkillBonus(skillBonus, 3), amulet, 0.0f);
                     script.SetFirstName(amulet, script.GetName(amulet) + " +3");
                     Pricing.CalculatePrice(script, amulet);
                     return 900;
                 }
                 else if (maxValue >= 400)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertySkillBonus(skillBonus, 2), amulet, 0.0f);
                     script.SetFirstName(amulet, script.GetName(amulet) + " +2");
                     Pricing.CalculatePrice(script, amulet);
                     return 400;
                 }
                 else if (maxValue >= 100)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertySkillBonus(skillBonus, 1), amulet, 0.0f);
                     script.SetFirstName(amulet, script.GetName(amulet) + " +1");
                     Pricing.CalculatePrice(script, amulet);
                     return 100;
                 }
                 else
                 {
                     return 0;
                 }
             }
         #endregion
         #region Spell Resistance
         case ITEM_PROPERTY_SPELL_RESISTANCE:
             {
                 if (maxValue >= 140000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyBonusSpellResistance(IP_CONST_SPELLRESISTANCEBONUS_26), amulet, 0.0f);
                     script.SetFirstName(amulet, "Amulet of Spell Resistance, 26");
                     Pricing.CalculatePrice(script, amulet);
                     return 140000;
                 }
                 else if (maxValue >= 120000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyBonusSpellResistance(IP_CONST_SPELLRESISTANCEBONUS_24), amulet, 0.0f);
                     script.SetFirstName(amulet, "Amulet of Spell Resistance, 24");
                     Pricing.CalculatePrice(script, amulet);
                     return 120000;
                 }
                 else if (maxValue >= 100000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyBonusSpellResistance(IP_CONST_SPELLRESISTANCEBONUS_22), amulet, 0.0f);
                     script.SetFirstName(amulet, "Amulet of Spell Resistance, 22");
                     Pricing.CalculatePrice(script, amulet);
                     return 100000;
                 }
                 else if (maxValue >= 80000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyBonusSpellResistance(IP_CONST_SPELLRESISTANCEBONUS_20), amulet, 0.0f);
                     script.SetFirstName(amulet, "Amulet of Spell Resistance, 20");
                     Pricing.CalculatePrice(script, amulet);
                     return 80000;
                 }
                 else if (maxValue >= 60000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyBonusSpellResistance(IP_CONST_SPELLRESISTANCEBONUS_18), amulet, 0.0f);
                     script.SetFirstName(amulet, "Amulet of Spell Resistance, 18");
                     Pricing.CalculatePrice(script, amulet);
                     return 60000;
                 }
                 else if (maxValue >= 40000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyBonusSpellResistance(IP_CONST_SPELLRESISTANCEBONUS_16), amulet, 0.0f);
                     script.SetFirstName(amulet, "Amulet of Spell Resistance, 16");
                     Pricing.CalculatePrice(script, amulet);
                     return 40000;
                 }
                 else if (maxValue >= 20000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyBonusSpellResistance(IP_CONST_SPELLRESISTANCEBONUS_14), amulet, 0.0f);
                     script.SetFirstName(amulet, "Amulet of Spell Resistance, 14");
                     Pricing.CalculatePrice(script, amulet);
                     return 20000;
                 }
                 else if (maxValue >= 10000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyBonusSpellResistance(IP_CONST_SPELLRESISTANCEBONUS_12), amulet, 0.0f);
                     script.SetFirstName(amulet, "Amulet of Spell Resistance, 12");
                     Pricing.CalculatePrice(script, amulet);
                     return 10000;
                 }
                 else if (maxValue >= 6000)
                 {
                     script.AddItemProperty(DURATION_TYPE_PERMANENT, script.ItemPropertyBonusSpellResistance(IP_CONST_SPELLRESISTANCEBONUS_10), amulet, 0.0f);
                     script.SetFirstName(amulet, "Amulet of Spell Resistance, 10");
                     Pricing.CalculatePrice(script, amulet);
                     return 6000;
                 }
                 else
                 {
                     return 0;
                 }
             }
         #endregion
     }
     // Something has gone wrong. Nuke that amulet before it spreads the plague.
     script.DestroyObject(amulet, 0.0f, FALSE);
     return 0;
 }