using System.Collections.Generic;
public static void Main()
double smithingSkill = 100,
bool hasSmithingPerk = true,
int chestArmorRating = 0,
gauntletsArmorRating = 0,
ArmorCalculator armorCalculator =
new ArmorCalculator(smithingSkill, smithingEnchant, smithingPotion,
armorSkill, skillEffect, armorEffect, armorPerk,
hasSmithingPerk, hasUnisonPerk, hasMatchPerk);
List<int> armorRatings = new List<int>();
if (chestArmorRating > 0)
armorRatings.Add(chestArmorRating);
if (bootsArmorRating > 0)
armorRatings.Add(bootsArmorRating);
if (gauntletsArmorRating > 0)
armorRatings.Add(gauntletsArmorRating);
if (helmetArmorRating > 0)
armorRatings.Add(helmetArmorRating);
if (shieldArmorRating > 0)
armorRatings.Add(shieldArmorRating);
armorCalculator.RunCalculations(armorRatings, shieldArmorRating > 0);
public class ArmorCalculator
private double smithingSkill { get; set; }
private double smithingEnchant { get; set; }
private double smithingPotion { get; set; }
private double armorSkill { get; set; }
private double skillEffect { get; set; }
private double armorEffect { get; set; }
private double armorPerk { get; set; }
private bool hasSmithingPerk { get; set; }
private bool hasUnisonPerk { get; set; }
private bool hasMatchPerk { get; set; }
public ArmorCalculator(double smithingSkill, double smithingEnchant, double smithingPotion,
double armorSkill, double skillEffect, double armorEffect, double armorPerk,
bool hasSmithingPerk, bool hasUnisonPerk, bool hasMatchPerk)
this.smithingSkill = smithingSkill;
this.smithingEnchant = smithingEnchant;
this.smithingPotion = smithingPotion;
this.armorSkill = armorSkill;
this.skillEffect = skillEffect;
this.armorEffect = armorEffect;
this.armorPerk = armorPerk;
this.hasSmithingPerk = hasSmithingPerk;
this.hasUnisonPerk = hasUnisonPerk;
this.hasMatchPerk = hasMatchPerk;
public void RunCalculations(List<int> armorRatings, bool shieldIncluded)
double displayedArmorRating = 0;
double smithingQuality = GetSmithingQuality();
for (int i = 0; i < armorRatings.Count; i++)
double baseArmorRating = armorRatings[i];
double itemQuality = i > 0 ? Math.Ceiling(smithingQuality/2) : Math.Ceiling(smithingQuality);
(baseArmorRating + itemQuality) * (1 + 0.4 * (armorSkill + skillEffect)/100)
* (1 + (hasUnisonPerk ? .25 : 0))
* (1 + (hasMatchPerk ? .25 : 0));
if (i < armorRatings.Count - 1 || !shieldIncluded)
armorRating *= (1 + armorPerk);
displayedArmorRating += armorRating;
displayedArmorRating += armorEffect;
double damageReduction = displayedArmorRating * 0.12 + 3 * armorRatings.Count;
Console.WriteLine("Armor Rating:\t\t" + Math.Round(displayedArmorRating, 2));
Console.WriteLine("Damage Reduction:\t" + Math.Round(damageReduction, 2) + "%");
if (damageReduction > 80)
Console.Write("NOT CAPPED");
private double GetSmithingQuality()
if (smithingSkill < 14) { return 0; }
* (1 + (hasSmithingPerk ? 1 : 0))
double qualityLevel = Math.Floor((effectiveSkill + 38) * 3 / 103);
return 3.6 * qualityLevel - 1.6;