using Common; using Common.Extensions; using Newtonsoft.Json; using PMCGenerator.Models; using System.Collections.Generic; using System.IO; using System.Linq; namespace PMCGenerator { class Program { static void Main(string[] args) { var presetPath = CreateInputFolder(); var presetFiles = GetPresetFileList(presetPath); // Parse into list of strongly typed objects var parsedPresets = ParsePresetJsons(presetFiles); // Create flat lists of weapons + list of mods var flatPrimaryWeaponsList = GetWeaponsFromRawFile(parsedPresets); var flatSecondaryWeaponsList = GetSecondaryWeaponsFromRawFile(parsedPresets); var flatModList = GetModsFromRawFile(parsedPresets); // Add weapon mods to output var output = new { FirstPrimaryWeapon = new List(), Holster = new List(), mods = new Dictionary>>() }; output.FirstPrimaryWeapon.AddRange(flatPrimaryWeaponsList.Select(x => x.TemplateId).Distinct()); output.Holster.AddRange(flatSecondaryWeaponsList.Select(x => x.TemplateId).Distinct()); foreach (var weapon in flatPrimaryWeaponsList) { // add weapon if its not already here if (!output.mods.ContainsKey(weapon.TemplateId)) { // Add weapon to dictionary output.mods.Add(weapon.TemplateId, new Dictionary>()); } // Get mods types for this gun, top level var uniqueModSlots = flatModList.Where(x => x.ParentId == weapon.Id).Select(x => x.SlotId).Distinct().ToList(); foreach (var modSlotId in uniqueModSlots) { Dictionary> weaponModsToModify = output.mods[weapon.TemplateId]; if (!weaponModsToModify.ContainsKey(modSlotId)) { weaponModsToModify.Add(modSlotId, new List()); } } var modsForWeapon = flatModList.Where(x => x.ParentId == weapon.Id).ToList(); Dictionary> weaponMods = output.mods[weapon.TemplateId]; foreach (var mod in modsForWeapon) { weaponMods[mod.SlotId].AddUnique(mod.TemplateId); } } // Get mods where parent is not weapon and add to output foreach (var mod in flatModList.Where(x => x.ParentId != null && !flatPrimaryWeaponsList.Any(y => y.Id == x.ParentId)).ToList()) { // No parent tempalte id found, create and add mods details if (!output.mods.ContainsKey(mod.ParentTemplateId)) { var templateIdsList = new List{mod.TemplateId}; var subtype = new Dictionary>{{ mod.SlotId, templateIdsList } }; output.mods.Add(mod.ParentTemplateId, subtype); } //Add subtype to item var subtypeToAddTo = output.mods[mod.ParentTemplateId]; // No subtype, add it if (!subtypeToAddTo.ContainsKey(mod.SlotId)) { var valueToAdd = new List(){ mod.TemplateId }; subtypeToAddTo.Add(mod.SlotId, valueToAdd); } // subtype exists, add to it subtypeToAddTo[mod.SlotId].AddUnique(mod.TemplateId); } // Create output dir var outputPath = CreateOutputFolder(); // Turn into json var outputJson = JsonConvert.SerializeObject(output, Formatting.Indented); CreateJsonFile(outputPath, outputJson); } private static List ParsePresetJsons(List presetFiles) { var result = new List(); foreach (var presetFile in presetFiles) { var json = File.ReadAllText(presetFile); var parsedFile = JsonConvert.DeserializeObject(json); result.Add(parsedFile); } int count = 0; foreach (var file in result) { count += file.weaponbuilds.Count; } LoggingHelpers.LogToConsole($"{count} presets parsed"); return result; } private static List GetModsFromRawFile(List parsedPresets) { List result = new List(); foreach (var file in parsedPresets) { foreach (var item in file.weaponbuilds) { Weapon weapon = item.Value; // Loop over weapons mods foreach (var mod in weapon.items) { // Skip items with no parent (this is the weapon itself, first item in list) if (mod.parentId == null) { continue; } Module parentMod = GetModsParent(file, mod.parentId); if (parentMod != null) { result.Add(new ModDetails(mod.slotId, mod._id, mod._tpl, mod.parentId, parentMod._tpl)); } } } } return result; } /// /// Find a mod where the supplied parentid equals the items id /// private static Module GetModsParent(Presets parsedPresets, string parentId) { foreach (var y in parsedPresets.weaponbuilds.Values) { var mod = y.items.Find(x => x._id == parentId); if (mod != null) { return mod; } } return null; } private static List GetWeaponsFromRawFile(List parsedPresets) { var result = new List(); foreach (var file in parsedPresets) { foreach (var item in file.weaponbuilds.Where(x=> !x.Key.Contains("pistol"))) { Weapon weapon = item.Value; result.Add(new WeaponDetails(item.Key, weapon.items[0]._id, weapon.items[0]._tpl)); } } return result; } private static List GetSecondaryWeaponsFromRawFile(List parsedPresets) { var result = new List(); foreach (var file in parsedPresets) { foreach (var item in file.weaponbuilds.Where(x => x.Key.Contains("pistol"))) { Weapon weapon = item.Value; result.Add(new WeaponDetails(item.Key, weapon.items[0]._id, weapon.items[0]._tpl)); } } return result; } // Write json to a file private static void CreateJsonFile(string outputPath, string outputJson) { File.WriteAllText($"{outputPath}\\usec.json", outputJson); } /// /// Read json file names from preset folder /// /// path to check for preset files /// private static List GetPresetFileList(string presetPath) { var presetFiles = Directory.GetFiles(presetPath, "*.json", SearchOption.TopDirectoryOnly).ToList(); LoggingHelpers.LogToConsole($"{presetFiles.Count} preset files found"); return presetFiles; } /// /// Create folder structure to read from /// private static string CreateInputFolder() { var workingPath = Directory.GetCurrentDirectory(); var presetPath = $"{workingPath}//input//presets"; DiskHelpers.CreateDirIfDoesntExist(presetPath); return presetPath; } private static string CreateOutputFolder() { var workingPath = Directory.GetCurrentDirectory(); var outputPath = $"{workingPath}\\output"; DiskHelpers.CreateDirIfDoesntExist(outputPath); return outputPath; } } }