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; }