예제 #1
0
        public void CalculateAdditionalBagsDueToEnemyRatio()
        {
            var x = (int)(1000 * 1.0f);

            var fakeBountyManager       = A.Fake <IBountyManager>();
            var fakeContributionManager = A.Fake <IContributionManager>();
            var fakeImpactMatrixManager = A.Fake <IImpactMatrixManager>();
            var fakeRewardManager       = A.Fake <RewardManager>();
            var fakeStaticWrapper       = A.Fake <IStaticWrapper>();


            var rm = new RewardManager(
                fakeContributionManager,
                fakeStaticWrapper, new List <RewardPlayerKill>(),
                fakeImpactMatrixManager);

            var config = new WorldConfigs {
                AdditionalBagRatioMinimumLosers = 3, AdditionalBagRatioMinimumWinners = 3
            };

            var bags1 = rm.CalculateAdditionalBagsDueToEnemyRatio(0, 0, config);

            Assert.IsTrue(bags1 == 0);
            var bags2 = rm.CalculateAdditionalBagsDueToEnemyRatio(0, 3, config);

            Assert.IsTrue(bags2 == 0);
            var bags3 = rm.CalculateAdditionalBagsDueToEnemyRatio(3, 3, config);

            Assert.IsTrue(bags3 == 0);
            var bags4 = rm.CalculateAdditionalBagsDueToEnemyRatio(4, 4, config);

            Assert.IsTrue(bags4 == 1);
            var bags5 = rm.CalculateAdditionalBagsDueToEnemyRatio(4, 3, config);

            Assert.IsTrue(bags5 == 0);
            var bags6 = rm.CalculateAdditionalBagsDueToEnemyRatio(4, 10, config);

            Assert.IsTrue(bags6 == 2);
            var bags7 = rm.CalculateAdditionalBagsDueToEnemyRatio(40, 10, config);

            Assert.IsTrue(bags7 == 0);
            var bags8 = rm.CalculateAdditionalBagsDueToEnemyRatio(10, 40, config);

            Assert.IsTrue(bags8 == 3);
        }
