using Common.Models; using System.Collections.Generic; using System.Text.Json; namespace Generator.Weighting { public class Weightings { public Dictionary> Equipment { get; set; } // Ammo type + (dict of ammo + weight) public Dictionary > Ammo { get; set; } } public class WeightingService { private readonly Dictionary _weights; private readonly Dictionary> _generationWeights; public WeightingService() { var assetsPath = $"{Directory.GetCurrentDirectory()}\\Assets"; var weightsFilePath = $"{assetsPath}\\weights.json"; if (!File.Exists(weightsFilePath)) { throw new Exception($"Missing weights.json in /assets ({weightsFilePath})"); } var weightJson = File.ReadAllText(weightsFilePath); _weights = JsonSerializer.Deserialize>(weightJson); // bot / itemtype / itemcount var generationWeightJson = File.ReadAllText($"{assetsPath}\\generationWeights.json"); // assault - dict // speicalitems - object // weights + whitelsit _generationWeights = JsonSerializer.Deserialize>>(generationWeightJson); } public int GetAmmoWeight(string tpl, BotType botType, string caliber) { if (_weights.ContainsKey(botType)) { var botWeights = _weights[botType]; if (botWeights.Ammo == null) { return 1; } if (botWeights.Ammo.ContainsKey(caliber)) { var calibers = botWeights.Ammo[caliber]; if (calibers.ContainsKey(tpl)) { return calibers[tpl]; } } } return 1; } public int GetItemWeight(string tpl, BotType botType, string slot) { if (_weights.ContainsKey(botType)) { var botItemList = _weights[botType]; if (botItemList.Equipment.Keys.Contains(slot, StringComparer.CurrentCultureIgnoreCase)) { var slotWeights = botItemList.Equipment.FirstOrDefault(x => x.Key.ToLower() == slot).Value; if (slotWeights.Keys.Contains(tpl, StringComparer.CurrentCultureIgnoreCase)) { var itemWeight = slotWeights[tpl]; return itemWeight; } } } return 1; } public Dictionary GetBotGenerationWeights(BotType botType) { _generationWeights.TryGetValue(botType.ToString(), out var result); if (result == null) { return _generationWeights["default"]; } return result; } } }