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