public async Task <List <Item> > GenerateLoot(string itemType) { var items = await _itemDao.FindItemsFiltered(itemType); var itemLooted = new List <Item>(); var randomizer = new Random(); var commonItems = items.FindAll(i => i.Rarity == Item.Common); var rareItems = items.FindAll(i => i.Rarity == Item.Rare); var epicItems = items.FindAll(i => i.Rarity == Item.Epic); var legendaryItems = items.FindAll(i => i.Rarity == Item.Legendary); var maxItemToLoot = 0; switch (itemType) { case Item.Mystery: maxItemToLoot = 1; break; case Item.LootBox: maxItemToLoot = Item.MaxLoot; break; default: maxItemToLoot = Item.MaxLoot; break; } while (itemLooted.Count < maxItemToLoot) { var lootDropChanceFactor = randomizer.NextDouble() * 100; switch (lootDropChanceFactor) { case double dropFactor when dropFactor > 0 && dropFactor <= Item.CommonDropChance && commonItems.Count > 0: itemLooted.Add(commonItems[randomizer.Next(commonItems.Count)]); break; case double dropFactor when dropFactor > Item.RareDropChanceMin && dropFactor <= Item.RareDropChanceMax && rareItems.Count > 0: itemLooted.Add(rareItems[randomizer.Next(rareItems.Count)]); break; case double dropFactor when dropFactor > Item.EpicDropChanceMin && dropFactor <= Item.EpicDropChanceMax && epicItems.Count > 0: itemLooted.Add(epicItems[randomizer.Next(epicItems.Count)]); break; case double dropFactor when dropFactor > Item.LegendaryDropChanceMin && dropFactor <= Item.LegendaryDropChanceMax && legendaryItems.Count > 0: itemLooted.Add(legendaryItems[randomizer.Next(legendaryItems.Count)]); break; } } return(itemLooted); }
public async Task AssertThatGenerateLootCallsFindItemsFilteredGenerateValidLootByItemType(string itemType) { _itemDao.FindItemsFiltered(itemType).Returns(_items.FindAll(i => i.Type != itemType)); var items = await _itemManager.GenerateLoot(itemType); switch (itemType) { case Item.Mystery: Assert.IsTrue(items.Count == 1); break; case Item.LootBox: Assert.IsTrue(items.Count == Item.MaxLoot); break; } Assert.IsTrue(items.All(i => i.Type != itemType)); }
public void AssertThatFindItemsFilteredIsCalled(string itemType) { _itemDao.FindItemsFiltered(itemType); _filterExpression = new ExpressionFilterDefinition <Item>(item => item.Type != itemType); _collectionItem.Received().Find(_filterExpression); }