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); }
/// <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); }