using SptCommon.Annotations; using Core.Models.Eft.Common.Tables; using Core.Models.Spt.Bots; using Core.Models.Spt.Config; using Core.Models.Utils; using Core.Servers; using Core.Services; using Core.Utils; using Core.Utils.Cloners; namespace Core.Helpers; [Injectable] public class BotDifficultyHelper( ISptLogger _logger, DatabaseService _databaseService, RandomUtil _randomUtil, LocalisationService _localisationService, BotHelper _botHelper, ConfigServer _configServer, ICloner _cloner ) { protected PmcConfig _pmcConfig = _configServer.GetConfig(); /// /// Get difficulty settings for desired bot type, if not found use assault bot types /// /// bot type to retrieve difficulty of /// difficulty to get settings for (easy/normal etc) /// bots from database /// Difficulty object public DifficultyCategories GetBotDifficultySettings(string type, string difficulty, Bots botDb) { var desiredType = type.ToLower(); if (!botDb.Types.TryGetValue(desiredType, out var _)) { // No bot found, get fallback difficulty values _logger.Warning(_localisationService.GetText("bot-unable_to_get_bot_fallback_to_assault", type)); botDb.Types[desiredType] = _cloner.Clone(botDb.Types["assault"]); } // Get settings from raw bot json template file var difficultySettings = _botHelper.GetBotTemplate(desiredType).BotDifficulty[difficulty]; if (difficultySettings is null) { // No bot settings found, use 'assault' bot difficulty instead _logger.Warning( _localisationService.GetText("bot-unable_to_get_bot_difficulty_fallback_to_assault", new { botType = desiredType, difficulty = difficulty, })); botDb.Types[desiredType].BotDifficulty[difficulty] = _cloner.Clone( botDb.Types["assault"].BotDifficulty[difficulty] ); } return _cloner.Clone(difficultySettings); } /// /// Get difficulty settings for a PMC /// /// "usec" / "bear" /// what difficulty to retrieve /// Difficulty object protected DifficultyCategories GetDifficultySettings(string type, string difficulty) { var difficultySetting = _pmcConfig.Difficulty.ToLower() == "asonline" ? difficulty : _pmcConfig.Difficulty.ToLower(); difficultySetting = ConvertBotDifficultyDropdownToBotDifficulty(difficultySetting); return _cloner.Clone(_databaseService.GetBots().Types[type].BotDifficulty[difficultySetting]); } /// /// Translate chosen value from pre-raid difficulty dropdown into bot difficulty value /// /// Dropdown difficulty value to convert /// bot difficulty public string ConvertBotDifficultyDropdownToBotDifficulty(string dropDownDifficulty) { switch (dropDownDifficulty.ToLower()) { case "medium": return "normal"; case "random": return ChooseRandomDifficulty(); default: return dropDownDifficulty.ToLower(); } } /// /// Choose a random difficulty from - easy/normal/hard/impossible /// /// random difficulty public string ChooseRandomDifficulty() { return _randomUtil.GetArrayValue(["easy", "normal", "hard", "impossible"]); } }