Пример #1
0
        public static int getRandomNumber(int minInclusive, int maxInclusive, eRandomFormula formula, double favorValue, double favorStrength, double favorModifier = 0)
        {
            int numbersAmount = maxInclusive - minInclusive;

            switch (formula)
            {
            case eRandomFormula.favorSpecificValue:
            {
                favorValue = favorValue + (numbersAmount * favorModifier);
                favorValue = Math.Min(favorValue, maxInclusive);
                favorValue = Math.Max(favorValue, minInclusive);
                return(getRandomNumberWithFavoredValue(minInclusive, maxInclusive, favorValue, favorStrength));
            }

            case eRandomFormula.favorLow:
            {
                favorValue = minInclusive + (numbersAmount * favorModifier);
                favorValue = Math.Min(favorValue, maxInclusive);
                favorValue = Math.Max(favorValue, minInclusive);
                return(getRandomNumberWithFavoredValue(minInclusive, maxInclusive, favorValue, favorStrength));
            }

            case eRandomFormula.favorMid:
            {
                int midValue = (int)Math.Round(((double)(maxInclusive - minInclusive) / 2)) + minInclusive;
                favorValue = midValue + (numbersAmount * favorModifier);
                favorValue = Math.Min(favorValue, maxInclusive);
                favorValue = Math.Max(favorValue, minInclusive);
                return(getRandomNumberWithFavoredValue(minInclusive, maxInclusive, favorValue, favorStrength));
            }

            case eRandomFormula.favorHigh:
            {
                favorValue = maxInclusive - (numbersAmount * favorModifier);
                favorValue = Math.Min(favorValue, maxInclusive);
                favorValue = Math.Max(favorValue, minInclusive);
                return(getRandomNumberWithFavoredValue(minInclusive, maxInclusive, favorValue, favorStrength));
            }

            default:
            case eRandomFormula.equalDistribution:
            {
                return(RandomUtil.Standard.Next(minInclusive, maxInclusive + 1));
            }
            }
        }
Пример #2
0
        public static double getRandomDouble(double minInclusive, double maxInclusive, eRandomFormula formula, double favorStrength, double favorModifier = 0)
        {
            double decimalPlaces = 1000;
            int    minInt        = (int)Math.Round(minInclusive * decimalPlaces);
            int    maxInt        = (int)Math.Round(maxInclusive * decimalPlaces);

            int    randomInt   = getRandomNumber(minInt, maxInt, formula, favorStrength, favorModifier);
            double returnValue = randomInt / decimalPlaces;

            returnValue = Math.Min(returnValue, maxInclusive);
            returnValue = Math.Max(returnValue, minInclusive);

            return(returnValue);
        }
Пример #3
0
 public static double getRandomDouble(double maxInclusive, eRandomFormula formula, double favorStrength, double favorModifier = 0)
 {
     return(getRandomDouble(0, maxInclusive, formula, favorStrength, favorModifier));
 }
Пример #4
0
 public static int getRandomNumber(int minInclusive, int maxInclusive, eRandomFormula formula, double favorStrength, double favorModifier = 0)
 {
     return(getRandomNumber(minInclusive, maxInclusive, formula, 0, favorStrength, favorModifier));
 }
Пример #5
0
 public static int getRandomNumberExclusive(int maxExclusive, eRandomFormula formula, double favorValue, double favorStrength, double favorModifier = 0)
 {
     return(getRandomNumber(0, maxExclusive - 1, formula, favorValue, favorStrength, favorModifier));
 }
Пример #6
0
        public void DistributeDamageBonusEntries(int tier, WeaponProfile weapon, int startEntry, int numberOfEntriesToProcess, int numOfRolls, eRandomFormula distribution)
        {
            for (int i = 0; i < numOfRolls; i++)
            {
                int roll = Utils.getRandomNumber(startEntry, startEntry + numberOfEntriesToProcess - 1, distribution, 2, 0);

                weapon.Tiers[tier].Bonus[roll].Chance++;
            }
        }
