From 31f6dd7e75b8b2c232c94b5b1a2a3f819de712ae Mon Sep 17 00:00:00 2001 From: Chomp Date: Tue, 24 Aug 2021 12:10:14 +0100 Subject: [PATCH] Add pmc project prototype for generating mod json data --- PMCGenerator/Models/IntermediaryModels.cs | 34 ++++ PMCGenerator/Models/Presets.cs | 46 +++++ PMCGenerator/PMCGenerator.csproj | 16 ++ PMCGenerator/Program.cs | 197 ++++++++++++++++++++++ 4 files changed, 293 insertions(+) create mode 100644 PMCGenerator/Models/IntermediaryModels.cs create mode 100644 PMCGenerator/Models/Presets.cs create mode 100644 PMCGenerator/PMCGenerator.csproj create mode 100644 PMCGenerator/Program.cs diff --git a/PMCGenerator/Models/IntermediaryModels.cs b/PMCGenerator/Models/IntermediaryModels.cs new file mode 100644 index 0000000..f18d828 --- /dev/null +++ b/PMCGenerator/Models/IntermediaryModels.cs @@ -0,0 +1,34 @@ +namespace PMCGenerator.Models +{ + public class WeaponDetails + { + public WeaponDetails(string presetName, string id, string templateId) + { + Id = id; + TemplateId = templateId; + PresetName = presetName; + } + + public string PresetName { get; set; } + public string Id { get; set; } + public string TemplateId { get; set; } + } + + public class ModDetails + { + public ModDetails(string slotId, string id, string templateId, string parentId, string parentTemplateId) + { + SlotId = slotId; + Id = id; + TemplateId = templateId; + ParentId = parentId; + ParentTemplateId = parentTemplateId; + } + + public string SlotId { get; set; } + public string Id { get; set; } + public string TemplateId { get; set; } + public string ParentId { get; set; } + public string ParentTemplateId { get; set; } + } +} diff --git a/PMCGenerator/Models/Presets.cs b/PMCGenerator/Models/Presets.cs new file mode 100644 index 0000000..a90bd2d --- /dev/null +++ b/PMCGenerator/Models/Presets.cs @@ -0,0 +1,46 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace PMCGenerator +{ + public class Presets + { + public Dictionary weaponbuilds { get; set; } + } + + public class Weapon + { + public string id { get; set; } + public string name { get; set; } + public string root { get; set; } + public List items { get; set; } + } + + public class Module + { + public string _id { get; set; } + public string _tpl { get; set; } + public Dictionary upd { get; set; } + public string parentId { get; set; } + public string slotId { get; set; } + } + + public class Upd + { + public Dictionary Repairable { get; set; } + public Dictionary FireMode { get; set; } + public object Sight { get; set; } + } + +public class Repairable +{ + public int MaxDurability { get; set; } + public int Durability { get; set; } +} + + public class FireMode + { + public string fireMode { get; set; } + } +} diff --git a/PMCGenerator/PMCGenerator.csproj b/PMCGenerator/PMCGenerator.csproj new file mode 100644 index 0000000..ffb397f --- /dev/null +++ b/PMCGenerator/PMCGenerator.csproj @@ -0,0 +1,16 @@ + + + + Exe + netcoreapp3.1 + + + + + + + + + + + diff --git a/PMCGenerator/Program.cs b/PMCGenerator/Program.cs new file mode 100644 index 0000000..dfc6435 --- /dev/null +++ b/PMCGenerator/Program.cs @@ -0,0 +1,197 @@ +using Common; +using Common.Extensions; +using Newtonsoft.Json; +using PMCGenerator.Models; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; + +namespace PMCGenerator +{ + + class Program + { + static void Main(string[] args) + { + // take a list of preset files and spit out a drop-in-replacement mod list + + var presetPath = CreateInputFolder(); + + var presetFiles = GetPresetFileList(presetPath); + + // Parse into list of strongly typed objects + var parsedPresets = new Presets(); + foreach (var presetFile in presetFiles) + { + var json = File.ReadAllText(presetFile); + parsedPresets = JsonConvert.DeserializeObject(json); + } + + // Create flat lists of weapons + list of mods + var flatWeaponsList = GetWeaponsFromRawFile(parsedPresets); + var flatModList = GetModsFromRawFile(parsedPresets); + + // Add weapon mods to output + var output = new { FirstPrimaryWeapon = new List(), Mods = new Dictionary>>() }; + output.FirstPrimaryWeapon.AddRange(flatWeaponsList.Select(x => x.TemplateId).Distinct()); + var mods = output.Mods; + foreach (var weapon in flatWeaponsList) + { + // add weapon if its not already here + if (!mods.ContainsKey(weapon.TemplateId)) + { + // Add weapon to dictionary + 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 = mods[weapon.TemplateId]; + + if (!weaponModsToModify.ContainsKey(modSlotId)) + { + weaponModsToModify.Add(modSlotId, new List()); + } + } + + var modsForWeapon = flatModList.Where(x => x.ParentId == weapon.Id).ToList(); + Dictionary> weaponMods = 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 + && !flatWeaponsList.Any(y => y.Id == x.ParentId)).ToList()) + { + // No parent tempalte id found, create and add mods details + if (!mods.ContainsKey(mod.ParentTemplateId)) + { + var templateIdsList = new List{mod.TemplateId}; + var subtype = new Dictionary>{{ mod.SlotId, templateIdsList } }; + mods.Add(mod.ParentTemplateId, subtype); + } + + //Add subtype to item + var subtypeToAddTo = 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 GetModsFromRawFile(Presets parsedPresets) + { + List result = new List(); + foreach (var item in parsedPresets.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(parsedPresets, mod.parentId); + 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(Presets parsedPresets) + { + var result = new List(); + foreach (var item in parsedPresets.weaponbuilds) + { + 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(); + Console.WriteLine($"{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; + } + } +}