From a8702c9cdf3ee8c90af9d1f74d7e5bbea0a26e40 Mon Sep 17 00:00:00 2001 From: Chomp Date: Wed, 6 Aug 2025 21:17:12 +0100 Subject: [PATCH] Improved logic inside `GenerateBotLevel` --- .../Generators/BotLevelGenerator.cs | 30 +++++++++---------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/Libraries/SPTarkov.Server.Core/Generators/BotLevelGenerator.cs b/Libraries/SPTarkov.Server.Core/Generators/BotLevelGenerator.cs index db425262..b6dbd54e 100644 --- a/Libraries/SPTarkov.Server.Core/Generators/BotLevelGenerator.cs +++ b/Libraries/SPTarkov.Server.Core/Generators/BotLevelGenerator.cs @@ -1,4 +1,3 @@ -using System.Globalization; using SPTarkov.DI.Annotations; using SPTarkov.Server.Core.Models.Common; using SPTarkov.Server.Core.Models.Eft.Bot; @@ -30,26 +29,25 @@ public class BotLevelGenerator(ISptLogger logger, RandomUtil var expTable = databaseService.GetGlobals().Configuration.Exp.Level.ExperienceTable; var botLevelRange = GetRelativePmcBotLevelRange(botGenerationDetails, levelDetails, expTable.Length); - // Get random level based on the exp table. - var exp = 0; - var level = int.Parse(ChooseBotLevel(botLevelRange.Min, botLevelRange.Max, 1, 1.15).ToString(CultureInfo.InvariantCulture)); // TODO - nasty double to string to int conversion - for (var i = 0; i < level; i++) - { - exp += expTable[i].Experience; - } + // ChooseBotLevel now returns int directly + var level = ChooseBotLevel(botLevelRange.Min, botLevelRange.Max, 1, 1.15); + var maxLevelIndex = expTable.Length - 1; - // Sprinkle in some random exp within the level, unless we are at max level. - if (level < expTable.Length - 1) - { - exp += randomUtil.GetInt(0, expTable[level].Experience - 1); - } + // Clamp chosen level to max + level = Math.Clamp(level, 0, maxLevelIndex + 1); - return new RandomisedBotLevelResult { Level = level, Exp = exp }; + // Sum up total exp required for all full levels before desired + var baseExp = expTable.Take(level).Sum(entry => entry.Experience); + + // Sprinkle in some random exp within the level, unless we are at max level + var fractionalExp = level < maxLevelIndex ? randomUtil.GetInt(0, expTable[level].Experience - 1) : 0; + + return new RandomisedBotLevelResult { Exp = baseExp + fractionalExp, Level = level }; } - public double ChooseBotLevel(double min, double max, int shift, double number) + public int ChooseBotLevel(double min, double max, int shift, double number) { - return randomUtil.GetBiasedRandomNumber(min, max, shift, number); + return (int)randomUtil.GetBiasedRandomNumber(min, max, shift, number); } ///