Пример #7
0
        public void BuildArmorTier(ArmorProfile armor, Tier tier, ArmorBonus armorBonus, int wieldDifficulty, eRandomFormula distribution)
        {
            int minArmor = armor.MinArmorTier[(int)armorBonus];
            int maxArmor = armor.MaxArmorTier[(int)armorBonus];

            int numberOfEntries = ((maxArmor - minArmor) / 10) + 1;// DetermineNumberOfEntries(minArmor, maxArmor);

            //if (maxArmor <= 30)
            //    numberOfEntries *= 2;

            armor.Tiers[(int)tier].Bonus           = new ChanceEntry[numberOfEntries];
            armor.Tiers[(int)tier].wieldDifficulty = new int[numberOfEntries];

            int numOfRolls = 100000;

            DistributeArmorBonusEntries((int)tier, armor, 0, numberOfEntries, numOfRolls, distribution);

            ArmorBonusDistributionRounding((int)tier, armor, numberOfEntries);

            ProcessArmorBonusEntries(armor, (int)tier, minArmor, maxArmor, wieldDifficulty, 0, numberOfEntries, numOfRolls);

            float totalChance  = 0;
            int   entryCounter = 0;

            for (int i = 0; i < numberOfEntries; i++)
            {
                entryCounter++;
                totalChance += armor.Tiers[(int)tier].Bonus[i].Chance;
                if (DebugLevel > 1)
                {
                    Console.WriteLine($"Entry {entryCounter} Chance: {armor.Tiers[(int)tier].Bonus[i].Chance}% - ArmorBonus += {armor.Tiers[(int)tier].Bonus[i].Value}");
                }
            }

            if (DebugLevel > 1)
            {
                Console.WriteLine($"Total Chance: {totalChance}%");
            }
        }
