using System.Collections.Generic;
public int Min { get; set; }
public int Max { get; set; }
public StatRange(int min, int max)
public int Value { get; set; }
public ItemStat(int value)
public override string ToString()
public string Name { get; set; }
public Rarity Rarity { get; set; }
public ItemSlot Slot { get; set; }
public List<ItemStat> Stats { get; set; }
public int IlvlAverage { get; set; }
public Item(string name, Rarity rarity, ItemSlot slot, List<ItemStat> stats, int ilvlAverage)
IlvlAverage = ilvlAverage;
public override string ToString()
string statsStr = string.Join(", ", Stats);
return $"Name: {Name}, Rarity: {Rarity}, Slot: {Slot}, Stats: [{statsStr}], ilvl Average: {IlvlAverage}";
private static readonly Dictionary<Rarity, StatRange> rarityStatRanges = new Dictionary<Rarity, StatRange>
{ Rarity.Common, new StatRange(1, 600) },
{ Rarity.Rare, new StatRange(601, 800) },
{ Rarity.Epic, new StatRange(801, 999) },
{ Rarity.Godly, new StatRange(1000, 1000) }
private static readonly int NumberOfStats = 6;
public Rarity GenerateRandomRarity()
double roll = _random.NextDouble();
else if (roll < commonProb + rareProb)
else if (roll < commonProb + rareProb + epicProb)
public Item CreateItem(Rarity rarity, ItemSlot slot)
var statRange = rarityStatRanges[rarity];
List<ItemStat> stats = new List<ItemStat>();
for (int i = 0; i < NumberOfStats; i++)
int statValue = GenerateStatValue(statRange);
stats.Add(new ItemStat(statValue));
int ilvlAverage = total / NumberOfStats;
string itemName = GenerateItemName(rarity, slot);
return new Item(itemName, rarity, slot, stats, ilvlAverage);
private int GenerateStatValue(StatRange range)
if (range.Min == range.Max)
return _random.Next(range.Min, range.Max + 1);
private string GenerateItemName(Rarity rarity, ItemSlot slot)
return $"{rarity} {slot} Item";
public List<Item> OpenChest()
List<Item> chestItems = new List<Item>();
foreach (ItemSlot slot in Enum.GetValues(typeof(ItemSlot)))
Rarity rarity = GenerateRandomRarity();
Item item = CreateItem(rarity, slot);
public Dictionary<ItemSlot, Item> EquippedItems { get; set; }
EquippedItems = new Dictionary<ItemSlot, Item>();
foreach (ItemSlot slot in Enum.GetValues(typeof(ItemSlot)))
EquippedItems[slot] = null;
public void EquipItems(List<Item> items)
foreach (var item in items)
public void EquipItem(Item newItem)
if (newItem.Slot == ItemSlot.Ring1 || newItem.Slot == ItemSlot.Ring2)
private void EquipSlot(Item newItem)
if (EquippedItems[newItem.Slot] == null)
EquippedItems[newItem.Slot] = newItem;
Console.WriteLine($"Equipped {newItem.Name} to {newItem.Slot} (ilvl: {newItem.IlvlAverage})");
if (newItem.IlvlAverage > EquippedItems[newItem.Slot].IlvlAverage)
Console.WriteLine($"Replaced {EquippedItems[newItem.Slot].Name} with {newItem.Name} in {newItem.Slot}");
EquippedItems[newItem.Slot] = newItem;
Console.WriteLine($"Kept existing {EquippedItems[newItem.Slot].Name} in {newItem.Slot} over {newItem.Name}");
private void EquipRing(Item newRing)
var ring1 = EquippedItems[ItemSlot.Ring1];
var ring2 = EquippedItems[ItemSlot.Ring2];
EquippedItems[ItemSlot.Ring1] = newRing;
Console.WriteLine($"Equipped {newRing.Name} to Ring1 (ilvl: {newRing.IlvlAverage})");
EquippedItems[ItemSlot.Ring2] = newRing;
Console.WriteLine($"Equipped {newRing.Name} to Ring2 (ilvl: {newRing.IlvlAverage})");
if (newRing.IlvlAverage > ring1.IlvlAverage && newRing.IlvlAverage > ring2.IlvlAverage)
if (ring1.IlvlAverage <= ring2.IlvlAverage)
Console.WriteLine($"Replaced {ring1.Name} with {newRing.Name} in Ring1");
EquippedItems[ItemSlot.Ring1] = newRing;
Console.WriteLine($"Replaced {ring2.Name} with {newRing.Name} in Ring2");
EquippedItems[ItemSlot.Ring2] = newRing;
else if (newRing.IlvlAverage > ring1.IlvlAverage)
Console.WriteLine($"Replaced {ring1.Name} with {newRing.Name} in Ring1");
EquippedItems[ItemSlot.Ring1] = newRing;
else if (newRing.IlvlAverage > ring2.IlvlAverage)
Console.WriteLine($"Replaced {ring2.Name} with {newRing.Name} in Ring2");
EquippedItems[ItemSlot.Ring2] = newRing;
Console.WriteLine($"Kept existing rings over {newRing.Name}");
public void DisplayEquippedItems()
foreach (var slot in EquippedItems)
Console.WriteLine($"{slot.Key}: {slot.Value.Name} (Rarity: {slot.Value.Rarity}, ilvl: {slot.Value.IlvlAverage})");
Console.WriteLine($"{slot.Key}: None");
public double GetOverallIlvlAverage()
var equippedItems = EquippedItems.Values.Where(item => item != null);
if (!equippedItems.Any())
return equippedItems.Average(item => item.IlvlAverage);
public bool HasFullGodlySet()
foreach (ItemSlot slot in Enum.GetValues(typeof(ItemSlot)))
if (EquippedItems[slot] == null || EquippedItems[slot].Rarity != Rarity.Godly)
public static void Main()
ItemFactory factory = new ItemFactory();
Inventory playerInventory = new Inventory();
bool fullGodlySetObtained = false;
for (int i = 1; i <= numberOfChests; i++)
Console.WriteLine($"Opening Chest {i}...");
List<Item> chestItems = factory.OpenChest();
foreach (var item in chestItems)
Console.WriteLine($" - {item}");
Console.WriteLine("Equipping items from the chest...");
playerInventory.EquipItems(chestItems);
if (playerInventory.HasFullGodlySet())
Console.WriteLine("Congratulations! You have equipped a full set of Godly items!");
fullGodlySetObtained = true;
Console.WriteLine("-----------------------------");
if (!fullGodlySetObtained)
Console.WriteLine("You did not obtain a full set of Godly items after opening all chests.");
Console.WriteLine("\nFinal Equipped Items:");
playerInventory.DisplayEquippedItems();
double overallIlvl = playerInventory.GetOverallIlvlAverage();
Console.WriteLine($"\nOverall Average Item Level: {overallIlvl:F2}");