diff --git a/Libraries/Core/Controllers/BotController.cs b/Libraries/Core/Controllers/BotController.cs
index 58b261eb..73d60cf3 100644
--- a/Libraries/Core/Controllers/BotController.cs
+++ b/Libraries/Core/Controllers/BotController.cs
@@ -405,7 +405,7 @@ public class BotController(
IsPmc = generateAsPmc,
Side = generateAsPmc ? _botHelper.GetPmcSideByRole(condition.Role ?? string.Empty) : "Savage",
Role = condition.Role,
- PlayerLevel = pmcProfile?.Info?.Level ?? 0,
+ PlayerLevel = pmcProfile?.Info?.Level,
PlayerName = pmcProfile?.Info?.Nickname,
BotRelativeLevelDeltaMax = _pmcConfig.BotRelativeLevelDeltaMax,
BotRelativeLevelDeltaMin = _pmcConfig.BotRelativeLevelDeltaMin,
diff --git a/Libraries/Core/Generators/BotLevelGenerator.cs b/Libraries/Core/Generators/BotLevelGenerator.cs
index 9ad65e16..ccd10a03 100644
--- a/Libraries/Core/Generators/BotLevelGenerator.cs
+++ b/Libraries/Core/Generators/BotLevelGenerator.cs
@@ -29,11 +29,11 @@ public class BotLevelGenerator(
{
if (!botGenerationDetails.IsPmc.GetValueOrDefault(false))
{
- return new RandomisedBotLevelResult() { Exp = 0, Level = 1 };
+ return new RandomisedBotLevelResult { Exp = 0, Level = 1 };
}
var expTable = _databaseService.GetGlobals().Configuration.Exp.Level.ExperienceTable;
- var botLevelRange = GetRelativeBotLevelRange(botGenerationDetails, levelDetails, expTable.Length);
+ var botLevelRange = GetRelativePmcBotLevelRange(botGenerationDetails, levelDetails, expTable.Length);
// Get random level based on the exp table.
int exp = 0;
@@ -61,37 +61,38 @@ public class BotLevelGenerator(
}
///
- /// Return the min and max bot level based on a relative delta from the PMC level
+ /// Return the min and max level a PMC can be
///
/// Details to help generate a bot
///
/// Max level allowed
/// A MinMax of the lowest and highest level to generate the bots
- public MinMax GetRelativeBotLevelRange(BotGenerationDetails botGenerationDetails, MinMax levelDetails, int maxAvailableLevel)
+ public MinMax GetRelativePmcBotLevelRange(BotGenerationDetails botGenerationDetails, MinMax levelDetails, int maxAvailableLevel)
{
- var isPmc = botGenerationDetails.IsPmc.GetValueOrDefault(false);
- var pmcOverride = botGenerationDetails.LocationSpecificPmcLevelOverride;
+ var levelOverride = botGenerationDetails.LocationSpecificPmcLevelOverride;
- var minPossibleLevel = isPmc && pmcOverride is not null
+ // Create a min limit PMCs level cannot fall below
+ var minPossibleLevel = levelOverride is not null
? Math.Min(
- Math.Max(levelDetails.Min.Value, pmcOverride.Min.Value), // Biggest between json min and the botgen min
+ Math.Max(levelDetails.Min.Value, levelOverride.Min.Value), // Biggest between json min and the botgen min
maxAvailableLevel // Fallback if value above is crazy (default is 79)
)
: Math.Min(levelDetails.Min.Value, maxAvailableLevel); // Not pmc with override or non-pmc
- // Force min level to be 1
- minPossibleLevel = Math.Max(1, minPossibleLevel);
-
- var maxPossibleLevel = isPmc && pmcOverride is not null
- ? Math.Min(pmcOverride.Max.Value, maxAvailableLevel) // Was a PMC and they have a level override
+ // Create a max limit PMCs level cannot go above
+ var maxPossibleLevel = levelOverride is not null
+ ? Math.Min(levelOverride.Max.Value, maxAvailableLevel) // Was a PMC and they have a level override
: Math.Min(levelDetails.Max.Value, maxAvailableLevel); // Not pmc with override or non-pmc
+ // Get min level relative to player if value exists
var minLevel = botGenerationDetails.PlayerLevel.HasValue
- ? botGenerationDetails.PlayerLevel.Value
- : 0 - botGenerationDetails.BotRelativeLevelDeltaMin.Value;
+ ? botGenerationDetails.PlayerLevel.Value - botGenerationDetails.BotRelativeLevelDeltaMin.Value
+ : 1 - botGenerationDetails.BotRelativeLevelDeltaMin.Value;
+
+ // Get max level relative to player if value exists
var maxLevel = botGenerationDetails.PlayerLevel.HasValue
- ? botGenerationDetails.PlayerLevel.Value
- : 0 + botGenerationDetails.BotRelativeLevelDeltaMin.Value;
+ ? botGenerationDetails.PlayerLevel.Value + botGenerationDetails.BotRelativeLevelDeltaMax.Value
+ : 1 + botGenerationDetails.BotRelativeLevelDeltaMin.Value;
// Bound the level to the min/max possible
maxLevel = Math.Min(Math.Max(maxLevel, minPossibleLevel), maxPossibleLevel);