Пример #8
0
        public void BuildWeaponTier(WeaponProfile weapon, Tier tier, MinDamage minDamageTierA, MaxDamage maxDamageTierA, int wieldDifficultyA, eRandomFormula distributionA, MinDamage minDamageTierB = MinDamage.Invalid, MaxDamage maxDamageTierB = MaxDamage.Invalid, int wieldDifficultyB = -1, eRandomFormula distributionB = eRandomFormula.favorMid, MinDamage minDamageTierC = MinDamage.Invalid, MaxDamage maxDamageTierC = MaxDamage.Invalid, int wieldDifficultyC = -1, eRandomFormula distributionC = eRandomFormula.favorMid)
        {
            int totalNumberOfEntries = 0;
            int numOfRollsDivider    = 1;

            int minDamageA       = minDamageTierA == MinDamage.Zero ? 0 : weapon.DamageTier[(int)minDamageTierA - 1] + 1;
            int maxDamageA       = maxDamageTierA == MaxDamage.Zero ? 0 : weapon.DamageTier[(int)maxDamageTierA - 1];
            int minDamageB       = 0;
            int maxDamageB       = 0;
            int minDamageC       = 0;
            int maxDamageC       = 0;
            int numberOfEntriesA = DetermineNumberOfEntries(minDamageA, maxDamageA);

            int numberOfEntriesB = 0;

            if (minDamageTierB != MinDamage.Invalid && maxDamageTierB != MaxDamage.Invalid)
            {
                minDamageB       = minDamageTierB == MinDamage.Zero ? 0 : weapon.DamageTier[(int)minDamageTierB - 1] + 1;
                maxDamageB       = maxDamageTierB == MaxDamage.Zero ? 0 : weapon.DamageTier[(int)maxDamageTierB - 1];
                numberOfEntriesB = DetermineNumberOfEntries(minDamageB, maxDamageB);
                numOfRollsDivider++;
            }

            int numberOfEntriesC = 0;

            if (minDamageTierC != MinDamage.Invalid && maxDamageTierC != MaxDamage.Invalid)
            {
                minDamageC       = minDamageTierC == MinDamage.Zero ? 0 : weapon.DamageTier[(int)minDamageTierC - 1] + 1;
                maxDamageC       = maxDamageTierC == MaxDamage.Zero ? 0 : weapon.DamageTier[(int)maxDamageTierC - 1];
                numberOfEntriesC = DetermineNumberOfEntries(minDamageC, maxDamageC);
                numOfRollsDivider++;
            }

            totalNumberOfEntries = numberOfEntriesA + numberOfEntriesB + numberOfEntriesC;

            weapon.Tiers[(int)tier].Bonus           = new ChanceEntry[totalNumberOfEntries];
            weapon.Tiers[(int)tier].wieldDifficulty = new int[totalNumberOfEntries];

            int numOfRolls = 100000;

            DistributeDamageBonusEntries((int)tier, weapon, 0, numberOfEntriesA, numOfRolls / numOfRollsDivider, distributionA);
            if (numberOfEntriesB > 0)
            {
                DistributeDamageBonusEntries((int)tier, weapon, numberOfEntriesA, numberOfEntriesB, numOfRolls / numOfRollsDivider, distributionB);
            }
            if (numberOfEntriesC > 0)
            {
                DistributeDamageBonusEntries((int)tier, weapon, numberOfEntriesA + numberOfEntriesB, numberOfEntriesC, numOfRolls / numOfRollsDivider, distributionC);
            }

            DamageBonusDistributionRounding((int)tier, weapon, totalNumberOfEntries);

            ProcessDamageBonusEntries(weapon, (int)tier, minDamageA, maxDamageA, wieldDifficultyA, 0, numberOfEntriesA, numOfRolls);
            if (numberOfEntriesB > 0)
            {
                ProcessDamageBonusEntries(weapon, (int)tier, minDamageB, maxDamageB, wieldDifficultyB, numberOfEntriesA, numberOfEntriesB, numOfRolls);
            }
            if (numberOfEntriesC > 0)
            {
                ProcessDamageBonusEntries(weapon, (int)tier, minDamageC, maxDamageC, wieldDifficultyC, numberOfEntriesA + numberOfEntriesB, numberOfEntriesC, numOfRolls);
            }

            float totalChance  = 0;
            int   entryCounter = 0;

            for (int i = 0; i < totalNumberOfEntries; i++)
            {
                entryCounter++;
                totalChance += weapon.Tiers[(int)tier].Bonus[i].Chance;
                if (DebugLevel > 1)
                {
                    Console.WriteLine($"Entry {entryCounter} Chance: {weapon.Tiers[(int)tier].Bonus[i].Chance}% - Damage += {weapon.Tiers[(int)tier].Bonus[i].Value} WieldDifficulty = {weapon.Tiers[(int)tier].wieldDifficulty[i]}");
                }
            }

            if (DebugLevel > 1)
            {
                Console.WriteLine($"Total Chance: {totalChance}%");
            }

            //if (totalChance != 100.0f)
            //{
            //    if (DebugLevel > 0)
            //        Console.WriteLine($"Retrying due to total chance: {totalChance}%");
            //    BuildTier(weapon, tier, minDamageTierA, maxDamageTierA, wieldDifficultyA, distributionA, minDamageTierB, maxDamageTierB, wieldDifficultyB, distributionB, minDamageTierC, maxDamageTierC, wieldDifficultyC, distributionC);
            //    return;
            //}
            //if (totalChance < 100.0f)
            //{
            //    float difference = 100.0f - totalChance;
            //    weapon.Tiers[(int)tier].damageBonus[0].Chance += difference;
            //    if (DebugLevel > 0)
            //        Console.WriteLine($"Added {difference.ToString("0.000000")}% to Entry 1 to make the total chance 100%.");
            //    totalChance = 0;
            //    for (int i = 0; i < totalNumberOfEntries; i++)
            //    {
            //        totalChance += weapon.Tiers[(int)tier].damageBonus[i].Chance;
            //    }
            //    if (DebugLevel > 1)
            //        Console.WriteLine($"New Total Chance: {totalChance}%");
            //}
        }
Пример #9
0
        public void DistributeVarianceEntries(WeaponProfile weapon, int startEntry, int numberOfEntriesToProcess, int numOfRolls, eRandomFormula distribution)
        {
            for (int i = 0; i < numOfRolls; i++)
            {
                int roll = Utils.getRandomNumber(startEntry, startEntry + numberOfEntriesToProcess - 1, distribution, 2, 0);

                weapon.Variances[roll].Chance++;
            }
        }