예제 #2
0
        /// <summary>
        /// Assign a bagdefinition to a player that is eligible.
        /// </summary>
        /// <param name="numberOfBagsToAward"></param>
        /// <param name="bagDefinitions"></param>
        /// <param name="eligiblePlayers">List of Character and Eligibility values</param>
        /// <param name="bagBonuses"></param>
        /// <param name="randomRollBonuses"></param>
        /// <param name="pairingContributionBonuses"></param>
        /// <param name="configSettings"></param>
        /// <returns></returns>
        public List <LootBagTypeDefinition> AssignLootToPlayers(int numberOfBagsToAward,
                                                                List <LootBagTypeDefinition> bagDefinitions, List <KeyValuePair <uint, int> > eligiblePlayers,
                                                                IList <RVRPlayerBagBonus> bagBonuses, Dictionary <uint, int> randomRollBonuses,
                                                                Dictionary <uint, int> pairingContributionBonuses, WorldConfigs configSettings)
        {
            var characterKeepTrackerList = new List <KeepLockTracker>();

            // Preload the tracker
            foreach (var eligiblePlayer in eligiblePlayers)
            {
                var k = new KeepLockTracker {
                    CharacterId = eligiblePlayer.Key, ZoneContribution = eligiblePlayer.Value
                };
                characterKeepTrackerList.Add(k);
            }

            // Sort the bagDefinitions by rarity descending
            bagDefinitions = bagDefinitions.OrderBy(x => x.BagRarity).ToList();
            bagDefinitions.Reverse();


            Logger.Debug($"=== Pairing Contributions");
            foreach (var bonus in pairingContributionBonuses)
            {
                Logger.Debug($"{bonus.Key}:{bonus.Value}");
            }

            Logger.Debug($"Eligible Player Count = {eligiblePlayers.Count()} for maximum {numberOfBagsToAward} Bags");

            if (eligiblePlayers.Count == 0)
            {
                return(null);
            }

            if (bagDefinitions == null)
            {
                Logger.Warn("BagDefinitions is null");
                return(null);
            }

            Logger.Debug($"Assigning loot. Number of Bags : {bagDefinitions.Count} Number of players : {eligiblePlayers.Count}");

            foreach (var lootBagTypeDefinition in bagDefinitions)
            {
                var comparisonDictionary = new Dictionary <uint, int>();
                foreach (var eligiblePlayer in eligiblePlayers)
                {
                    var klt = characterKeepTrackerList.SingleOrDefault(x => x.CharacterId == eligiblePlayer.Key);
                    var randomForCharacter = 0;
                    if ((randomRollBonuses != null) && (configSettings.AllowRandomContribution == "Y"))
                    {
                        if (randomRollBonuses.ContainsKey(eligiblePlayer.Key))
                        {
                            randomForCharacter = randomRollBonuses[eligiblePlayer.Key];
                            if (klt != null)
                            {
                                klt.RandomBonus = randomForCharacter;
                            }
                        }
                    }

                    var pairingContributionForCharacter = 0;
                    if ((pairingContributionBonuses != null) && (configSettings.AllowPairingContribution == "Y"))
                    {
                        if (pairingContributionBonuses.ContainsKey(eligiblePlayer.Key))
                        {
                            pairingContributionForCharacter = pairingContributionBonuses[eligiblePlayer.Key];
                            if (klt != null)
                            {
                                klt.PairingBonus = pairingContributionForCharacter;
                            }
                        }
                    }


                    var characterId = eligiblePlayer.Key;
                    var bonus       = bagBonuses.SingleOrDefault(x => x.CharacterId == characterId);
                    if ((bonus != null) && (configSettings.AllowBagBonusContribution == "Y"))
                    {
                        switch (lootBagTypeDefinition.BagRarity)
                        {
                        case LootBagRarity.White:
                        {
                            comparisonDictionary.Add(characterId, eligiblePlayer.Value + bonus.WhiteBag + randomForCharacter + pairingContributionForCharacter);
                            if (klt != null)
                            {
                                klt.WhiteBagBonus = bonus.WhiteBag;
                            }
                            break;
                        }

                        case LootBagRarity.Green:
                        {
                            comparisonDictionary.Add(characterId, eligiblePlayer.Value + bonus.GreenBag + randomForCharacter + pairingContributionForCharacter);
                            if (klt != null)
                            {
                                klt.GreenBagBonus = bonus.GreenBag;
                            }
                            break;
                        }

                        case LootBagRarity.Blue:
                        {
                            comparisonDictionary.Add(characterId, eligiblePlayer.Value + bonus.BlueBag + randomForCharacter + pairingContributionForCharacter);
                            if (klt != null)
                            {
                                klt.BlueBagBonus = bonus.BlueBag;
                            }
                            break;
                        }

                        case LootBagRarity.Purple:
                        {
                            comparisonDictionary.Add(characterId, eligiblePlayer.Value + bonus.PurpleBag + randomForCharacter + pairingContributionForCharacter);
                            if (klt != null)
                            {
                                klt.PurpleBagBonus = bonus.PurpleBag;
                            }
                            break;
                        }

                        case LootBagRarity.Gold:
                        {
                            comparisonDictionary.Add(characterId, eligiblePlayer.Value + bonus.GoldBag + randomForCharacter + pairingContributionForCharacter);
                            if (klt != null)
                            {
                                klt.GoldBagBonus = bonus.GoldBag;
                            }
                            break;
                        }
                        }
                    }
                    else
                    {
                        comparisonDictionary.Add(characterId, eligiblePlayer.Value + randomForCharacter + pairingContributionForCharacter);
                    }
                    //Logger.Debug($"===== Loot Assignment Bonuses : Character {characterId}, Base {eligiblePlayer.Value} Random {randomForCharacter} Pairing {pairingContributionForCharacter}");
                }

                // Sort the comparison dictionary
                var comparisonList = comparisonDictionary.OrderBy(x => x.Value).ToList();
                comparisonList.Reverse();

                foreach (var keyValuePair in comparisonList)
                {
                    Logger.Debug($"======= Post modification values for comparison : Character {keyValuePair.Key}, Value {keyValuePair.Value}");
                }

                if (comparisonList.Count > 0)
                {
                    lootBagTypeDefinition.Assignee = comparisonList[0].Key;
                    // remove this assignee from future comparisons.
                    eligiblePlayers.RemoveAll(x => x.Key == comparisonList[0].Key);
                    Logger.Info(
                        $"===== Selected player {lootBagTypeDefinition.Assignee} selected for reward. LootBag Id : {lootBagTypeDefinition.LootBagNumber} ({lootBagTypeDefinition.BagRarity}).");
                }
                else
                {
                    Logger.Info(
                        $"===== No player available for reward assignment. LootBag Id : {lootBagTypeDefinition.LootBagNumber} ({lootBagTypeDefinition.BagRarity}).");
                }
            }

            foreach (var keepLockTracker in characterKeepTrackerList)
            {
                Logger.Debug($"===== Loot Assignment Bonuses (KLT) : {keepLockTracker.ToString()}");
                if (configSettings.DebugLootRolls == "Y")
                {
                    var player = Player._Players.SingleOrDefault(x => x.CharacterId == keepLockTracker.CharacterId);
                    if (player != null)
                    {
                        player.SendClientMessage($"{player.Name} Loot Rolls: {keepLockTracker.ToString()}");
                    }
                }
            }

            return(bagDefinitions);
        }