Exemple #1
0
        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);
        }
Exemple #2
0
        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));
        }
Exemple #3
0
 public void AssertThatFindItemsFilteredIsCalled(string itemType)
 {
     _itemDao.FindItemsFiltered(itemType);
     _filterExpression = new ExpressionFilterDefinition <Item>(item => item.Type != itemType);
     _collectionItem.Received().Find(_filterExpression);
 }