From c2b0dc56d66b05711534bed2b6d1a69db183a39a Mon Sep 17 00:00:00 2001 From: docsaintly Date: Tue, 6 Oct 2020 06:11:58 +0100 Subject: [PATCH 1/8] First pass. Go easy on me. --- Perpetuum.DataDumper/App.config | 6 + Perpetuum.DataDumper/CargoTypeAttribute.cs | 17 + Perpetuum.DataDumper/DataDumper.cs | 604 ++++++++++++++++++ Perpetuum.DataDumper/DataExportMapping.cs | 24 + Perpetuum.DataDumper/DumperForm.Designer.cs | 136 ++++ Perpetuum.DataDumper/DumperForm.cs | 133 ++++ Perpetuum.DataDumper/DumperForm.resx | 197 ++++++ Perpetuum.DataDumper/EnumHelper.cs | 32 + Perpetuum.DataDumper/ExtensionMethods.cs | 35 + .../Factory/DataDumper.AmmoWeapon.cs | 53 ++ .../Factory/DataDumper.ModuleArmorHardener.cs | 61 ++ .../Factory/DataDumper.ModuleArmorPlate.cs | 28 + .../Factory/DataDumper.ModuleArmorRepair.cs | 37 ++ .../Factory/DataDumper.ModuleERP.cs | 29 + .../DataDumper.ModuleRemoteArmorRepair.cs | 27 + .../DataDumper.ModuleShieldGenerator.cs | 26 + .../Factory/DataDumper.ModuleWeapon.cs | 59 ++ .../Factory/DataDumper.Resolver.cs | 94 +++ .../Factory/DataDumper.Spark.cs | 90 +++ .../Perpetuum.DataDumper.csproj | 170 +++++ Perpetuum.DataDumper/PerpetuumLightServer.cs | 27 + Perpetuum.DataDumper/Program.cs | 19 + .../Properties/AssemblyInfo.cs | 36 ++ .../Properties/Resources.Designer.cs | 63 ++ .../Properties/Resources.resx | 117 ++++ .../Properties/Settings.Designer.cs | 26 + .../Properties/Settings.settings | 7 + Perpetuum.DataDumper/RobotDataView.cs | 77 +++ .../Views/AmmoWeaponDataView.cs | 23 + .../Views/ModuleArmorHardenerDataView.cs | 26 + .../Views/ModuleArmorPlateView.cs | 17 + .../Views/ModuleArmorRepairerDataView.cs | 23 + .../Views/ModuleERPDataView.cs | 19 + .../ModuleRemoteArmorRepairerDataView.cs | 17 + .../Views/ModuleResistancePlatingDataView.cs | 15 + .../Views/ModuleShieldGeneratorDataView.cs | 17 + .../Views/ModuleWeaponDataView.cs | 58 ++ Perpetuum.DataDumper/Views/SparkDataView.cs | 20 + Perpetuum.DataDumper/packages.config | 8 + Perpetuum.sln | 15 + .../PerpetuumBootstrapper.cs | 8 +- .../EntityFramework/EntityFactory.cs | 41 +- src/Perpetuum/Modules/SlotFlags.cs | 28 +- 43 files changed, 2547 insertions(+), 18 deletions(-) create mode 100644 Perpetuum.DataDumper/App.config create mode 100644 Perpetuum.DataDumper/CargoTypeAttribute.cs create mode 100644 Perpetuum.DataDumper/DataDumper.cs create mode 100644 Perpetuum.DataDumper/DataExportMapping.cs create mode 100644 Perpetuum.DataDumper/DumperForm.Designer.cs create mode 100644 Perpetuum.DataDumper/DumperForm.cs create mode 100644 Perpetuum.DataDumper/DumperForm.resx create mode 100644 Perpetuum.DataDumper/EnumHelper.cs create mode 100644 Perpetuum.DataDumper/ExtensionMethods.cs create mode 100644 Perpetuum.DataDumper/Factory/DataDumper.AmmoWeapon.cs create mode 100644 Perpetuum.DataDumper/Factory/DataDumper.ModuleArmorHardener.cs create mode 100644 Perpetuum.DataDumper/Factory/DataDumper.ModuleArmorPlate.cs create mode 100644 Perpetuum.DataDumper/Factory/DataDumper.ModuleArmorRepair.cs create mode 100644 Perpetuum.DataDumper/Factory/DataDumper.ModuleERP.cs create mode 100644 Perpetuum.DataDumper/Factory/DataDumper.ModuleRemoteArmorRepair.cs create mode 100644 Perpetuum.DataDumper/Factory/DataDumper.ModuleShieldGenerator.cs create mode 100644 Perpetuum.DataDumper/Factory/DataDumper.ModuleWeapon.cs create mode 100644 Perpetuum.DataDumper/Factory/DataDumper.Resolver.cs create mode 100644 Perpetuum.DataDumper/Factory/DataDumper.Spark.cs create mode 100644 Perpetuum.DataDumper/Perpetuum.DataDumper.csproj create mode 100644 Perpetuum.DataDumper/PerpetuumLightServer.cs create mode 100644 Perpetuum.DataDumper/Program.cs create mode 100644 Perpetuum.DataDumper/Properties/AssemblyInfo.cs create mode 100644 Perpetuum.DataDumper/Properties/Resources.Designer.cs create mode 100644 Perpetuum.DataDumper/Properties/Resources.resx create mode 100644 Perpetuum.DataDumper/Properties/Settings.Designer.cs create mode 100644 Perpetuum.DataDumper/Properties/Settings.settings create mode 100644 Perpetuum.DataDumper/RobotDataView.cs create mode 100644 Perpetuum.DataDumper/Views/AmmoWeaponDataView.cs create mode 100644 Perpetuum.DataDumper/Views/ModuleArmorHardenerDataView.cs create mode 100644 Perpetuum.DataDumper/Views/ModuleArmorPlateView.cs create mode 100644 Perpetuum.DataDumper/Views/ModuleArmorRepairerDataView.cs create mode 100644 Perpetuum.DataDumper/Views/ModuleERPDataView.cs create mode 100644 Perpetuum.DataDumper/Views/ModuleRemoteArmorRepairerDataView.cs create mode 100644 Perpetuum.DataDumper/Views/ModuleResistancePlatingDataView.cs create mode 100644 Perpetuum.DataDumper/Views/ModuleShieldGeneratorDataView.cs create mode 100644 Perpetuum.DataDumper/Views/ModuleWeaponDataView.cs create mode 100644 Perpetuum.DataDumper/Views/SparkDataView.cs create mode 100644 Perpetuum.DataDumper/packages.config diff --git a/Perpetuum.DataDumper/App.config b/Perpetuum.DataDumper/App.config new file mode 100644 index 000000000..bae5d6d81 --- /dev/null +++ b/Perpetuum.DataDumper/App.config @@ -0,0 +1,6 @@ + + + + + + diff --git a/Perpetuum.DataDumper/CargoTypeAttribute.cs b/Perpetuum.DataDumper/CargoTypeAttribute.cs new file mode 100644 index 000000000..1e463d673 --- /dev/null +++ b/Perpetuum.DataDumper/CargoTypeAttribute.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Perpetuum.DataDumper { + + [System.AttributeUsage(System.AttributeTargets.Class)] + public class CargoTypeAttribute : System.Attribute { + public string Type; + + public CargoTypeAttribute(string type) { + this.Type = type; + } + } +} diff --git a/Perpetuum.DataDumper/DataDumper.cs b/Perpetuum.DataDumper/DataDumper.cs new file mode 100644 index 000000000..9e1391ac2 --- /dev/null +++ b/Perpetuum.DataDumper/DataDumper.cs @@ -0,0 +1,604 @@ +using Autofac; +using Perpetuum.Bootstrapper; +using Perpetuum.Data; +using Perpetuum.EntityFramework; +using Perpetuum.ExportedTypes; +using Perpetuum.Items; +using Perpetuum.Modules; +using Perpetuum.Modules.Weapons; +using Perpetuum.Robots; +using Perpetuum.Services.ExtensionService; +using System; +using System.Collections.Generic; +using System.Data; +using System.Linq; +using System.Runtime.InteropServices; +using Newtonsoft.Json; +using Perpetuum.Items.Ammos; +using Perpetuum.Services.ProductionEngine; +using Perpetuum.DataDumper.Views; +using System.Windows.Forms; +using System.CodeDom; +using Perpetuum.Services.Sparks; +using Perpetuum.Groups.Alliances; +using System.Reflection; +using NPOI.SS.UserModel; + +namespace Perpetuum.DataDumper +{ + public partial class DataDumper + { + private IContainer container; + EntityFactory entityFactory; + IEntityServices entityServices; + IExtensionReader extensionReader; + IEntityDefaultReader defaultReader; + Dictionary itemNames; + ISparkRepository sparkRepository; + + // Some static lists for helpers + public static SlotFlags[] sizeFlags = new SlotFlags[] { SlotFlags.small, SlotFlags.medium, SlotFlags.large }; + public static SlotFlags[] typeFlags = new SlotFlags[] { SlotFlags.turret, SlotFlags.missile, SlotFlags.melee, SlotFlags.industrial, SlotFlags.ew_and_engineering }; + public static SlotFlags[] locationFlags = new SlotFlags[] { SlotFlags.head, SlotFlags.chassis, SlotFlags.leg }; + public static List ammoWeaponCategories = new List { + CategoryFlags.cf_railgun_ammo, + CategoryFlags.cf_laser_ammo, + CategoryFlags.cf_missile_ammo, + CategoryFlags.cf_projectile_ammo }; + + private static List views = new List { + new DataDumpConfiguration { ViewType = typeof(AmmoWeaponDataView), ViewCategory = "cf_ammo" }, + new DataDumpConfiguration { ViewType = typeof(ModuleWeaponDataView), ViewCategory = "cf_weapons" } + + }; + + public DataDumper(IContainer container) + { + this.container = container; + + entityFactory = container.Resolve(); + + extensionReader = container.Resolve(); + + defaultReader = container.Resolve(); + + var productionDataReader = container.Resolve(); + + sparkRepository = container.Resolve(); + + entityServices = container.Resolve(); + + // var getEd = defaultReader.GetByName("def_named1_small_armor_repairer"); + // var getCats = String.Join(";", getEd.CategoryFlags.GetCategoryFlagsTree().Where(x => x.ToString() != "undefined").Select(x => x.ToString()).ToList()); + // var testMissile = productionDataReader.ProductionComponents[64]; + // var testRobot = productionDataReader.ProductionComponents[193]; + // var testRobot2 = productionDataReader.ProductionComponents[208]; + + itemNames = new Dictionary(); + + var dataLines = System.IO.File.ReadAllLines(@"C:\Users\derek\Desktop\projects\Perpetuum\dictionary.tsv"); + + foreach (var line in dataLines) + { + var parts = line.Split(new char[] { '\t' }); + itemNames.Add(parts[0], parts[1]); + } + + // Now read the names from JSON files + var jsonFiles = System.IO.Directory.GetFiles(@"C:\Users\derek\Desktop\projects\Perpetuum\OPDB\Patches", "0.json", System.IO.SearchOption.AllDirectories); + var sortedFiles = jsonFiles.ToList(); + sortedFiles.Sort(); + + foreach (var jsonFilePath in sortedFiles) { + var fileLines = System.IO.File.ReadAllText(jsonFilePath); + + var jsonData = JsonConvert.DeserializeObject>(fileLines); + + foreach (var item in jsonData) { + if (itemNames.ContainsKey(item.Key)) { + itemNames[item.Key] = item.Value; + } else { + itemNames.Add(item.Key, item.Value); + } + } + + } + + + Console.WriteLine($"{dataLines.Length} dictionary names loaded"); + } + + public string GetLocalizedName(string itemKey) + { + if (itemNames.ContainsKey(itemKey)) + { + return itemNames[itemKey]; + } else + { + return itemKey; + } + } + + public class EntityDataView { + public string item_name { get; set; } // This should actually be renamed... + public string item_key { get; set; } + public List item_categories { get; set; } + } + + public class ItemDataView : EntityDataView { + public double item_mass { get; set; } + public double item_volume { get; set; } + public double item_volume_packed { get; set; } + + } + + public class ModuleDataView : ItemDataView { + public string module_tier { get; set; } + public double module_cpu { get; set; } + public double module_reactor { get; set; } + public List module_extensions_required { get; set; } + } + + public class ActiveModuleDataView : ModuleDataView { + // These are nullable because some items may be + // in a group of active modules but are themselves + // passive and we don't want to show 0 for them + public double? module_accumulator { get; set; } + public double? module_cycle { get; set; } + + } + + public static string GenerateCargoDefinition(Type viewType, string tableName, string listDelimiter = ";") { + string header = "\n{{#cargo_declare:_table="+tableName+"\n"; + string body = ""; + string footer = "}}\n"; + var allProperties = viewType.GetProperties().OrderBy(x=> x.Name).ToList(); + + foreach (var property in allProperties) { + var cargoAttribute = property.GetCustomAttribute(); + + string cargoType = "String"; // <- This is the default in Cargo + + if (cargoAttribute != null) { + cargoType = cargoAttribute.Type; + } else { + // Let's set some defaults by property type + if (property.PropertyType == typeof(double)) { + cargoType = "Float"; + } else if (property.PropertyType == typeof(int)) { + cargoType = "Integer"; + } else if (property.PropertyType == typeof(bool)) { + cargoType = "Boolean"; + } else if(property.PropertyType == typeof(List)) { + cargoType = $"List ({listDelimiter}) of String"; + } else if (property.PropertyType == typeof(List)) { + cargoType = $"List ({listDelimiter}) of Integer"; + } else if (property.PropertyType == typeof(List)) { + cargoType = $"List ({listDelimiter}) of Float"; + } + } + + body += $"|{property.Name}={cargoType}\n"; + } + + return header + body + footer; + + } + + private void InitItemView(ItemDataView view, Entity entity) { + view.item_name = GetLocalizedName(entity.ED.Name); + view.item_key = entity.ED.Name; + view.item_categories = entity.ED.CategoryFlags.GetCategoryFlagsTree().Where(x=> x.ToString() != "undefined").Select(x => x.ToString()).ToList(); + view.item_mass = entity.Mass; + view.item_volume_packed = entity.ED.CalculateVolume(true, 1); + view.item_volume = entity.ED.CalculateVolume(false, 1); + } + + private void InitModuleView(ModuleDataView view, Modules.Module module) { + InitItemView(view, module); + + view.module_tier = module.ED.GameTierString(); + view.module_cpu = module.CpuUsage; + view.module_reactor = module.PowerGridUsage; + + view.module_extensions_required = new List(); + + foreach (var extension in module.ED.EnablerExtensions.Keys) { + view.module_extensions_required.Add(GetLocalizedName(extensionReader.GetExtensionName(extension.id)) + "(" + extension.level + ")"); + } + } + + private void InitActiveModuleView(ActiveModuleDataView view, ActiveModule module) { + InitModuleView(view, module); + + view.module_accumulator = module.CoreUsage; + view.module_cycle = module.CycleTime.TotalSeconds; + } + + private string GetModifierString(ItemPropertyModifier mod) { + var returnValue = ""; + if (mod.HasValue) { + returnValue = ((mod.Value - 1) * 100) + "%"; + + if (mod.Value - 1 > 0) { + returnValue = "+" + returnValue; + } + } + + return returnValue; + } + + // Factory Methods + + private class DataDumpConfiguration { + public Type ViewType { get; set; } + public String ViewCategory { get; set; } + } + + + public void DumpGenericData(string categoryName, string outputPath) + { + var returnData = new List>(); + List headers = null; + var categoryData = GetDataByItemCategoryName(categoryName); + + foreach (var categoryItem in categoryData) + { + string itemName = categoryItem["definitionname"].ToString(); + int itemId = (int)categoryItem["definition"]; + try + { + // var currentDefaults = defaultReader.GetByName(itemName); + var currentObject = entityFactory.CreateForData(itemName, EntityIDGenerator.Random); + + var dictionaryData = currentObject.ToDictionary(); + + if (currentObject is Modules.Weapons.WeaponModule) + { + dictionaryData["ammoCategoryFlags"] = (CategoryFlags)dictionaryData["ammoCategoryFlags"]; + } + + if (headers == null || headers.Count == 0) + { + // We only want certain properties, yo! + headers = currentObject.GetType().GetProperties().Select(i => i.Name).ToList(); // new List { "BlobEmission", "BlobEmissionRadius", "Mass", "Volume", "MaxTargetingRange", "PowerGrid", "Cpu", "AmmoReloadTime", "MissileHitChance", "Height", "ArmorMax", "ActualMass", "CoreMax", "SignatureRadius", "SensorStrength", "DetectionStrength", "StealthStrength", "Massiveness", "ReactorRadiation", "Slope", "CoreRechargeTime", "BlockingRadius", "HitSize" }; + returnData.Add((new string[] { "Item Name" }).Concat(headers).ToList()); + } + + var currentProperties = new List(); + + currentProperties.Add(itemName); + + // Parse the object + foreach (string prop in headers) + { + try + { + var currentProp = currentObject.GetType().GetProperty(prop); + + if (currentProp == null) + { + currentProperties.Add("Error: Prop not found"); + } + else + { + var currentMethod = currentProp.GetGetMethod(true); + + if (currentMethod == null) + { + currentProperties.Add("Error: Getter not found"); + } + else + { + object value = currentMethod.Invoke(currentObject, null); + string stringValue = value?.ToString() ?? ""; + currentProperties.Add(stringValue.Replace(",", ";")); + } + + } + } + catch (Exception) + { + currentProperties.Add("EXCEPTION"); + } + + } + + returnData.Add(currentProperties); + + } + catch (Exception) + { + returnData.Add(new List { itemName, "BIG EXCEPTION" }); + } + } + + System.IO.File.WriteAllLines(outputPath, returnData.Select(x => String.Join(",", x))); + + } + + // cf_railguns, look at definition column + + public void WriteDataView(List> dataRows, string filePath) + { + System.IO.File.WriteAllLines(filePath, dataRows.Select(x => String.Join(",", x))); + } + + public void WriteDataView(List> dataRows, string sheetName, ISheet worksheet, ref int currentDataRow) { + // Deal with the header + // If we are writing later than the first row in our sheet then we will skip + // the first row in our data because it will contain the header + int skipRow = 0; + + if (currentDataRow > 0) { + skipRow = 1; + } + + foreach (var dataRow in dataRows.Skip(skipRow).ToList()) { + int currentColumn = 0; + var currentRow = worksheet.CreateRow(currentDataRow); + foreach (var dataValue in dataRow) { + currentRow.CreateCell(currentColumn).SetCellValue(dataValue); + currentColumn++; + } + currentDataRow++; + } + } + + /// + /// This will write the properties as headers and values as rows + /// + public List> ComposeDataView(List data, string wikiTableName = "wikitable") { + var returnData = new List>(); + + if (data is null || data.Count == 0) { + return returnData; // Do nothing + } + + var headers = data.First().GetType().GetProperties().Select(i => i.Name).ToList(); + + returnData.Add(headers.Concat(new List { "wiki" }).ToList()); + + foreach (var item in data) + { + var currentProperties = new List(); + + // Add the wiki markup at the end + // {{#cargo_store:_table=WeaponStats|module_name=Niani medium EM-gun|module_key=def_artifact_a_longrange_medium_railgun|module_categories=cf_medium_railguns;cf_railguns;cf_weapons;cf_robot_equipment|cpu=45|reactor=205|ammo_type=Medium slugs|slot_status=Active|ammo_capacity=50|module_mass=650|module_volume_packed=0.25|module_tier=T3+|module_volume=0.5|module_accumulator=32|module_cycle=10|module_damage=250|module_falloff=60|module_hit_dispersion=14|module_optimal_range=300|module_extensions_required=Advanced magnetostatics(2);|slot_type=turret|slot_size=medium|slot_location=chassis}} + string wikiData = $"{{{{#cargo_store:_table={wikiTableName}"; + + foreach (string prop in headers) + { + var currentProp = item.GetType().GetProperty(prop); + var currentValue = ""; + + try + { + if (currentProp == null) + { + currentValue = "Error: Prop not found"; + } + else + { + if (currentProp.PropertyType.Name.Contains("List")) { + currentValue = String.Join(";", (currentProp.GetValue(item) as IEnumerable)); + } else { + currentValue = currentProp.GetValue(item)?.ToString().Replace(",",";") ?? ""; + } + //var currentMethod = currentProp.GetGetMethod(true); + + //if (currentMethod == null) + //{ + // currentValue = "Error: Getter not found"; + //} + //else + //{ + // object value = currentMethod.Invoke(item, null); + // string stringValue = value?.ToString() ?? ""; + // currentValue = stringValue.Replace(",", ";"); + //} + + } + } + catch (Exception) + { + currentValue = "EXCEPTION"; + } + + currentProperties.Add(currentValue); + + wikiData += $"|{prop}={currentValue}"; + + } + + wikiData += "}}"; + + currentProperties.Add(wikiData); + + returnData.Add(currentProperties); + + } + + return returnData; + + } + + + + private List GetDataByItemCategoryName(string categoryName) + { + var itemData = Db.Query().CommandText( + $@"DECLARE @lookupFlag bigint; + SET @lookupFlag = (select value from dbo.categoryFlags where name='{categoryName}'); + SELECT * from entitydefaults where (categoryflags & CAST(dbo.GetCFMask(@lookupFlag)as BIGINT) = @lookupFlag) + AND enabled=1 AND hidden=0 AND purchasable=1;" + ).Execute(); + + return itemData; + } + + // var Extension + // var test2 = entityFactory.Create(684, EntityIDGenerator.Random, true); + // var test3 = entityFactory.Create("def_standard_small_armor_plate", EntityIDGenerator.Random, true); + + public void GetRobotData(string outputPath) + { + var botNames = GetDataByItemCategoryName("cf_robots"); + + var returnData = new List>(); + List headers = null; + + var botDataList = new List(); + + foreach (var botData in botNames) + { + string botName = botData["definitionname"].ToString(); + try + { + var currentBot = entityFactory.CreateForData(botName, EntityIDGenerator.Random); + + botDataList.Add(currentBot); + + // var dataView = new RobotDataView(currentBot as Robot); + + if (headers == null || headers.Count == 0) + { + // We only want certain properties, yo! + headers = new List { "BlobEmission", "BlobEmissionRadius", "Mass", "Volume", "MaxTargetingRange", "PowerGrid", "Cpu", "AmmoReloadTime", "MissileHitChance", "Height", "ArmorMax", "ActualMass", "CoreMax", "SignatureRadius", "SensorStrength", "DetectionStrength", "StealthStrength", "Massiveness", "ReactorRadiation", "Slope", "CoreRechargeTime", "BlockingRadius", "HitSize" }; // currentBot.GetType().GetProperties().Select(i => i.Name).ToList(); + + var propNames = ((Robot)currentBot).Properties.Select(x => x.Field.ToString()); + var slotProps = new List { "Capacity", "SlotsHead", "SlotsChassis", "SlotsLegs" }; + // headers.Remove("Definition"); + returnData.Add((new string[] { "Bot Name" }).Concat(headers).Concat(propNames).Concat(slotProps).ToList()); + } + + var currentProperties = new List(); + + currentProperties.Add(botName); + + // Parse the object + foreach (string prop in headers) + { + try + { + string errorMessage; + var currentProp = currentBot.GetType().GetProperty(prop); + + if (currentProp == null) + { + currentProperties.Add("Error: Prop not found"); + } + else + { + var currentMethod = currentProp.GetGetMethod(true); + + if (currentMethod == null) + { + currentProperties.Add("Error: Getter not found"); + } + else + { + object value = currentMethod.Invoke(currentBot, null); + string stringValue = value?.ToString() ?? ""; + currentProperties.Add(stringValue.Replace(",", ";")); + } + + } + } + catch (Exception) + { + currentProperties.Add("EXCEPTION"); + } + + } + + Robot input = (Robot)currentBot; + + // Parse the extra properties + foreach (var item in input.Properties) + { + currentProperties.Add(item.Value.ToString()); + } + + RobotHead head = input.GetRobotComponent(); + RobotChassis chassis = input.GetRobotComponent(); + RobotLeg legs = input.GetRobotComponent(); + RobotInventory inventory = input.Components.OfType().SingleOrDefault(); + + currentProperties.Add(inventory.GetCapacityInfo()["capacity"].ToString()); + currentProperties.Add(String.Join(";", head.ED.Options.SlotFlags.Select(x => ((SlotFlags)x).ToString()))); + currentProperties.Add(String.Join(";", chassis.ED.Options.SlotFlags.Select(x => ((SlotFlags)x).ToString().Replace(", ", "|")))); + currentProperties.Add(String.Join(";", legs.ED.Options.SlotFlags.Select(x => ((SlotFlags)x).ToString().Replace(", ", "|")))); + + + + // This returns the ID and required level + var extData = input.ExtensionBonusEnablerExtensions.ToList(); + + for (int i = 1; i <= 10; i++) + { + if (extData.Count >= i) + { + var currentItem = extData[i - 1]; + currentProperties.Add(extensionReader.GetExtensionName(currentItem.id) + "=" + currentItem.level); + } + else + { + currentProperties.Add(""); // Fill in with empty + } + } + + var requiredExtensions = input.ED.EnablerExtensions; // Gets the list of extensiosn required from definition. seems to match above. + + for (int i = 1; i <= 10; i++) + { + var currentKeys = requiredExtensions.Keys.ToList(); + if (currentKeys.Count >= i) + { + var currentItem = currentKeys[i - 1]; + currentProperties.Add(extensionReader.GetExtensionName(currentItem.id) + "=" + currentItem.level); + } + else + { + currentProperties.Add(""); // Fill in with empty + } + } + + // Aggregate field, bonus + var bonuses = input.RobotComponents.SelectMany(component => component.ExtensionBonuses).ToList(); // head.ExtensionBonuses.Concat(chassis.ExtensionBonuses).Concat(legs.ExtensionBonuses).ToList(); + + for (int i = 1; i <= 10; i++) + { + if (bonuses.Count >= i) + { + var currentItem = bonuses[i - 1]; + currentProperties.Add(extensionReader.GetExtensionName(currentItem.extensionId) + "=" + currentItem.aggregateField + "+" + currentItem.bonus); + } + else + { + currentProperties.Add(""); // Fill in with empty + } + } + + // We don't need this since we have the object already + // var extData2 = extensionReader.GetEnablerExtensions(input.Definition); + + + returnData.Add(currentProperties); + + } + catch (Exception) + { + returnData.Add(new List { botName, "BIG EXCEPTION" }); + } + } + + // now write all the data + string filePath = outputPath; + + System.IO.File.WriteAllLines(filePath, returnData.Select(x => String.Join(",", x))); + + } + + } +} diff --git a/Perpetuum.DataDumper/DataExportMapping.cs b/Perpetuum.DataDumper/DataExportMapping.cs new file mode 100644 index 000000000..57d905a06 --- /dev/null +++ b/Perpetuum.DataDumper/DataExportMapping.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Perpetuum.DataDumper { + public class DataExportMapping { + public string TableName { get; set; } + public Type ViewType { get; set; } + public string Category { get; set; } + + public DataExportMapping(string _tableName, Type _type, string _category) { + TableName = _tableName; + ViewType = _type; + Category = _category; + } + + public override string ToString() { + return ViewType.Name.ToString(); + } + + } +} diff --git a/Perpetuum.DataDumper/DumperForm.Designer.cs b/Perpetuum.DataDumper/DumperForm.Designer.cs new file mode 100644 index 000000000..30b43422d --- /dev/null +++ b/Perpetuum.DataDumper/DumperForm.Designer.cs @@ -0,0 +1,136 @@ +namespace Perpetuum.DataDumper { + partial class DumperForm { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) { + if (disposing && (components != null)) { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(DumperForm)); + this.StartButton = new System.Windows.Forms.Button(); + this.mappingSelectList = new System.Windows.Forms.CheckedListBox(); + this.label2 = new System.Windows.Forms.Label(); + this.allTypesButton = new System.Windows.Forms.Button(); + this.clearTypesButton = new System.Windows.Forms.Button(); + this.serverPathTextbox = new System.Windows.Forms.TextBox(); + this.label3 = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // StartButton + // + this.StartButton.Location = new System.Drawing.Point(12, 12); + this.StartButton.Name = "StartButton"; + this.StartButton.Size = new System.Drawing.Size(65, 23); + this.StartButton.TabIndex = 0; + this.StartButton.Text = "Start"; + this.StartButton.UseVisualStyleBackColor = true; + this.StartButton.Click += new System.EventHandler(this.StartButton_Click); + // + // mappingSelectList + // + this.mappingSelectList.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left))); + this.mappingSelectList.FormattingEnabled = true; + this.mappingSelectList.Location = new System.Drawing.Point(12, 78); + this.mappingSelectList.Name = "mappingSelectList"; + this.mappingSelectList.Size = new System.Drawing.Size(306, 364); + this.mappingSelectList.TabIndex = 3; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(13, 56); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(62, 13); + this.label2.TabIndex = 4; + this.label2.Text = "Data Types"; + // + // allTypesButton + // + this.allTypesButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.allTypesButton.Location = new System.Drawing.Point(12, 453); + this.allTypesButton.Name = "allTypesButton"; + this.allTypesButton.Size = new System.Drawing.Size(75, 23); + this.allTypesButton.TabIndex = 5; + this.allTypesButton.Text = "All"; + this.allTypesButton.UseVisualStyleBackColor = true; + this.allTypesButton.Click += new System.EventHandler(this.allTypesButton_Click); + // + // clearTypesButton + // + this.clearTypesButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.clearTypesButton.Location = new System.Drawing.Point(122, 453); + this.clearTypesButton.Name = "clearTypesButton"; + this.clearTypesButton.Size = new System.Drawing.Size(75, 23); + this.clearTypesButton.TabIndex = 6; + this.clearTypesButton.Text = "Clear"; + this.clearTypesButton.UseVisualStyleBackColor = true; + this.clearTypesButton.Click += new System.EventHandler(this.clearTypesButton_Click); + // + // serverPathTextbox + // + this.serverPathTextbox.Location = new System.Drawing.Point(151, 14); + this.serverPathTextbox.Name = "serverPathTextbox"; + this.serverPathTextbox.Size = new System.Drawing.Size(167, 20); + this.serverPathTextbox.TabIndex = 7; + this.serverPathTextbox.TextChanged += new System.EventHandler(this.serverPathTextbox_TextChanged); + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(105, 17); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(32, 13); + this.label3.TabIndex = 8; + this.label3.Text = "Path:"; + // + // DumperForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(327, 488); + this.Controls.Add(this.label3); + this.Controls.Add(this.serverPathTextbox); + this.Controls.Add(this.clearTypesButton); + this.Controls.Add(this.allTypesButton); + this.Controls.Add(this.label2); + this.Controls.Add(this.mappingSelectList); + this.Controls.Add(this.StartButton); + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.Name = "DumperForm"; + this.Text = "Perpetuum Data Dumper"; + this.Load += new System.EventHandler(this.Form1_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Button StartButton; + private System.Windows.Forms.CheckedListBox mappingSelectList; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Button allTypesButton; + private System.Windows.Forms.Button clearTypesButton; + private System.Windows.Forms.TextBox serverPathTextbox; + private System.Windows.Forms.Label label3; + } +} + diff --git a/Perpetuum.DataDumper/DumperForm.cs b/Perpetuum.DataDumper/DumperForm.cs new file mode 100644 index 000000000..9222a5f62 --- /dev/null +++ b/Perpetuum.DataDumper/DumperForm.cs @@ -0,0 +1,133 @@ +using Autofac; +using NPOI.SS.Formula.Functions; +using NPOI.SS.UserModel; +using NPOI.XSSF.UserModel; +using Org.BouncyCastle.Asn1.X509; +using Perpetuum.DataDumper.Views; +using Perpetuum.EntityFramework; +using Perpetuum.Log; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.IO; +using System.Linq; +using System.Runtime.InteropServices; +using System.Security; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using static Perpetuum.DataDumper.DataDumper; + +namespace Perpetuum.DataDumper { + public partial class DumperForm : Form { + public DumperForm() { + InitializeComponent(); + } + + PerpetuumLightBootstrapper bootstrapper; + + private static List mappings = new List() { + // These universal ones are strange because they're stored in a different category + // even though in the game UI they're the same thing and they have basically the same stats + // Also the univeral one is a regular module while the others are Active + new DataExportMapping("ModuleArmorHardenerStats", typeof(ModuleArmorHardenerDataView), "cf_armor_hardeners"), + new DataExportMapping("ModuleShieldGeneratorStats", typeof(ModuleShieldGeneratorDataView), "cf_shield_generators"), + new DataExportMapping("ModuleERPStats", typeof(ModuleERPDataView), "cf_kers"), + new DataExportMapping("ModuleRemArmorRepairerStats", typeof(ModuleRemoteArmorRepairerDataView), "cf_remote_armor_repairers"), + new DataExportMapping("ModuleArmorPlateStats", typeof(ModuleArmorPlateDataView), "cf_armor_plates"), + new DataExportMapping("SparkStats", typeof(SparkDataView), ""), + new DataExportMapping("ModuleArmorRepairerStats", typeof(ModuleArmorRepairerDataView), "cf_armor_repair_systems"), + new DataExportMapping("AmmoWeaponStats", typeof(AmmoWeaponDataView), "cf_ammo"), + new DataExportMapping("WeaponStats", typeof(ModuleWeaponDataView), "cf_weapons") + }; + + private string serverRoot = @"C:\PerpetuumServer\data"; + + private void Form1_Load(object sender, EventArgs e) { + serverPathTextbox.Text = serverRoot; + + foreach (var item in mappings) { + mappingSelectList.Items.Add(item, true); + } + } + + + private void StartButton_Click(object sender, EventArgs e) { + var tableGroupings = mappingSelectList.CheckedItems.Cast().GroupBy(x => x.TableName).ToList(); + + if (!System.IO.Directory.Exists(serverRoot)) { + MessageBox.Show("Server path doesn't exist: " + serverRoot); + } + + bootstrapper = new PerpetuumLightBootstrapper(); + + bootstrapper.Init(serverRoot); + + bootstrapper.InitDumper(); + + IWorkbook workbook = new XSSFWorkbook(); + + ISheet definitionsSheet = workbook.CreateSheet("Definitions"); + + int currentDefinitionRow = 0; + var headerRow = definitionsSheet.CreateRow(currentDefinitionRow); + headerRow.CreateCell(0).SetCellValue("Type"); + headerRow.CreateCell(1).SetCellValue("Definition"); + currentDefinitionRow++; + + // We need to group by the Cargo Table because we may have multipler + // definitions writing into the same table. + + foreach (var tableGroup in tableGroupings) { + // Write the definition for the group + + // Use the first view for the definition since they should all be the same + var typeToWrite = tableGroup.First(); + + string currentDefinition = DataDumper.GenerateCargoDefinition(typeToWrite.ViewType, typeToWrite.TableName); + + var currentRow = definitionsSheet.CreateRow(currentDefinitionRow); + currentRow.CreateCell(0).SetCellValue(typeToWrite.TableName); + currentRow.CreateCell(1).SetCellValue(currentDefinition); + + currentDefinitionRow++; + + int currentDataRow = 0; + ISheet currentDataSheet = workbook.CreateSheet(typeToWrite.TableName); + + foreach (DataExportMapping item in tableGroup) { + dynamic currentData = bootstrapper.Dumper.DumpDataView(item); + + var currentRows = bootstrapper.Dumper.ComposeDataView(currentData, item.TableName); + + bootstrapper.Dumper.WriteDataView(currentRows, item.TableName, currentDataSheet, ref currentDataRow); + } + } + + string filePath = $"dataDump_{DateTime.Now.ToString("yy-MM-dd_hh-mm-ss")}.xlsx"; + + workbook.Write(new FileStream(filePath, FileMode.CreateNew)); + + MessageBox.Show($"File exported to:\n{filePath}"); + + } + + private void allTypesButton_Click(object sender, EventArgs e) { + for (int i = 0; i < mappings.Count; i++) { + mappingSelectList.SetItemChecked(i, true); + } + } + + private void clearTypesButton_Click(object sender, EventArgs e) { + for (int i = 0; i < mappings.Count; i++) { + mappingSelectList.SetItemChecked(i, false); + } + } + + private void serverPathTextbox_TextChanged(object sender, EventArgs e) { + serverRoot = serverPathTextbox.Text; + } + } +} diff --git a/Perpetuum.DataDumper/DumperForm.resx b/Perpetuum.DataDumper/DumperForm.resx new file mode 100644 index 000000000..19489cc19 --- /dev/null +++ b/Perpetuum.DataDumper/DumperForm.resx @@ -0,0 +1,197 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + + AAABAAEAICAAAAEAIACoEAAAFgAAACgAAAAgAAAAQAAAAAEAIAAAAAAAgBAAAAAAAAAAAAAAAAAAAAAA + AAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AFdBXQZXQV0wV0FdWldB + XX1XQV2NV0FdjldBXX1XQV1cV0FdMVdBXQj///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wBXQV43VT9bik86 + V8lHMk/sQi5K/UEtSf9BL0v/RzJP/U05Ve1UPlzLV0RfjlpEYTv///8B////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wBYQWFLUjxbyUgy + Uv87KUf/MiA//ywaOv8pGDj/KBY3/ykYOP8uHTv/MyE//zspR/9FME//UDlZ/1dAYM1aQ2NR////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wBaQGUNVz1hmkoy + Vv87JEn/MRtA/ykTPP8kDjj/Igs3/x8HNf8hCzb/Igw1/yUPN/8pFTr/Kxc9/zEbQP85I0f/RC5Q/1M6 + Xv9ZP2ShWkBlEP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8AXEBnJFQ6 + YNJBKVD/MxtD/ykRPf8lDTr/IQk5/x8FOP8fBTj/HwU4/yAHOP8jDDn/Khc+/2BWa/9RQl3/JRI7/ygT + Pf8vGUD/OiJK/0sxWf9aPmXXXEBnKf///wD///8A////AP///wD///8A////AP///wD///8A////AGJE + biJSNWHpPiRP/zAWRv8pDkH/JQs//yYLPv8kCD3/Igc+/yEFPv8jBz3/Iwg+/yUNP/9iTnf/9vL5/+DY + 5v82Ikv/Jg1A/ycNP/8rD0L/NRtK/0ktWf9aPmntXEBqJ////wD///8A////AP///wD///8A////AP// + /wFwVoANVTdn00AiVv8xFEv/Kw9G/ywPSf8oDkP/KA5D/ycLRv8lCEX/JAZE/yQGRP8lCUT/KA5F/5OG + n////////////083Zv8nDEX/JglF/yUIRf8pC0f/NRlP/0ssXv9dPm7YX0BwD////wD///8A////AP// + /wD///8B////AV08b5hFJVv/NBhO/y8RS/8vEUr/Nh1Q/7muxP/f1+f/Ujlp/ykMSP8oCEj/KAhH/ycJ + R/8pDEj/PSVV/7Cmu/+uo7j/MBNL/ykMSP8oCEj/JgRH/ycDR/8rCkr/OhpT/1EwZf9fPnGi////AP// + /wD///8A////AP///wFlQnhETyxm/zoaVv8yElH/MRRO/zMTUv9eR3H///////////+qnbb/LA5M/ysJ + Tf8qBk3/KwZO/ywJTv8uDU//Qyhd/6absf8vDk//LApO/ysGTv8oA0z/JwBM/ykDTf8xC1D/QR5b/1o3 + b/9jPnVL////AP///wD///8A1M3ZAlo4cMhCIF3/ORhV/4l5mf+zp77/i3yZ/7Wrvv/Oxdf/9vL5/3Vh + iP8xEVD/LgxP/ysJTv8rCU7/LApO/y4NUP81FlL/uK3C/zscVf8uDE//LQlP/yoGTf8qBE3/KgRN/ywH + Tv83E1X/Titl/2E+ddBkP3cC////AP///wBpR3wwTy1m/z0bWP9eSHT////////////Rydr/Rixf/zkb + Vv9hS3b/pZmw/zMTUv8wD1H/LwtQ/y0MT/8vC1D/Lw5P/zERUP+jl67/Vz9u/zAOUP8tDE//LQpO/ywH + Tv8rBk7/LAdO/zIOUf9CIF3/XDlx/2RBeDX///8AZ0J5BF4+c4NGJWD/ORdV/082Z//t6PL//////4Ry + lv87Hlf/Ox1X/zocVv+wprv/WkNw/zQVU/8yElL/MA9R/zAPUf8xEVD/MxNS/41/m/94ZYv/MhJS/zAP + Uf8wDVH/LgpP/y0JT/8tCU//MA1R/zwZWP9TMWr/Z0J5i2dCeQdpRHwnWDVuw0AgXP82F1X/OBdU/0Il + XP+AbpL/oJSs/z0fWv89H1r/PB9Z/3Fchf+onbP/ORtX/zcYVv82F1T/NhdU/zYXVP83GFX/cl2G/5mM + pv83GFX/NRZV/zMSUv8yEVL/MQ5R/zEOUf8zD1L/OhhX/0wrZf9kQXjLaUR8LmdEe1BPL2jnPR1Z/zUW + Vf83F1X/ORtY/zweWf+6r8P/Ykt4/z4iW/8/Ilv/PyJb/7arwP9YQW//PB5Z/zsdWP86HFf/OhxX/zsd + WP9YP2//rKC3/z4eWf86HFf/OBhW/zYXVP80FVT/NRNU/zQTU/85F1b/SCZi/2E+de1pR31aZUF5gEoq + ZP08G1n/NhdV/zcXVf85Glf/Ox1Z/2pVf/+sobf/QSRc/0EkXP9BJFz/pJiw//////+uobn/PR9a/z4h + W/8+IVv/QCNd/0ImXf+zqb3/Ujlp/z8iXP89H1r/OxxZ/zkaV/84Glb/NxdV/zsZWP9FJV//XDtz/WxI + fntiQHefSCdi/zsbWf83Flb/NxhW/zkbWP87HVn/QiNd/+Lc6P/p4+//lomj/6GVrf/18fj///////// + //+lmbD/lYii/3xoj/9iS3j/nI+n///////28vn/dWGJ/0IlXf8/I1v/PR9a/zsdWP87HFn/OxxZ/0Ym + Yf9aOXH/bUuBh2RAeJ1JKGP/PBxa/zgXVv85Glf/OhxZ/zwdWf9HK2L/+vj8//////+ekqr/aVF//4h4 + l//j3Or/npGr/2RNev+FdJb/pZqx/7aswP/////////////////u6PP/eWWM/11Fc/9+apH/y8LT/2tW + gP8+IVv/Rydi/1s6cv9wTIKHZkR7fU0tZ/w/Hlv/OhlY/zsbWf87HVn/PR5a/z4hW/9iSnj/d2KL/0Il + Xv9DJl7/QyZe/0EkXf9CJV7/QiVe/0MmXv9FKWD/Riph/9nS4f///////////9TK3f+ila//rKC3//Pv + 9///////zMTV/0EjXv9MLGX/Xz11/HBNhHpsSoBNVDNs5UMjX/89HVr/PR1a/z0eWv8/H1z/PyBc/0Ai + Xf9BI17/QSRe/0EkXv9BJF7/QSNe/0AjXf9BI17/RCVe/0UpYP9HK2P/Zk98/9/Y5f+pnLX/Si5k/0gs + ZP9IKmL/mYyn/+Td6f+Hd5f/RCdg/1Awaf9lQ3rrdFCFV3FPhSNePXS/Sitl/0EiXv8/H1z/QCBd/z8i + Xf9AI17/QiNf/0IjX/9CJF7/QiNf/0IjX/9CI1//QiNf/0IkXv9DJl//Ripi/0gsZP+Qgp//kYOf/0kt + Y/9JLWT/SStj/0crY/9HKWH/Ryti/0UnYf9IKWX/WDhv/21Mgsd3U4gsdFGHA2hHfXxRMWr/RSZh/0Ei + Xv9CI1//QiNf/0IjX/9CI1//QiNf/0IjX/9CI1//QiNf/0IjX/9CI1//QiVf/0UmYf9GKWL/SCtk/7+0 + yP9kTHr/SCxk/0crY/9GKmP/RSlh/0QnYf9EJ2H/Rili/00vZ/9fPnX/dVGGhnRRhwX///8AcU+FKFo6 + cv5KK2X/RCVg/0MkX/9DJF//QyRf/0MkX/9DJF//QyRf/0MkX/9DJF//QyRf/0QlYP9EJ2H/Rili/0gr + ZP9pUYD/vLHF/0ktZP9IK2T/Ryhj/0YnYv9GJ2L/RCdh/0UpYv9JK2X/VDZt/2pJf/94Vosw////AP// + /wD///8AZUR7wFEya/9IKGP/RSZh/0UmYf9FJmH/RSZh/0UmYf9FJmH/RSZh/0UmYf9GJ2L/RSli/0gq + ZP9JLWT/Si5m/6eas/+OgJ3/Si1m/0krZf9IKmT/Ridi/0YnYv9GJ2L/Ryhj/04vaP9dPnX/c1GGyXdU + igH///8A////AP///wBzUYY6XD10/E4vaP9IKmT/Ryhj/0coY/9HKGP/Ryhj/0coY/9HKGP/Ryhj/0gq + ZP9JLGX/Si5m/0wwaP9SN23/yMDQ/15Fdv9ML2f/Si1m/0krZf9IKmT/Ryhj/0gqZP9MLWf/VTdv/2pK + gP54VotC////AP///wD///8A////AP///wBsS4GLWTlx/00vaP9JK2X/SCpk/0gqZP9IKmT/SCpk/0gq + ZP9JK2X/SCxl/0suZv9OMWn/TzJp/3Zhiv+zp77/TzJp/00waP9LLWf/SCxl/0gqZP9JK2X/Sy1n/1M0 + bf9jQnr/dlSJlP///wD///8A////AP///wD///8A////AHhWiwdoSH7HVjhw/08waf9LLWf/Sixm/0os + Zv9KLGb/Sixm/0stZ/9MLmj/TTBo/1A1a/+nmbP//Pv+/6qdt/9RNWv/TzJq/00vaP9LLWf/Sy1n/00u + aP9TNG3/YEF4/3RSh856WI0K////AP///wD///8A////AP///wD///8A////AHlWjBdoSH7eWTtz/1Ey + a/9NL2j/TC5o/0wuaP9MLmj/TS9o/04waf9PM2v/VDpu//r4/P//////7Obx/1I3bf9QNWv/TjFp/04w + af9PMWr/VTdv/2FBef9zUYfkfFmOHP///wD///8A////AP///wD///8A////AP///wD///8A////AHlX + jBlrSoHEXD51/1Q1bv9QMWr/TjBp/00vaP9OMGn/TzFq/1Aza/9RNmz/npCs/+Xe7P+Of53/UjZt/1E0 + bP9RM2z/UzRt/1k7c/9lRHz/dVOJyn1ajx7///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AHxajwZxUIeJZUV8/Vo8c/9WOHD/UzRt/1I0bf9QNGz/UzVu/1M4b/9fRXf/d2OL/1k/ + c/9WOXH/Vjlx/1k7c/9gQnn/bEyC/3pYjY5+W5EI////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wB6WI07b0+FumZHff1eQHf/Wjxz/1g6cv9WOXH/Vjlx/1c7 + cf9aPHL/Wz91/2BBd/9lRnv/bEyC/nZUir59W5BA////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8AfFqPKHVUiXhtTYO5aEl/4GRE + e/liQnr/Y0R6/2dIffpsTYLidFOJvXpYjnuBX5Qq////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AIBd + kiJ8WpBKelmOc3lYjZV6WI2XfFqPdYBfkkyDYpUl////Af///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + + + \ No newline at end of file diff --git a/Perpetuum.DataDumper/EnumHelper.cs b/Perpetuum.DataDumper/EnumHelper.cs new file mode 100644 index 000000000..e3e33db94 --- /dev/null +++ b/Perpetuum.DataDumper/EnumHelper.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Perpetuum.DataDumper { + public static class EnumHelper + where T : struct { + // ReSharper disable StaticFieldInGenericType + private static readonly Enum[] Values; + // ReSharper restore StaticFieldInGenericType + private static readonly T DefaultValue; + + static EnumHelper() { + var type = typeof(T); + if (type.IsSubclassOf(typeof(Enum)) == false) { + throw new ArgumentException(); + } + Values = Enum.GetValues(type).Cast().ToArray(); + DefaultValue = default(T); + } + + public static T[] MaskToList(Enum mask, bool ignoreDefault = true) { + var q = Values.Where(mask.HasFlag); + if (ignoreDefault) { + q = q.Where(v => !v.Equals(DefaultValue)); + } + return q.Cast().ToArray(); + } + } +} diff --git a/Perpetuum.DataDumper/ExtensionMethods.cs b/Perpetuum.DataDumper/ExtensionMethods.cs new file mode 100644 index 000000000..88cd81094 --- /dev/null +++ b/Perpetuum.DataDumper/ExtensionMethods.cs @@ -0,0 +1,35 @@ +using Perpetuum.EntityFramework; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Perpetuum.DataDumper +{ + public static class ExtensionMethods + { + public static string GameTierString(this EntityDefault info) + { + string levelText = $"T{info.Tier.level}"; + + if (info.Tier.type == ExportedTypes.TierType.Prototype) { + levelText += "P"; + } else if (info.Tier.type == ExportedTypes.TierType.Special) { + // We nede to read from options to differentiate special + string optionTier = info.Options.GetOption("tier"); + optionTier = optionTier.Replace("level_", ""); + + if (optionTier.Contains("a")) { + levelText += "-"; + } else if (optionTier.Contains("+")) { + levelText += "+"; + } else if (info.Tier.level == 0) { + levelText = "S"; + } + } + + return levelText; + } + } +} diff --git a/Perpetuum.DataDumper/Factory/DataDumper.AmmoWeapon.cs b/Perpetuum.DataDumper/Factory/DataDumper.AmmoWeapon.cs new file mode 100644 index 000000000..fd220c3c8 --- /dev/null +++ b/Perpetuum.DataDumper/Factory/DataDumper.AmmoWeapon.cs @@ -0,0 +1,53 @@ +using Perpetuum.DataDumper.Views; +using Perpetuum.ExportedTypes; +using Perpetuum.Items.Ammos; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using static Perpetuum.DataDumper.DataDumper; + +namespace Perpetuum.DataDumper { + public partial class DataDumper { + public AmmoWeaponDataView NewAmmoWeaponDataView(Ammo item) { + var newView = new AmmoWeaponDataView(); + InitItemView(newView, item); + + var dictionaryData = item.ToDictionary(); + + newView.damage_chemical = item.GetBasePropertyModifier(AggregateField.damage_chemical).Value; + newView.damage_kinetic = item.GetBasePropertyModifier(AggregateField.damage_kinetic).Value; + newView.damage_seismic = item.GetBasePropertyModifier(AggregateField.damage_explosive).Value; + newView.damage_thermal = item.GetBasePropertyModifier(AggregateField.damage_thermal).Value; + newView.damage_toxic = item.GetBasePropertyModifier(AggregateField.damage_toxic).Value; + + newView.modifier_falloff = (item.GetBasePropertyModifier(AggregateField.falloff).Value * 10).ToString(); + newView.explosion_radius = item.GetBasePropertyModifier(AggregateField.explosion_radius).Value; + + // Empty out the 0's + if (newView.damage_chemical == 0) { newView.damage_chemical = null; }; + if (newView.damage_kinetic == 0) { newView.damage_kinetic = null; }; + if (newView.damage_seismic == 0) { newView.damage_seismic = null; }; + if (newView.damage_thermal == 0) { newView.damage_thermal = null; }; + if (newView.damage_toxic == 0) { newView.damage_toxic = null; }; + + if (newView.modifier_falloff == "0") { newView.modifier_falloff = null; }; // keeping this as a string for now because other modules may use it as a modifier? + if (newView.explosion_radius == 0) { newView.explosion_radius = null; }; + + // This will get the property even if it doesn't explicitly exist + // It will be set to the default value, but the HasValue will tell + // us if it's something other than the default + + newView.modifier_range = GetModifierString(item.GetBasePropertyModifier(AggregateField.optimal_range_modifier)); + + var rangeProp = item.GetBasePropertyModifier(AggregateField.optimal_range); + + if (rangeProp.HasValue) { + newView.optimal_range = rangeProp.Value * 10; + } + + return newView; + } + } +} \ No newline at end of file diff --git a/Perpetuum.DataDumper/Factory/DataDumper.ModuleArmorHardener.cs b/Perpetuum.DataDumper/Factory/DataDumper.ModuleArmorHardener.cs new file mode 100644 index 000000000..2e16d43f2 --- /dev/null +++ b/Perpetuum.DataDumper/Factory/DataDumper.ModuleArmorHardener.cs @@ -0,0 +1,61 @@ +using Perpetuum.DataDumper.Views; +using Perpetuum.ExportedTypes; +using Perpetuum.Items.Ammos; +using Perpetuum.Modules; +using Perpetuum.Modules.Weapons; +using Perpetuum.Services.ExtensionService; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using static Perpetuum.DataDumper.DataDumper; + +namespace Perpetuum.DataDumper { + public partial class DataDumper { + private void FillModuleData(ModuleArmorHardenerDataView view, Module module) { + view.module_resist_active_chemical = module.GetBasePropertyModifier(AggregateField.effect_resist_chemical).Value; + view.module_resist_passive_chemical = module.GetBasePropertyModifier(AggregateField.resist_chemical).Value; + view.module_resist_active_kinetic = module.GetBasePropertyModifier(AggregateField.effect_resist_kinetic).Value; + view.module_resist_passive_kinetic = module.GetBasePropertyModifier(AggregateField.resist_kinetic).Value; + view.module_resist_active_seismic = module.GetBasePropertyModifier(AggregateField.effect_resist_explosive).Value; + view.module_resist_passive_seismic = module.GetBasePropertyModifier(AggregateField.resist_explosive).Value; + view.module_resist_active_thermal = module.GetBasePropertyModifier(AggregateField.effect_resist_thermal).Value; + view.module_resist_passive_thermal = module.GetBasePropertyModifier(AggregateField.resist_thermal).Value; + + var passives = new List> { + new Tuple(view.module_resist_passive_chemical,view.module_resist_active_chemical, "Chemical"), + new Tuple(view.module_resist_passive_kinetic, view.module_resist_active_kinetic, "Kinetic"), + new Tuple(view.module_resist_passive_seismic, view.module_resist_active_seismic, "Seismic"), + new Tuple(view.module_resist_passive_thermal, view.module_resist_active_thermal, "Thermal") + }; + + if (passives.Where(x => x.Item1 != 0).Count() > 1) { + view.module_resist_type = "All"; + view.module_resist_passive = module.GetBasePropertyModifier(AggregateField.resist_chemical).Value; + } else { + var activeType = passives.Where(x => x.Item1 != 0).Single(); + view.module_resist_type = activeType.Item3; + view.module_resist_passive = activeType.Item1; + view.module_resist_active = activeType.Item2; + } + } + public ModuleArmorHardenerDataView NewModuleArmorHardenerDataView(ActiveModule module) { + var newView = new ModuleArmorHardenerDataView(); + InitActiveModuleView(newView, module); + + FillModuleData(newView, module); + + return newView; + } + + public ModuleArmorHardenerDataView NewModuleArmorHardenerDataView(Module module) { + var newView = new ModuleArmorHardenerDataView(); + InitModuleView(newView, module); + + FillModuleData(newView, module); + + return newView; + } + } +} \ No newline at end of file diff --git a/Perpetuum.DataDumper/Factory/DataDumper.ModuleArmorPlate.cs b/Perpetuum.DataDumper/Factory/DataDumper.ModuleArmorPlate.cs new file mode 100644 index 000000000..dbca6d5e3 --- /dev/null +++ b/Perpetuum.DataDumper/Factory/DataDumper.ModuleArmorPlate.cs @@ -0,0 +1,28 @@ +using Perpetuum.DataDumper.Views; +using Perpetuum.ExportedTypes; +using Perpetuum.Items.Ammos; +using Perpetuum.Modules; +using Perpetuum.Modules.Weapons; +using Perpetuum.Services.ExtensionService; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using static Perpetuum.DataDumper.DataDumper; + +namespace Perpetuum.DataDumper { + public partial class DataDumper { + public ModuleArmorPlateDataView NewModuleArmorPlateDataView(Module module) { + var newView = new ModuleArmorPlateDataView(); + InitModuleView(newView, module); + + newView.module_hp = module.GetBasePropertyModifier(AggregateField.armor_max).Value; + newView.module_demob_resist = module.GetBasePropertyModifier(AggregateField.massiveness).Value * 100; + newView.module_surface_hit = module.GetBasePropertyModifier(AggregateField.signature_radius).Value; + // module.GetBasePropertyModifier(AggregateField.heal) + + return newView; + } + } +} \ No newline at end of file diff --git a/Perpetuum.DataDumper/Factory/DataDumper.ModuleArmorRepair.cs b/Perpetuum.DataDumper/Factory/DataDumper.ModuleArmorRepair.cs new file mode 100644 index 000000000..863b57f25 --- /dev/null +++ b/Perpetuum.DataDumper/Factory/DataDumper.ModuleArmorRepair.cs @@ -0,0 +1,37 @@ +using Perpetuum.DataDumper.Views; +using Perpetuum.ExportedTypes; +using Perpetuum.Items.Ammos; +using Perpetuum.Modules; +using Perpetuum.Modules.Weapons; +using Perpetuum.Services.ExtensionService; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using static Perpetuum.DataDumper.DataDumper; + +namespace Perpetuum.DataDumper { + public partial class DataDumper { + public ModuleArmorRepairerDataView NewModuleArmorRepairDataView(ArmorRepairModule module) { + var newView = new ModuleArmorRepairerDataView(); + InitItemView(newView, module); + + var dictionaryData = module.ToDictionary(); + + // Now we are ready to map up the data + newView.module_tier = module.ED.GameTierString(); + newView.cpu = module.CpuUsage; + newView.reactor = module.PowerGridUsage; + newView.module_accumulator = module.CoreUsage; + newView.module_cycle = module.CycleTime.TotalSeconds; + newView.module_repair_amount = module.GetBasePropertyModifier(AggregateField.armor_repair_amount).Value; + + foreach (var extension in module.ED.EnablerExtensions.Keys) { + newView.module_extensions_required += GetLocalizedName(extensionReader.GetExtensionName(extension.id)) + "(" + extension.level + ");"; + } + + return newView; + } + } +} \ No newline at end of file diff --git a/Perpetuum.DataDumper/Factory/DataDumper.ModuleERP.cs b/Perpetuum.DataDumper/Factory/DataDumper.ModuleERP.cs new file mode 100644 index 000000000..6cdd30c38 --- /dev/null +++ b/Perpetuum.DataDumper/Factory/DataDumper.ModuleERP.cs @@ -0,0 +1,29 @@ +using Perpetuum.DataDumper.Views; +using Perpetuum.ExportedTypes; +using Perpetuum.Items.Ammos; +using Perpetuum.Modules; +using Perpetuum.Modules.Weapons; +using Perpetuum.Services.ExtensionService; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using static Perpetuum.DataDumper.DataDumper; + +namespace Perpetuum.DataDumper { + public partial class DataDumper { + public ModuleERPDataView NewModuleERPDataView(Module module) { + var newView = new ModuleERPDataView(); + InitModuleView(newView, module); + + newView.module_recovery_chemical = module.GetBasePropertyModifier(AggregateField.chemical_damage_to_core_modifier).Value * 100; + newView.module_recovery_kinetic = module.GetBasePropertyModifier(AggregateField.kinetic_damage_to_core_modifier).Value * 100; + newView.module_recovery_seismic = module.GetBasePropertyModifier(AggregateField.explosive_damage_to_core_modifier).Value * 100; + newView.module_recovery_thermal = module.GetBasePropertyModifier(AggregateField.thermal_damage_to_core_modifier).Value * 100; + // module.GetBasePropertyModifier(AggregateField.heal) + + return newView; + } + } +} \ No newline at end of file diff --git a/Perpetuum.DataDumper/Factory/DataDumper.ModuleRemoteArmorRepair.cs b/Perpetuum.DataDumper/Factory/DataDumper.ModuleRemoteArmorRepair.cs new file mode 100644 index 000000000..07dd61367 --- /dev/null +++ b/Perpetuum.DataDumper/Factory/DataDumper.ModuleRemoteArmorRepair.cs @@ -0,0 +1,27 @@ +using Perpetuum.DataDumper.Views; +using Perpetuum.ExportedTypes; +using Perpetuum.Items.Ammos; +using Perpetuum.Modules; +using Perpetuum.Modules.Weapons; +using Perpetuum.Services.ExtensionService; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using static Perpetuum.DataDumper.DataDumper; + +namespace Perpetuum.DataDumper { + public partial class DataDumper { + public ModuleRemoteArmorRepairerDataView NewModuleRemoteArmorRepairerDataView(ActiveModule module) { + var newView = new ModuleRemoteArmorRepairerDataView(); + InitActiveModuleView(newView, module); + + newView.module_optimal_range = module.GetBasePropertyModifier(AggregateField.optimal_range).Value * 10; + newView.module_repair_amount = module.GetBasePropertyModifier(AggregateField.armor_repair_amount).Value; + // module.GetBasePropertyModifier(AggregateField.heal) + + return newView; + } + } +} \ No newline at end of file diff --git a/Perpetuum.DataDumper/Factory/DataDumper.ModuleShieldGenerator.cs b/Perpetuum.DataDumper/Factory/DataDumper.ModuleShieldGenerator.cs new file mode 100644 index 000000000..5c1bef45b --- /dev/null +++ b/Perpetuum.DataDumper/Factory/DataDumper.ModuleShieldGenerator.cs @@ -0,0 +1,26 @@ +using Perpetuum.DataDumper.Views; +using Perpetuum.ExportedTypes; +using Perpetuum.Items.Ammos; +using Perpetuum.Modules; +using Perpetuum.Modules.Weapons; +using Perpetuum.Services.ExtensionService; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using static Perpetuum.DataDumper.DataDumper; + +namespace Perpetuum.DataDumper { + public partial class DataDumper { + public ModuleShieldGeneratorDataView NewModuleShieldGeneratorDataView(ActiveModule module) { + var newView = new ModuleShieldGeneratorDataView(); + InitActiveModuleView(newView, module); + + newView.module_shield_radius = module.GetBasePropertyModifier(AggregateField.shield_radius).Value; + newView.module_absorption_ratio = Math.Round(1 / module.GetBasePropertyModifier(AggregateField.shield_absorbtion).Value, 3); + + return newView; + } + } +} \ No newline at end of file diff --git a/Perpetuum.DataDumper/Factory/DataDumper.ModuleWeapon.cs b/Perpetuum.DataDumper/Factory/DataDumper.ModuleWeapon.cs new file mode 100644 index 000000000..114da8885 --- /dev/null +++ b/Perpetuum.DataDumper/Factory/DataDumper.ModuleWeapon.cs @@ -0,0 +1,59 @@ +using Perpetuum.DataDumper.Views; +using Perpetuum.ExportedTypes; +using Perpetuum.Items.Ammos; +using Perpetuum.Modules.Weapons; +using Perpetuum.Services.ExtensionService; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using static Perpetuum.DataDumper.DataDumper; + +namespace Perpetuum.DataDumper { + public partial class DataDumper { + public ModuleWeaponDataView NewWeaponModuleDataView(WeaponModule module) { + var newView = new ModuleWeaponDataView(); + InitItemView(newView, module); + + var dictionaryData = module.ToDictionary(); + + dictionaryData["ammoCategoryFlags"] = (CategoryFlags)dictionaryData["ammoCategoryFlags"]; + + // Now we are ready to map up the data + newView.cpu = module.CpuUsage; + newView.reactor = module.PowerGridUsage; + newView.ammo_type = GetLocalizedName(((CategoryFlags)dictionaryData["ammoCategoryFlags"]).ToString()).Replace(";undefined", ""); + newView.slot_status = module.ED.AttributeFlags.ActiveModule ? "Active" : "Passive"; + newView.slot_flags = module.ModuleFlag.ToString(); + newView.ammo_capacity = module.AmmoCapacity; + newView.module_tier = module.ED.GameTierString(); + + newView.module_accumulator = module.CoreUsage; + newView.module_cycle = module.CycleTime.TotalSeconds; + newView.module_damage = module.DamageModifier.Value * 100; + newView.module_falloff = module.Properties.Single(x => x.Field == AggregateField.falloff).Value * 10; + newView.module_hit_dispersion = module.Accuracy.Value; + newView.module_optimal_range = module.OptimalRange * 10; + + var rangeModifierProperty = module.GetBasePropertyModifier(AggregateField.module_missile_range_modifier); + + if (rangeModifierProperty.HasValue) { + string directionSymbol = "+"; + + if (rangeModifierProperty.Value < 0) { + directionSymbol = "-"; + } + + newView.missile_optimal_range = directionSymbol + (rangeModifierProperty.Value - 1) * 100 + "%"; + + } + + foreach (var extension in module.ED.EnablerExtensions.Keys) { + newView.module_extensions_required += GetLocalizedName(extensionReader.GetExtensionName(extension.id)) + "(" + extension.level + ");"; + } + + return newView; + } + } +} \ No newline at end of file diff --git a/Perpetuum.DataDumper/Factory/DataDumper.Resolver.cs b/Perpetuum.DataDumper/Factory/DataDumper.Resolver.cs new file mode 100644 index 000000000..dfc010ac2 --- /dev/null +++ b/Perpetuum.DataDumper/Factory/DataDumper.Resolver.cs @@ -0,0 +1,94 @@ +using Open.Nat; +using Perpetuum.DataDumper.Views; +using Perpetuum.EntityFramework; +using Perpetuum.Items.Ammos; +using Perpetuum.Modules; +using Perpetuum.Modules.Weapons; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Perpetuum.DataDumper { + public partial class DataDumper { + public dynamic DumpDataView(DataExportMapping mapping) { + Type[] typeArgs = new Type[] { typeof(string) }; + var reflectedMethod = typeof(DataDumper).GetMethod("DumpDataView", typeArgs); + var genericMethod = reflectedMethod.MakeGenericMethod(mapping.ViewType); + dynamic results = genericMethod.Invoke(this, new object[] { mapping.Category }); + + // No need, just use dynamic + //var listType = typeof(List<>).MakeGenericType(mapping.ViewType); + + //var typedResults = Convert.ChangeType(results, listType); + return results; + } + + public List DumpDataView(string categoryName) where T : EntityDataView { + var returnItems = new List(); + + // Handle sparks first, refactor later + if (typeof(T) == typeof(SparkDataView)) { + var sparkData = sparkRepository.GetAll(); + + foreach (var spark in sparkData) { + try { + var currentView = NewSparkDataView(spark); + + returnItems.Add(currentView as T); + } catch (Exception ex) { + Console.WriteLine(ex.Message); + } + } + + return returnItems; + + } + + var categoryData = GetDataByItemCategoryName(categoryName); + + foreach (var categoryItem in categoryData) { + T currentView; + + string itemName = categoryItem["definitionname"].ToString(); + int itemId = (int)categoryItem["definition"]; + + try { + object currentObject = entityFactory.CreateForData(itemName, EntityIDGenerator.Random); + + + if (typeof(T) == typeof(ModuleWeaponDataView)) { + currentView = NewWeaponModuleDataView(currentObject as WeaponModule) as T; + } else if (typeof(T) == typeof(AmmoWeaponDataView)) { + currentView = NewAmmoWeaponDataView(currentObject as Ammo) as T; + } else if (typeof(T) == typeof(ModuleArmorRepairerDataView)) { + currentView = NewModuleArmorRepairDataView(currentObject as ArmorRepairModule) as T; + } else if (typeof(T) == typeof(ModuleArmorPlateDataView)) { + currentView = NewModuleArmorPlateDataView(currentObject as Module) as T; + } else if (typeof(T) == typeof(ModuleRemoteArmorRepairerDataView)) { + currentView = NewModuleRemoteArmorRepairerDataView(currentObject as ActiveModule) as T; + } else if (typeof(T) == typeof(ModuleERPDataView)) { + currentView = NewModuleERPDataView(currentObject as Module) as T; + } else if (typeof(T) == typeof(ModuleShieldGeneratorDataView)) { + currentView = NewModuleShieldGeneratorDataView(currentObject as ActiveModule) as T; + } else if (typeof(T) == typeof(ModuleArmorHardenerDataView)) { + if (currentObject.GetType() == typeof(Perpetuum.Modules.EffectModules.ArmorHardenerModule)) { + currentView = NewModuleArmorHardenerDataView(currentObject as ActiveModule) as T; + } else { + currentView = NewModuleArmorHardenerDataView(currentObject as Module) as T; + } + } else { + continue; + } + + returnItems.Add(currentView); + } catch (Exception ex) { + Console.WriteLine(ex.Message); + } + + } + return returnItems; + } + } +} diff --git a/Perpetuum.DataDumper/Factory/DataDumper.Spark.cs b/Perpetuum.DataDumper/Factory/DataDumper.Spark.cs new file mode 100644 index 000000000..da0df85e8 --- /dev/null +++ b/Perpetuum.DataDumper/Factory/DataDumper.Spark.cs @@ -0,0 +1,90 @@ +using Perpetuum.DataDumper.Views; +using Perpetuum.ExportedTypes; +using Perpetuum.Groups.Alliances; +using Perpetuum.Items.Ammos; +using Perpetuum.Services.ExtensionService; +using Perpetuum.Services.Sparks; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using static Perpetuum.DataDumper.DataDumper; + +namespace Perpetuum.DataDumper { + public partial class DataDumper { + private string SparkBonusString(string extensionName, int value) { + var formulaStrings = new List { "{%BONUS100%}", "{%BONUS%}" }; + + // First check if the localized name exists + var localName = GetLocalizedName(extensionName); + + if (localName == extensionName) { + // This means the desc wasn't found + localName = GetLocalizedName(extensionName + "_desc"); + + foreach (var formula in formulaStrings) { + localName = localName.Replace(formula, value.ToString()); + } + + } + + return localName; + } + + public SparkDataView NewSparkDataView(Spark spark) { + var view = new SparkDataView(); + + view.item_name = GetLocalizedName(spark.sparkName); + view.item_key = spark.sparkName; + // view.item_categories + view.price_equip = spark.changePrice; + view.price_purchase = spark.unlockPrice; + view.required_standing = spark.standingLimit * 100; + view.sequence = spark.displayOrder; + view.icon = spark.icon; + view.energy_prop = spark.energyCredit.ToString(); + + if (spark.allianceEid.HasValue) { + // For some reason the Alliance object doesn't pull over the name + // so we need to pull it as an eneity + // var currentAlliance = Alliance.Repository.Load(spark.allianceEid); + + // Trying as an entity doesn't work either + // var currentAlliance = entityServices.Repository.Load(.Value); + + + var allianceData = AllianceHelper.GetAllianceInfo(); + + foreach (var allianceInfo in allianceData) { + var childDict = (Dictionary) allianceInfo.Value; + long allianceEid = (long) childDict["allianceEID"]; + string allianceName = (string) childDict["name"]; + + if (allianceEid == spark.allianceEid) { + view.alliance = GetLocalizedName(allianceName); + break; + } + } + } + + var extensions = new Dictionary(); + var extensionStrings = new List(); + + foreach (Extension extension in spark.RelatedExtensions) { + var extensionInfo = extensionReader.GetExtensionByID(extension.id); + + extensions.Add(extensionInfo.name, extension.level); + + string localName = SparkBonusString(extensionInfo.name, extension.level); + + extensionStrings.Add(localName); + + } + + view.extensions = String.Join(";", extensionStrings); + + return view; + } + } +} \ No newline at end of file diff --git a/Perpetuum.DataDumper/Perpetuum.DataDumper.csproj b/Perpetuum.DataDumper/Perpetuum.DataDumper.csproj new file mode 100644 index 000000000..4862954dd --- /dev/null +++ b/Perpetuum.DataDumper/Perpetuum.DataDumper.csproj @@ -0,0 +1,170 @@ + + + + + Debug + AnyCPU + {55911748-316C-43CA-B703-47DBF77AC171} + WinExe + Perpetuum.DataDumper + Perpetuum.DataDumper + v4.6.1 + 512 + false + true + + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + x64 + bin\x64\Debug\ + TRACE;DEBUG + + + x64 + bin\x64\Release\ + + + + ..\packages\Autofac.4.6.1\lib\net45\Autofac.dll + + + ..\packages\Portable.BouncyCastle.1.8.6\lib\net40\BouncyCastle.Crypto.dll + + + ..\packages\SharpZipLib.1.2.0\lib\net45\ICSharpCode.SharpZipLib.dll + + + ..\packages\Newtonsoft.Json.10.0.3\lib\net45\Newtonsoft.Json.dll + + + ..\packages\NPOI.2.5.1\lib\net45\NPOI.dll + + + ..\packages\NPOI.2.5.1\lib\net45\NPOI.OOXML.dll + + + ..\packages\NPOI.2.5.1\lib\net45\NPOI.OpenXml4Net.dll + + + ..\packages\NPOI.2.5.1\lib\net45\NPOI.OpenXmlFormats.dll + + + ..\packages\Open.NAT.2.1.0.0\lib\net45\Open.Nat.dll + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Form + + + DumperForm.cs + + + + + + + + + + + + + + + + + DumperForm.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + True + + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + + + + + {e113962c-ad5d-4f17-8d08-656221cbd2d4} + Perpetuum.Bootstrapper + + + {e322bf83-76b8-4395-9ff2-26df13f6816c} + Perpetuum.ExportedTypes + + + {F69F19CA-DF42-420E-BC21-2ADD28C50A0C} + Perpetuum.RequestHandlers + + + {8587a597-848e-497f-8036-3b6f8047ec45} + Perpetuum + + + + \ No newline at end of file diff --git a/Perpetuum.DataDumper/PerpetuumLightServer.cs b/Perpetuum.DataDumper/PerpetuumLightServer.cs new file mode 100644 index 000000000..2429e4486 --- /dev/null +++ b/Perpetuum.DataDumper/PerpetuumLightServer.cs @@ -0,0 +1,27 @@ +using Autofac; +using Perpetuum.Bootstrapper; +using Perpetuum.Data; +using Perpetuum.EntityFramework; +using Perpetuum.Items; +using Perpetuum.Modules; +using Perpetuum.Robots; +using Perpetuum.Services.ExtensionService; +using System; +using System.Collections.Generic; +using System.Data; +using System.Linq; + +namespace Perpetuum.DataDumper { + + public class PerpetuumLightBootstrapper : PerpetuumBootstrapper { + // public void Init(string gameRoot) + + public DataDumper Dumper; + + public void InitDumper() + { + Dumper = new DataDumper(GetContainer()); + } + + } +} diff --git a/Perpetuum.DataDumper/Program.cs b/Perpetuum.DataDumper/Program.cs new file mode 100644 index 000000000..b465af53f --- /dev/null +++ b/Perpetuum.DataDumper/Program.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace Perpetuum.DataDumper { + static class Program { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() { + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new DumperForm()); + } + } +} diff --git a/Perpetuum.DataDumper/Properties/AssemblyInfo.cs b/Perpetuum.DataDumper/Properties/AssemblyInfo.cs new file mode 100644 index 000000000..c58b2bd54 --- /dev/null +++ b/Perpetuum.DataDumper/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Perpetuum.DataDumper")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Perpetuum.DataDumper")] +[assembly: AssemblyCopyright("Copyright © 2020")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("55911748-316c-43ca-b703-47dbf77ac171")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Perpetuum.DataDumper/Properties/Resources.Designer.cs b/Perpetuum.DataDumper/Properties/Resources.Designer.cs new file mode 100644 index 000000000..cf0defedc --- /dev/null +++ b/Perpetuum.DataDumper/Properties/Resources.Designer.cs @@ -0,0 +1,63 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Perpetuum.DataDumper.Properties { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Perpetuum.DataDumper.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + } +} diff --git a/Perpetuum.DataDumper/Properties/Resources.resx b/Perpetuum.DataDumper/Properties/Resources.resx new file mode 100644 index 000000000..af7dbebba --- /dev/null +++ b/Perpetuum.DataDumper/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Perpetuum.DataDumper/Properties/Settings.Designer.cs b/Perpetuum.DataDumper/Properties/Settings.Designer.cs new file mode 100644 index 000000000..51490fe7b --- /dev/null +++ b/Perpetuum.DataDumper/Properties/Settings.Designer.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Perpetuum.DataDumper.Properties { + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "16.6.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default { + get { + return defaultInstance; + } + } + } +} diff --git a/Perpetuum.DataDumper/Properties/Settings.settings b/Perpetuum.DataDumper/Properties/Settings.settings new file mode 100644 index 000000000..39645652a --- /dev/null +++ b/Perpetuum.DataDumper/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Perpetuum.DataDumper/RobotDataView.cs b/Perpetuum.DataDumper/RobotDataView.cs new file mode 100644 index 000000000..b9b4527ea --- /dev/null +++ b/Perpetuum.DataDumper/RobotDataView.cs @@ -0,0 +1,77 @@ +using Perpetuum.ExportedTypes; +using Perpetuum.Robots; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Perpetuum.DataDumper { + class RobotDataView { + // Main Status + public double Speed { get; set; } + public double Armor { get; set; } + public double Accumulator { get; set; } + public double Cargo { get; set; } + public double Cpu { get; set; } + public double Reactor { get; set; } + public double SlopeCapacity { get; set; } + + // Slots + public int SlotsHead { get; set; } + public int SlotsLeg { get; set; } + public int SlotsChassis { get; set; } + public int SlotsGuns { get; set; } + public int SlotsMissiles { get; set; } + public int SlotsIndustrial { get; set; } + public int SlotsMisc { get; set; } + + // Defense + public double SurfaceSize { get; set; } + public double ResistanceChem { get; set; } + public double ResistanceKinetic { get; set; } + public double ResistanceSeismic { get; set; } + public decimal ResistanceThermal { get; set; } + public decimal ResistanceDemobilizer { get; set; } + + // Targeting + public decimal SensorStrength { get; set; } + public decimal LockingRange { get; set; } + public decimal LockingTime { get; set; } + public decimal MaxLockedTargets { get; set; } + public decimal SignalDetection { get; set; } + public decimal SignalMasking { get; set; } + + // Misc + public decimal AccumulatorRecharge { get; set; } + public decimal AccumulatorStability { get; set; } + public decimal InterferenceEmission { get; set; } + public decimal InterferenceRadius { get; set; } + public decimal InterferenceMin { get; set; } + public decimal InterferenceMax{ get; set; } + + public RobotDataView(Robot input) { + RobotHead head = input.GetRobotComponent(); + RobotChassis chassis = input.GetRobotComponent(); + RobotLeg legs = input.GetRobotComponent(); + RobotInventory inventory = input.Components.OfType().SingleOrDefault(); + + var props = input.Properties; + + var test3 = input.GetPropertyModifier(AggregateField.speed_max); + + Speed = (double)input.Properties.SingleOrDefault(x=> x.Field == AggregateField.speed_max).Value; + Armor = input.ArmorMax; + Accumulator = input.CoreMax; + Cargo = (int) inventory.GetCapacityInfo()["capacity"]; + Cpu = input.Cpu; + Reactor = input.ReactorRadiation; + SlopeCapacity = input.Slope; + + SlotsHead = head.MaxSlots; + SlotsChassis = chassis.MaxSlots; + SlotsLeg = legs.MaxSlots; + + } + } +} diff --git a/Perpetuum.DataDumper/Views/AmmoWeaponDataView.cs b/Perpetuum.DataDumper/Views/AmmoWeaponDataView.cs new file mode 100644 index 000000000..14f5a9101 --- /dev/null +++ b/Perpetuum.DataDumper/Views/AmmoWeaponDataView.cs @@ -0,0 +1,23 @@ +using Perpetuum.Items.Ammos; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using static Perpetuum.DataDumper.DataDumper; + +namespace Perpetuum.DataDumper.Views { + public class AmmoWeaponDataView : ItemDataView { + public double? damage_chemical { get; set; } + public double? damage_kinetic { get; set; } + public double? damage_seismic { get; set; } + public double? damage_thermal { get; set; } + public double? damage_toxic { get; set; } + public double damage_total { get => (damage_chemical ?? 0) + (damage_kinetic ?? 0) + (damage_seismic ?? 0) + (damage_thermal ?? 0); } + public double? optimal_range { get; set; } + public double? explosion_radius { get; set; } + public string modifier_range { get; set; } + public string modifier_falloff { get; set; } + + } +} diff --git a/Perpetuum.DataDumper/Views/ModuleArmorHardenerDataView.cs b/Perpetuum.DataDumper/Views/ModuleArmorHardenerDataView.cs new file mode 100644 index 000000000..f61837d09 --- /dev/null +++ b/Perpetuum.DataDumper/Views/ModuleArmorHardenerDataView.cs @@ -0,0 +1,26 @@ +using Perpetuum.Containers; +using Perpetuum.Modules; +using Perpetuum.Modules.Weapons; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using static Perpetuum.DataDumper.DataDumper; + +namespace Perpetuum.DataDumper.Views { + public class ModuleArmorHardenerDataView : ActiveModuleDataView { + + public double module_resist_active_chemical { get; set; } + public double module_resist_passive_chemical { get; set; } + public double module_resist_active_kinetic { get; set; } + public double module_resist_passive_kinetic { get; set; } + public double module_resist_active_seismic { get; set; } + public double module_resist_passive_seismic { get; set; } + public double module_resist_active_thermal { get; set; } + public double module_resist_passive_thermal { get; set; } + public string module_resist_type { get; set; } + public double module_resist_passive { get; set; } + public double module_resist_active { get; set; } + } +} diff --git a/Perpetuum.DataDumper/Views/ModuleArmorPlateView.cs b/Perpetuum.DataDumper/Views/ModuleArmorPlateView.cs new file mode 100644 index 000000000..b373c34e7 --- /dev/null +++ b/Perpetuum.DataDumper/Views/ModuleArmorPlateView.cs @@ -0,0 +1,17 @@ +using Perpetuum.Containers; +using Perpetuum.Modules; +using Perpetuum.Modules.Weapons; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using static Perpetuum.DataDumper.DataDumper; + +namespace Perpetuum.DataDumper.Views { + public class ModuleArmorPlateDataView : ModuleDataView { + public double module_hp { get; set; } + public double module_surface_hit { get; set; } + public double module_demob_resist { get; set; } + } +} diff --git a/Perpetuum.DataDumper/Views/ModuleArmorRepairerDataView.cs b/Perpetuum.DataDumper/Views/ModuleArmorRepairerDataView.cs new file mode 100644 index 000000000..0ef7e1ba9 --- /dev/null +++ b/Perpetuum.DataDumper/Views/ModuleArmorRepairerDataView.cs @@ -0,0 +1,23 @@ +using Perpetuum.Containers; +using Perpetuum.Modules; +using Perpetuum.Modules.Weapons; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using static Perpetuum.DataDumper.DataDumper; + +namespace Perpetuum.DataDumper.Views { + public class ModuleArmorRepairerDataView : ItemDataView { + public string module_tier { get; set; } + public double cpu { get; set; } + public double reactor { get; set; } + + public double module_accumulator { get; set; } + public double module_cycle { get; set; } + public double module_repair_amount { get; set; } + + public string module_extensions_required { get; set; } + } +} diff --git a/Perpetuum.DataDumper/Views/ModuleERPDataView.cs b/Perpetuum.DataDumper/Views/ModuleERPDataView.cs new file mode 100644 index 000000000..d39688adc --- /dev/null +++ b/Perpetuum.DataDumper/Views/ModuleERPDataView.cs @@ -0,0 +1,19 @@ +using Perpetuum.Containers; +using Perpetuum.Modules; +using Perpetuum.Modules.Weapons; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using static Perpetuum.DataDumper.DataDumper; + +namespace Perpetuum.DataDumper.Views { + public class ModuleERPDataView : ActiveModuleDataView { + + public double module_recovery_chemical { get; set; } + public double module_recovery_kinetic { get; set; } + public double module_recovery_seismic { get; set; } + public double module_recovery_thermal { get; set; } + } +} diff --git a/Perpetuum.DataDumper/Views/ModuleRemoteArmorRepairerDataView.cs b/Perpetuum.DataDumper/Views/ModuleRemoteArmorRepairerDataView.cs new file mode 100644 index 000000000..bf25cafe9 --- /dev/null +++ b/Perpetuum.DataDumper/Views/ModuleRemoteArmorRepairerDataView.cs @@ -0,0 +1,17 @@ +using Perpetuum.Containers; +using Perpetuum.Modules; +using Perpetuum.Modules.Weapons; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using static Perpetuum.DataDumper.DataDumper; + +namespace Perpetuum.DataDumper.Views { + public class ModuleRemoteArmorRepairerDataView : ActiveModuleDataView { + + public double module_repair_amount { get; set; } + public double module_optimal_range { get; set; } + } +} diff --git a/Perpetuum.DataDumper/Views/ModuleResistancePlatingDataView.cs b/Perpetuum.DataDumper/Views/ModuleResistancePlatingDataView.cs new file mode 100644 index 000000000..635177265 --- /dev/null +++ b/Perpetuum.DataDumper/Views/ModuleResistancePlatingDataView.cs @@ -0,0 +1,15 @@ +using Perpetuum.Containers; +using Perpetuum.Modules; +using Perpetuum.Modules.Weapons; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using static Perpetuum.DataDumper.DataDumper; + +namespace Perpetuum.DataDumper.Views { + public class ModuleResistancePlatingDataView : ModuleArmorHardenerDataView { + + } +} diff --git a/Perpetuum.DataDumper/Views/ModuleShieldGeneratorDataView.cs b/Perpetuum.DataDumper/Views/ModuleShieldGeneratorDataView.cs new file mode 100644 index 000000000..c9221fe84 --- /dev/null +++ b/Perpetuum.DataDumper/Views/ModuleShieldGeneratorDataView.cs @@ -0,0 +1,17 @@ +using Perpetuum.Containers; +using Perpetuum.Modules; +using Perpetuum.Modules.Weapons; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using static Perpetuum.DataDumper.DataDumper; + +namespace Perpetuum.DataDumper.Views { + public class ModuleShieldGeneratorDataView : ActiveModuleDataView { + + public double module_shield_radius { get; set; } + public double module_absorption_ratio { get; set; } + } +} diff --git a/Perpetuum.DataDumper/Views/ModuleWeaponDataView.cs b/Perpetuum.DataDumper/Views/ModuleWeaponDataView.cs new file mode 100644 index 000000000..d23457c91 --- /dev/null +++ b/Perpetuum.DataDumper/Views/ModuleWeaponDataView.cs @@ -0,0 +1,58 @@ +using Perpetuum.Modules; +using Perpetuum.Modules.Weapons; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using static Perpetuum.DataDumper.DataDumper; + +namespace Perpetuum.DataDumper.Views { + public class ModuleWeaponDataView : ItemDataView { + public double cpu { get; set; } + public double reactor { get; set; } + public string ammo_type { get; set; } + public string slot_status { get; set; } + + public int ammo_capacity { get; set; } + + public string module_tier { get; set; } + + public double module_accumulator { get; set; } + public double module_cycle { get; set; } + public double module_damage { get; set; } + public double module_falloff { get; set; } + public double module_hit_dispersion { get; set; } + public double module_optimal_range { get; set; } + public string missile_optimal_range { get; set; } + public string module_extensions_required { get; set; } + + private List slot_flag_values; + public string slot_flags { + get { + return String.Join(";", slot_flag_values.Select(x => x.ToString())); + } + set { + slot_flag_values = EnumHelper.MaskToList((SlotFlags)Convert.ToInt64(value)).ToList(); + } + } + public string slot_type { + get { + return slot_flag_values.Intersect(typeFlags).SingleOrDefault().ToString(); + } + } + + public string slot_size { + get { + return slot_flag_values.Intersect(sizeFlags).SingleOrDefault().ToString(); + } + } + + public string slot_location { + get { + return slot_flag_values.Intersect(locationFlags).SingleOrDefault().ToString(); + } + } + + } +} diff --git a/Perpetuum.DataDumper/Views/SparkDataView.cs b/Perpetuum.DataDumper/Views/SparkDataView.cs new file mode 100644 index 000000000..21966f0af --- /dev/null +++ b/Perpetuum.DataDumper/Views/SparkDataView.cs @@ -0,0 +1,20 @@ +using Perpetuum.Items.Ammos; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using static Perpetuum.DataDumper.DataDumper; + +namespace Perpetuum.DataDumper.Views { + public class SparkDataView : EntityDataView { + public double? price_purchase { get; set; } + public double? price_equip { get; set; } + public double? required_standing { get; set; } + public int sequence { get; set; } + public string icon { get; set; } + public string extensions { get; set; } + public string alliance { get; set; } + public string energy_prop { get; set; } + } +} diff --git a/Perpetuum.DataDumper/packages.config b/Perpetuum.DataDumper/packages.config new file mode 100644 index 000000000..0adae8da2 --- /dev/null +++ b/Perpetuum.DataDumper/packages.config @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/Perpetuum.sln b/Perpetuum.sln index bab491d9c..f2f5db153 100644 --- a/Perpetuum.sln +++ b/Perpetuum.sln @@ -28,6 +28,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Perpetuum.Bootstrapper", "s EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Perpetuum.ServerService", "src\Perpetuum.ServerService\Perpetuum.ServerService.csproj", "{9C77CE95-825E-4BB1-9129-66835BDB8C96}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Perpetuum.DataDumper", "Perpetuum.DataDumper\Perpetuum.DataDumper.csproj", "{55911748-316C-43CA-B703-47DBF77AC171}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -122,12 +124,25 @@ Global {9C77CE95-825E-4BB1-9129-66835BDB8C96}.Release|x64.Build.0 = Release|Any CPU {9C77CE95-825E-4BB1-9129-66835BDB8C96}.Release|x86.ActiveCfg = Release|Any CPU {9C77CE95-825E-4BB1-9129-66835BDB8C96}.Release|x86.Build.0 = Release|Any CPU + {55911748-316C-43CA-B703-47DBF77AC171}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {55911748-316C-43CA-B703-47DBF77AC171}.Debug|Any CPU.Build.0 = Debug|Any CPU + {55911748-316C-43CA-B703-47DBF77AC171}.Debug|x64.ActiveCfg = Debug|x64 + {55911748-316C-43CA-B703-47DBF77AC171}.Debug|x64.Build.0 = Debug|x64 + {55911748-316C-43CA-B703-47DBF77AC171}.Debug|x86.ActiveCfg = Debug|Any CPU + {55911748-316C-43CA-B703-47DBF77AC171}.Debug|x86.Build.0 = Debug|Any CPU + {55911748-316C-43CA-B703-47DBF77AC171}.Release|Any CPU.ActiveCfg = Release|Any CPU + {55911748-316C-43CA-B703-47DBF77AC171}.Release|Any CPU.Build.0 = Release|Any CPU + {55911748-316C-43CA-B703-47DBF77AC171}.Release|x64.ActiveCfg = Release|Any CPU + {55911748-316C-43CA-B703-47DBF77AC171}.Release|x64.Build.0 = Release|Any CPU + {55911748-316C-43CA-B703-47DBF77AC171}.Release|x86.ActiveCfg = Release|Any CPU + {55911748-316C-43CA-B703-47DBF77AC171}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection GlobalSection(NestedProjects) = preSolution {4736AD6B-6565-4EEF-ABCB-19454342A986} = {7DE0E6B2-17B2-4988-9A45-BC3FA49AB223} + {55911748-316C-43CA-B703-47DBF77AC171} = {7DE0E6B2-17B2-4988-9A45-BC3FA49AB223} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {DEB5AFE6-BD52-405C-BA07-8D5E7FC9B57C} diff --git a/src/Perpetuum.Bootstrapper/PerpetuumBootstrapper.cs b/src/Perpetuum.Bootstrapper/PerpetuumBootstrapper.cs index f44b9068f..2f9afdf3c 100644 --- a/src/Perpetuum.Bootstrapper/PerpetuumBootstrapper.cs +++ b/src/Perpetuum.Bootstrapper/PerpetuumBootstrapper.cs @@ -180,20 +180,20 @@ namespace Perpetuum.Bootstrapper { - class EntityAggregateServices : IEntityServices + public class EntityAggregateServices : IEntityServices { public IEntityFactory Factory { get; set; } public IEntityDefaultReader Defaults { get; set; } public IEntityRepository Repository { get; set; } } - - class RobotTemplateServicesImpl : IRobotTemplateServices + + public class RobotTemplateServicesImpl : IRobotTemplateServices { public IRobotTemplateReader Reader { get; set; } public IRobotTemplateRelations Relations { get; set; } } - class TeleportStrategyFactoriesImpl : ITeleportStrategyFactories + public class TeleportStrategyFactoriesImpl : ITeleportStrategyFactories { public TeleportWithinZone.Factory TeleportWithinZoneFactory { get; set; } public TeleportToAnotherZone.Factory TeleportToAnotherZoneFactory { get; set; } diff --git a/src/Perpetuum/EntityFramework/EntityFactory.cs b/src/Perpetuum/EntityFramework/EntityFactory.cs index 1da163065..36ec90bda 100644 --- a/src/Perpetuum/EntityFramework/EntityFactory.cs +++ b/src/Perpetuum/EntityFramework/EntityFactory.cs @@ -66,6 +66,43 @@ public Entity Create(EntityDefault entityDefault,IIDGenerator idGenerator) return entity; } - } -} + public Entity CreateForData(string definitionName, IIDGenerator idGenerator) { + bool forData = true; + + EntityDefault entityDefault = _defaultReader.GetByName(definitionName); + + var entity = _factory(entityDefault); + entity.Eid = idGenerator.GetNextID(); + + + if (entity is Item item) { + var modifiers = _defaultPropertyModifierReader.GetByDefinition(entityDefault.Definition); + item.BasePropertyModifiers = new PropertyModifierCollection(modifiers); + + if (item is Module module) { + module.PropertyModifiers = _modulePropertyModifiersReader.GetModifiers(module); + + if (forData == true) { + module.IsRepackaged = false; + } + } + if (item is Robot robot) { + robot.Template = _robotTemplateFactory(entityDefault.Definition); + + if (forData == true) { + robot.IsRepackaged = false; + } + + if (!robot.IsRepackaged) { + robot.CreateComponents(); + } + } + + item.Initialize(); + } + + return entity; + } + } +} \ No newline at end of file diff --git a/src/Perpetuum/Modules/SlotFlags.cs b/src/Perpetuum/Modules/SlotFlags.cs index 9e56fa365..52dfbb25d 100644 --- a/src/Perpetuum/Modules/SlotFlags.cs +++ b/src/Perpetuum/Modules/SlotFlags.cs @@ -1,20 +1,24 @@ -namespace Perpetuum.Modules +using System; + +namespace Perpetuum.Modules { + /// Doc - These are powers of 8 /// /// Types for module slots /// + [Flags] public enum SlotFlags { - turret, - missile, - melee, - head, - chassis, - leg, - small, - medium, - large, - industrial, - ew_and_engineering + turret = 1, + missile = 2, + melee = 4, + head = 8, + chassis = 16, + leg = 32, + small = 64, + medium = 128, + large = 256, + industrial = 512, + ew_and_engineering = 1024 } } \ No newline at end of file From 084650d143b87535cd9fa8eb5c9ef5fd505e0bf7 Mon Sep 17 00:00:00 2001 From: docsaintly Date: Sun, 11 Oct 2020 17:21:06 +0100 Subject: [PATCH 2/8] Adding user settings manage paths Changed localization parser to use GenXy deserializer Added driller module Removed changes to entity factory Fixed SlotFlags comment Removed some unnecessary comments --- Perpetuum.DataDumper/App.config | 15 ++++ Perpetuum.DataDumper/DataDumper.cs | 66 ++++++++++------- Perpetuum.DataDumper/DumperForm.Designer.cs | 71 ++++++++++++++++--- Perpetuum.DataDumper/DumperForm.cs | 27 ++++--- .../Factory/DataDumper.ModuleArmorPlate.cs | 1 - .../Factory/DataDumper.ModuleDriller.cs | 25 +++++++ .../Factory/DataDumper.ModuleERP.cs | 1 - .../DataDumper.ModuleRemoteArmorRepair.cs | 1 - .../Factory/DataDumper.Resolver.cs | 6 +- .../Perpetuum.DataDumper.csproj | 2 + Perpetuum.DataDumper/PerpetuumLightServer.cs | 4 +- .../Properties/Settings.Designer.cs | 26 ++++++- .../Properties/Settings.settings | 17 +++-- .../Views/ModuleDrillerDataView.cs | 16 +++++ .../EntityFramework/EntityFactory.cs | 38 ---------- src/Perpetuum/Modules/SlotFlags.cs | 2 +- 16 files changed, 221 insertions(+), 97 deletions(-) create mode 100644 Perpetuum.DataDumper/Factory/DataDumper.ModuleDriller.cs create mode 100644 Perpetuum.DataDumper/Views/ModuleDrillerDataView.cs diff --git a/Perpetuum.DataDumper/App.config b/Perpetuum.DataDumper/App.config index bae5d6d81..35c2129d0 100644 --- a/Perpetuum.DataDumper/App.config +++ b/Perpetuum.DataDumper/App.config @@ -1,6 +1,21 @@ + + +
+ + + + + + C:\PerpetuumServer\data + + + C:\PerpetuumServer\data\dictionary.txt + + + diff --git a/Perpetuum.DataDumper/DataDumper.cs b/Perpetuum.DataDumper/DataDumper.cs index 9e1391ac2..7a080e911 100644 --- a/Perpetuum.DataDumper/DataDumper.cs +++ b/Perpetuum.DataDumper/DataDumper.cs @@ -28,6 +28,9 @@ namespace Perpetuum.DataDumper { public partial class DataDumper { + private string serverRoot; + private string dictionaryPath; + private IContainer container; EntityFactory entityFactory; IEntityServices entityServices; @@ -52,8 +55,12 @@ public partial class DataDumper }; - public DataDumper(IContainer container) + public DataDumper(IContainer container, string serverRoot, string dictionaryPath) { + this.serverRoot = serverRoot; + + this.dictionaryPath = dictionaryPath; + this.container = container; entityFactory = container.Resolve(); @@ -74,36 +81,41 @@ public DataDumper(IContainer container) // var testRobot = productionDataReader.ProductionComponents[193]; // var testRobot2 = productionDataReader.ProductionComponents[208]; - itemNames = new Dictionary(); + var itemNames = new Dictionary(); - var dataLines = System.IO.File.ReadAllLines(@"C:\Users\derek\Desktop\projects\Perpetuum\dictionary.tsv"); + var dataLines = System.IO.File.ReadAllText(dictionaryPath); - foreach (var line in dataLines) - { - var parts = line.Split(new char[] { '\t' }); - itemNames.Add(parts[0], parts[1]); - } + var dictionaryText = GenXY.GenxyConverter.Deserialize(dataLines); - // Now read the names from JSON files - var jsonFiles = System.IO.Directory.GetFiles(@"C:\Users\derek\Desktop\projects\Perpetuum\OPDB\Patches", "0.json", System.IO.SearchOption.AllDirectories); - var sortedFiles = jsonFiles.ToList(); - sortedFiles.Sort(); - - foreach (var jsonFilePath in sortedFiles) { - var fileLines = System.IO.File.ReadAllText(jsonFilePath); - - var jsonData = JsonConvert.DeserializeObject>(fileLines); - - foreach (var item in jsonData) { - if (itemNames.ContainsKey(item.Key)) { - itemNames[item.Key] = item.Value; - } else { - itemNames.Add(item.Key, item.Value); - } + if (dictionaryText.ContainsKey("dictionary")) { + var sourceDict = (Dictionary)dictionaryText["dictionary"]; + + foreach (var item in sourceDict) { + itemNames.Add(item.Key, item.Value.ToString()); } + } else { + throw new Exception("Dictionary file is invalid"); } + //foreach (var line in dataLines) + //{ + // var parts = line.Split(new char[] { '\t' }); + // itemNames.Add(parts[0], parts[1]); + //} + + // Now read the names from JSON files + string dictionaryLocation = System.IO.Path.Combine(serverRoot, @"customDictionary\0.json"); + + var jsonData = JsonConvert.DeserializeObject>(System.IO.File.ReadAllText(dictionaryLocation)); + + foreach (var item in jsonData) { + if (itemNames.ContainsKey(item.Key)) { + itemNames[item.Key] = item.Value; + } else { + itemNames.Add(item.Key, item.Value); + } + } Console.WriteLine($"{dataLines.Length} dictionary names loaded"); } @@ -249,7 +261,7 @@ public void DumpGenericData(string categoryName, string outputPath) try { // var currentDefaults = defaultReader.GetByName(itemName); - var currentObject = entityFactory.CreateForData(itemName, EntityIDGenerator.Random); + var currentObject = entityFactory.Create(itemName, EntityIDGenerator.Random); var dictionaryData = currentObject.ToDictionary(); @@ -455,7 +467,9 @@ public void GetRobotData(string outputPath) string botName = botData["definitionname"].ToString(); try { - var currentBot = entityFactory.CreateForData(botName, EntityIDGenerator.Random); + var currentBot = (Robot)entityFactory.Create(botName, EntityIDGenerator.Random); + + currentBot.Unpack(); botDataList.Add(currentBot); diff --git a/Perpetuum.DataDumper/DumperForm.Designer.cs b/Perpetuum.DataDumper/DumperForm.Designer.cs index 30b43422d..cddf6d2d7 100644 --- a/Perpetuum.DataDumper/DumperForm.Designer.cs +++ b/Perpetuum.DataDumper/DumperForm.Designer.cs @@ -31,6 +31,11 @@ private void InitializeComponent() { this.clearTypesButton = new System.Windows.Forms.Button(); this.serverPathTextbox = new System.Windows.Forms.TextBox(); this.label3 = new System.Windows.Forms.Label(); + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.label1 = new System.Windows.Forms.Label(); + this.dictionaryPathTextbox = new System.Windows.Forms.TextBox(); + this.saveSettingsButton = new System.Windows.Forms.Button(); + this.groupBox1.SuspendLayout(); this.SuspendLayout(); // // StartButton @@ -48,15 +53,15 @@ private void InitializeComponent() { this.mappingSelectList.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left))); this.mappingSelectList.FormattingEnabled = true; - this.mappingSelectList.Location = new System.Drawing.Point(12, 78); + this.mappingSelectList.Location = new System.Drawing.Point(12, 63); this.mappingSelectList.Name = "mappingSelectList"; - this.mappingSelectList.Size = new System.Drawing.Size(306, 364); + this.mappingSelectList.Size = new System.Drawing.Size(306, 379); this.mappingSelectList.TabIndex = 3; // // label2 // this.label2.AutoSize = true; - this.label2.Location = new System.Drawing.Point(13, 56); + this.label2.Location = new System.Drawing.Point(12, 42); this.label2.Name = "label2"; this.label2.Size = new System.Drawing.Size(62, 13); this.label2.TabIndex = 4; @@ -86,7 +91,7 @@ private void InitializeComponent() { // // serverPathTextbox // - this.serverPathTextbox.Location = new System.Drawing.Point(151, 14); + this.serverPathTextbox.Location = new System.Drawing.Point(109, 23); this.serverPathTextbox.Name = "serverPathTextbox"; this.serverPathTextbox.Size = new System.Drawing.Size(167, 20); this.serverPathTextbox.TabIndex = 7; @@ -95,19 +100,59 @@ private void InitializeComponent() { // label3 // this.label3.AutoSize = true; - this.label3.Location = new System.Drawing.Point(105, 17); + this.label3.Location = new System.Drawing.Point(11, 26); this.label3.Name = "label3"; - this.label3.Size = new System.Drawing.Size(32, 13); + this.label3.Size = new System.Drawing.Size(92, 13); this.label3.TabIndex = 8; - this.label3.Text = "Path:"; + this.label3.Text = "Server Data Path:"; + // + // groupBox1 + // + this.groupBox1.Controls.Add(this.saveSettingsButton); + this.groupBox1.Controls.Add(this.label1); + this.groupBox1.Controls.Add(this.dictionaryPathTextbox); + this.groupBox1.Controls.Add(this.label3); + this.groupBox1.Controls.Add(this.serverPathTextbox); + this.groupBox1.Location = new System.Drawing.Point(331, 12); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.Size = new System.Drawing.Size(285, 100); + this.groupBox1.TabIndex = 9; + this.groupBox1.TabStop = false; + this.groupBox1.Text = "Settings"; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(13, 52); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(79, 13); + this.label1.TabIndex = 10; + this.label1.Text = "Dictionary Path"; + // + // dictionaryPathTextbox + // + this.dictionaryPathTextbox.Location = new System.Drawing.Point(111, 49); + this.dictionaryPathTextbox.Name = "dictionaryPathTextbox"; + this.dictionaryPathTextbox.Size = new System.Drawing.Size(167, 20); + this.dictionaryPathTextbox.TabIndex = 9; + this.dictionaryPathTextbox.TextChanged += new System.EventHandler(this.dictionaryPathTextbox_TextChanged); + // + // saveSettingsButton + // + this.saveSettingsButton.Location = new System.Drawing.Point(7, 71); + this.saveSettingsButton.Name = "saveSettingsButton"; + this.saveSettingsButton.Size = new System.Drawing.Size(58, 23); + this.saveSettingsButton.TabIndex = 11; + this.saveSettingsButton.Text = "Save"; + this.saveSettingsButton.UseVisualStyleBackColor = true; + this.saveSettingsButton.Click += new System.EventHandler(this.saveSettingsButton_Click); // // DumperForm // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(327, 488); - this.Controls.Add(this.label3); - this.Controls.Add(this.serverPathTextbox); + this.ClientSize = new System.Drawing.Size(627, 488); + this.Controls.Add(this.groupBox1); this.Controls.Add(this.clearTypesButton); this.Controls.Add(this.allTypesButton); this.Controls.Add(this.label2); @@ -117,6 +162,8 @@ private void InitializeComponent() { this.Name = "DumperForm"; this.Text = "Perpetuum Data Dumper"; this.Load += new System.EventHandler(this.Form1_Load); + this.groupBox1.ResumeLayout(false); + this.groupBox1.PerformLayout(); this.ResumeLayout(false); this.PerformLayout(); @@ -131,6 +178,10 @@ private void InitializeComponent() { private System.Windows.Forms.Button clearTypesButton; private System.Windows.Forms.TextBox serverPathTextbox; private System.Windows.Forms.Label label3; + private System.Windows.Forms.GroupBox groupBox1; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.TextBox dictionaryPathTextbox; + private System.Windows.Forms.Button saveSettingsButton; } } diff --git a/Perpetuum.DataDumper/DumperForm.cs b/Perpetuum.DataDumper/DumperForm.cs index 9222a5f62..f902b8068 100644 --- a/Perpetuum.DataDumper/DumperForm.cs +++ b/Perpetuum.DataDumper/DumperForm.cs @@ -32,6 +32,7 @@ public DumperForm() { // These universal ones are strange because they're stored in a different category // even though in the game UI they're the same thing and they have basically the same stats // Also the univeral one is a regular module while the others are Active + new DataExportMapping("ModuleDrillerStatus", typeof(ModuleDrillerDataView), "cf_drillers"), new DataExportMapping("ModuleArmorHardenerStats", typeof(ModuleArmorHardenerDataView), "cf_armor_hardeners"), new DataExportMapping("ModuleShieldGeneratorStats", typeof(ModuleShieldGeneratorDataView), "cf_shield_generators"), new DataExportMapping("ModuleERPStats", typeof(ModuleERPDataView), "cf_kers"), @@ -43,10 +44,9 @@ public DumperForm() { new DataExportMapping("WeaponStats", typeof(ModuleWeaponDataView), "cf_weapons") }; - private string serverRoot = @"C:\PerpetuumServer\data"; - private void Form1_Load(object sender, EventArgs e) { - serverPathTextbox.Text = serverRoot; + serverPathTextbox.Text = Properties.Settings.Default.ServerPath; + dictionaryPathTextbox.Text = Properties.Settings.Default.DictionaryPath; foreach (var item in mappings) { mappingSelectList.Items.Add(item, true); @@ -57,15 +57,17 @@ private void Form1_Load(object sender, EventArgs e) { private void StartButton_Click(object sender, EventArgs e) { var tableGroupings = mappingSelectList.CheckedItems.Cast().GroupBy(x => x.TableName).ToList(); - if (!System.IO.Directory.Exists(serverRoot)) { - MessageBox.Show("Server path doesn't exist: " + serverRoot); + if (!System.IO.Directory.Exists(Properties.Settings.Default.ServerPath)) { + MessageBox.Show("Server path doesn't exist: " + Properties.Settings.Default.ServerPath); } bootstrapper = new PerpetuumLightBootstrapper(); - bootstrapper.Init(serverRoot); + bootstrapper.Init(Properties.Settings.Default.ServerPath); + + bootstrapper.InitDumper(Properties.Settings.Default.ServerPath, Properties.Settings.Default.DictionaryPath); - bootstrapper.InitDumper(); + bootstrapper.Dumper.GetRobotData("robot.csv"); IWorkbook workbook = new XSSFWorkbook(); @@ -127,7 +129,16 @@ private void clearTypesButton_Click(object sender, EventArgs e) { } private void serverPathTextbox_TextChanged(object sender, EventArgs e) { - serverRoot = serverPathTextbox.Text; + Properties.Settings.Default.ServerPath = serverPathTextbox.Text; + } + private void dictionaryPathTextbox_TextChanged(object sender, EventArgs e) { + Properties.Settings.Default.DictionaryPath = dictionaryPathTextbox.Text; } + + private void saveSettingsButton_Click(object sender, EventArgs e) { + Properties.Settings.Default.Save(); + } + + } } diff --git a/Perpetuum.DataDumper/Factory/DataDumper.ModuleArmorPlate.cs b/Perpetuum.DataDumper/Factory/DataDumper.ModuleArmorPlate.cs index dbca6d5e3..d1392613e 100644 --- a/Perpetuum.DataDumper/Factory/DataDumper.ModuleArmorPlate.cs +++ b/Perpetuum.DataDumper/Factory/DataDumper.ModuleArmorPlate.cs @@ -20,7 +20,6 @@ public ModuleArmorPlateDataView NewModuleArmorPlateDataView(Module module) { newView.module_hp = module.GetBasePropertyModifier(AggregateField.armor_max).Value; newView.module_demob_resist = module.GetBasePropertyModifier(AggregateField.massiveness).Value * 100; newView.module_surface_hit = module.GetBasePropertyModifier(AggregateField.signature_radius).Value; - // module.GetBasePropertyModifier(AggregateField.heal) return newView; } diff --git a/Perpetuum.DataDumper/Factory/DataDumper.ModuleDriller.cs b/Perpetuum.DataDumper/Factory/DataDumper.ModuleDriller.cs new file mode 100644 index 000000000..8c4512d02 --- /dev/null +++ b/Perpetuum.DataDumper/Factory/DataDumper.ModuleDriller.cs @@ -0,0 +1,25 @@ +using Perpetuum.DataDumper.Views; +using Perpetuum.ExportedTypes; +using Perpetuum.Items.Ammos; +using Perpetuum.Modules; +using Perpetuum.Modules.Weapons; +using Perpetuum.Services.ExtensionService; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using static Perpetuum.DataDumper.DataDumper; + +namespace Perpetuum.DataDumper { + public partial class DataDumper { + public ModuleDrillerDataView NewModuleDrillerDataView(DrillerModule module) { + var newView = new ModuleDrillerDataView(); + InitActiveModuleView(newView, module); + + newView.module_mining_modifier = module.GetBasePropertyModifier(AggregateField.mining_amount_modifier).Value; + + return newView; + } + } +} \ No newline at end of file diff --git a/Perpetuum.DataDumper/Factory/DataDumper.ModuleERP.cs b/Perpetuum.DataDumper/Factory/DataDumper.ModuleERP.cs index 6cdd30c38..a2286efa3 100644 --- a/Perpetuum.DataDumper/Factory/DataDumper.ModuleERP.cs +++ b/Perpetuum.DataDumper/Factory/DataDumper.ModuleERP.cs @@ -21,7 +21,6 @@ public ModuleERPDataView NewModuleERPDataView(Module module) { newView.module_recovery_kinetic = module.GetBasePropertyModifier(AggregateField.kinetic_damage_to_core_modifier).Value * 100; newView.module_recovery_seismic = module.GetBasePropertyModifier(AggregateField.explosive_damage_to_core_modifier).Value * 100; newView.module_recovery_thermal = module.GetBasePropertyModifier(AggregateField.thermal_damage_to_core_modifier).Value * 100; - // module.GetBasePropertyModifier(AggregateField.heal) return newView; } diff --git a/Perpetuum.DataDumper/Factory/DataDumper.ModuleRemoteArmorRepair.cs b/Perpetuum.DataDumper/Factory/DataDumper.ModuleRemoteArmorRepair.cs index 07dd61367..e79c99cba 100644 --- a/Perpetuum.DataDumper/Factory/DataDumper.ModuleRemoteArmorRepair.cs +++ b/Perpetuum.DataDumper/Factory/DataDumper.ModuleRemoteArmorRepair.cs @@ -19,7 +19,6 @@ public ModuleRemoteArmorRepairerDataView NewModuleRemoteArmorRepairerDataView(Ac newView.module_optimal_range = module.GetBasePropertyModifier(AggregateField.optimal_range).Value * 10; newView.module_repair_amount = module.GetBasePropertyModifier(AggregateField.armor_repair_amount).Value; - // module.GetBasePropertyModifier(AggregateField.heal) return newView; } diff --git a/Perpetuum.DataDumper/Factory/DataDumper.Resolver.cs b/Perpetuum.DataDumper/Factory/DataDumper.Resolver.cs index dfc010ac2..0d656ced3 100644 --- a/Perpetuum.DataDumper/Factory/DataDumper.Resolver.cs +++ b/Perpetuum.DataDumper/Factory/DataDumper.Resolver.cs @@ -55,7 +55,7 @@ public List DumpDataView(string categoryName) where T : EntityDataView { int itemId = (int)categoryItem["definition"]; try { - object currentObject = entityFactory.CreateForData(itemName, EntityIDGenerator.Random); + object currentObject = entityFactory.Create(itemName, EntityIDGenerator.Random); if (typeof(T) == typeof(ModuleWeaponDataView)) { @@ -77,7 +77,9 @@ public List DumpDataView(string categoryName) where T : EntityDataView { currentView = NewModuleArmorHardenerDataView(currentObject as ActiveModule) as T; } else { currentView = NewModuleArmorHardenerDataView(currentObject as Module) as T; - } + } + } else if (typeof(T) == typeof(ModuleDrillerDataView)) { + currentView = NewModuleDrillerDataView(currentObject as DrillerModule) as T; } else { continue; } diff --git a/Perpetuum.DataDumper/Perpetuum.DataDumper.csproj b/Perpetuum.DataDumper/Perpetuum.DataDumper.csproj index 4862954dd..c34079102 100644 --- a/Perpetuum.DataDumper/Perpetuum.DataDumper.csproj +++ b/Perpetuum.DataDumper/Perpetuum.DataDumper.csproj @@ -93,6 +93,7 @@ + @@ -111,6 +112,7 @@ + diff --git a/Perpetuum.DataDumper/PerpetuumLightServer.cs b/Perpetuum.DataDumper/PerpetuumLightServer.cs index 2429e4486..5a4c892b7 100644 --- a/Perpetuum.DataDumper/PerpetuumLightServer.cs +++ b/Perpetuum.DataDumper/PerpetuumLightServer.cs @@ -18,9 +18,9 @@ public class PerpetuumLightBootstrapper : PerpetuumBootstrapper { public DataDumper Dumper; - public void InitDumper() + public void InitDumper(string serverRoot, string dictionaryPath) { - Dumper = new DataDumper(GetContainer()); + Dumper = new DataDumper(GetContainer(), serverRoot, dictionaryPath); } } diff --git a/Perpetuum.DataDumper/Properties/Settings.Designer.cs b/Perpetuum.DataDumper/Properties/Settings.Designer.cs index 51490fe7b..a3cf13773 100644 --- a/Perpetuum.DataDumper/Properties/Settings.Designer.cs +++ b/Perpetuum.DataDumper/Properties/Settings.Designer.cs @@ -12,7 +12,7 @@ namespace Perpetuum.DataDumper.Properties { [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "16.6.0.0")] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "16.7.0.0")] internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); @@ -22,5 +22,29 @@ public static Settings Default { return defaultInstance; } } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("C:\\PerpetuumServer\\data")] + public string ServerPath { + get { + return ((string)(this["ServerPath"])); + } + set { + this["ServerPath"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("C:\\PerpetuumServer\\data\\dictionary.txt")] + public string DictionaryPath { + get { + return ((string)(this["DictionaryPath"])); + } + set { + this["DictionaryPath"] = value; + } + } } } diff --git a/Perpetuum.DataDumper/Properties/Settings.settings b/Perpetuum.DataDumper/Properties/Settings.settings index 39645652a..f99e22b1e 100644 --- a/Perpetuum.DataDumper/Properties/Settings.settings +++ b/Perpetuum.DataDumper/Properties/Settings.settings @@ -1,7 +1,12 @@  - - - - - - + + + + + C:\PerpetuumServer\data + + + C:\PerpetuumServer\data\dictionary.txt + + + \ No newline at end of file diff --git a/Perpetuum.DataDumper/Views/ModuleDrillerDataView.cs b/Perpetuum.DataDumper/Views/ModuleDrillerDataView.cs new file mode 100644 index 000000000..7595f8ff2 --- /dev/null +++ b/Perpetuum.DataDumper/Views/ModuleDrillerDataView.cs @@ -0,0 +1,16 @@ +using Perpetuum.Containers; +using Perpetuum.Modules; +using Perpetuum.Modules.Weapons; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using static Perpetuum.DataDumper.DataDumper; + +namespace Perpetuum.DataDumper.Views { + public class ModuleDrillerDataView : ActiveModuleDataView { + public double module_mining_modifier { get; set; } + + } +} diff --git a/src/Perpetuum/EntityFramework/EntityFactory.cs b/src/Perpetuum/EntityFramework/EntityFactory.cs index 36ec90bda..01cf32102 100644 --- a/src/Perpetuum/EntityFramework/EntityFactory.cs +++ b/src/Perpetuum/EntityFramework/EntityFactory.cs @@ -64,44 +64,6 @@ public Entity Create(EntityDefault entityDefault,IIDGenerator idGenerator) item.Initialize(); } - return entity; - } - public Entity CreateForData(string definitionName, IIDGenerator idGenerator) { - bool forData = true; - - EntityDefault entityDefault = _defaultReader.GetByName(definitionName); - - var entity = _factory(entityDefault); - entity.Eid = idGenerator.GetNextID(); - - - if (entity is Item item) { - var modifiers = _defaultPropertyModifierReader.GetByDefinition(entityDefault.Definition); - item.BasePropertyModifiers = new PropertyModifierCollection(modifiers); - - if (item is Module module) { - module.PropertyModifiers = _modulePropertyModifiersReader.GetModifiers(module); - - if (forData == true) { - module.IsRepackaged = false; - } - } - - if (item is Robot robot) { - robot.Template = _robotTemplateFactory(entityDefault.Definition); - - if (forData == true) { - robot.IsRepackaged = false; - } - - if (!robot.IsRepackaged) { - robot.CreateComponents(); - } - } - - item.Initialize(); - } - return entity; } } diff --git a/src/Perpetuum/Modules/SlotFlags.cs b/src/Perpetuum/Modules/SlotFlags.cs index 52dfbb25d..5d7e2b1c7 100644 --- a/src/Perpetuum/Modules/SlotFlags.cs +++ b/src/Perpetuum/Modules/SlotFlags.cs @@ -2,7 +2,7 @@ namespace Perpetuum.Modules { - /// Doc - These are powers of 8 + /// Doc - These are powers of 2 /// /// Types for module slots /// From edfd73809f188147a3886d90f6ee1080d3c3bd40 Mon Sep 17 00:00:00 2001 From: docsaintly Date: Tue, 13 Oct 2020 05:41:23 +0100 Subject: [PATCH 3/8] Refactored. Robots don't export but it needs to be re-written anyway. Still need to update property names. --- .../Base Views/ActiveModuleDataView.cs | 14 + .../Base Views/EntityDataView.cs | 9 + .../Base Views/ItemDataView.cs | 12 + .../Base Views/ModuleDataView.cs | 14 + Perpetuum.DataDumper/DataDumper.cs | 356 ++---------------- Perpetuum.DataDumper/DataExportMapping.cs | 20 +- Perpetuum.DataDumper/DumperForm.cs | 24 +- .../Factory/DataDumper.AmmoWeapon.cs | 53 --- .../Factory/DataDumper.ModuleArmorHardener.cs | 61 --- .../Factory/DataDumper.ModuleArmorPlate.cs | 27 -- .../Factory/DataDumper.ModuleArmorRepair.cs | 37 -- .../Factory/DataDumper.ModuleDriller.cs | 25 -- .../Factory/DataDumper.ModuleERP.cs | 28 -- .../DataDumper.ModuleRemoteArmorRepair.cs | 26 -- .../DataDumper.ModuleShieldGenerator.cs | 26 -- .../Factory/DataDumper.ModuleWeapon.cs | 59 --- .../Factory/DataDumper.Resolver.cs | 96 ----- .../Factory/DataDumper.Spark.cs | 90 ----- .../{ => Helpers}/CargoTypeAttribute.cs | 0 .../{ => Helpers}/EnumHelper.cs | 0 .../{ => Helpers}/ExtensionMethods.cs | 0 .../Perpetuum.DataDumper.csproj | 25 +- .../Views/AmmoWeaponDataView.cs | 42 ++- .../Views/ModuleArmorHardenerDataView.cs | 42 +++ .../Views/ModuleArmorPlateView.cs | 9 + .../Views/ModuleArmorRepairerDataView.cs | 16 +- .../Views/ModuleDrillerDataView.cs | 6 + .../Views/ModuleERPDataView.cs | 10 + .../ModuleRemoteArmorRepairerDataView.cs | 10 +- .../Views/ModuleResistancePlatingDataView.cs | 15 - .../Views/ModuleShieldGeneratorDataView.cs | 8 + .../Views/ModuleWeaponDataView.cs | 46 ++- .../{ => Views}/RobotDataView.cs | 2 +- Perpetuum.DataDumper/Views/SparkDataView.cs | 77 +++- 34 files changed, 364 insertions(+), 921 deletions(-) create mode 100644 Perpetuum.DataDumper/Base Views/ActiveModuleDataView.cs create mode 100644 Perpetuum.DataDumper/Base Views/EntityDataView.cs create mode 100644 Perpetuum.DataDumper/Base Views/ItemDataView.cs create mode 100644 Perpetuum.DataDumper/Base Views/ModuleDataView.cs delete mode 100644 Perpetuum.DataDumper/Factory/DataDumper.AmmoWeapon.cs delete mode 100644 Perpetuum.DataDumper/Factory/DataDumper.ModuleArmorHardener.cs delete mode 100644 Perpetuum.DataDumper/Factory/DataDumper.ModuleArmorPlate.cs delete mode 100644 Perpetuum.DataDumper/Factory/DataDumper.ModuleArmorRepair.cs delete mode 100644 Perpetuum.DataDumper/Factory/DataDumper.ModuleDriller.cs delete mode 100644 Perpetuum.DataDumper/Factory/DataDumper.ModuleERP.cs delete mode 100644 Perpetuum.DataDumper/Factory/DataDumper.ModuleRemoteArmorRepair.cs delete mode 100644 Perpetuum.DataDumper/Factory/DataDumper.ModuleShieldGenerator.cs delete mode 100644 Perpetuum.DataDumper/Factory/DataDumper.ModuleWeapon.cs delete mode 100644 Perpetuum.DataDumper/Factory/DataDumper.Resolver.cs delete mode 100644 Perpetuum.DataDumper/Factory/DataDumper.Spark.cs rename Perpetuum.DataDumper/{ => Helpers}/CargoTypeAttribute.cs (100%) rename Perpetuum.DataDumper/{ => Helpers}/EnumHelper.cs (100%) rename Perpetuum.DataDumper/{ => Helpers}/ExtensionMethods.cs (100%) delete mode 100644 Perpetuum.DataDumper/Views/ModuleResistancePlatingDataView.cs rename Perpetuum.DataDumper/{ => Views}/RobotDataView.cs (99%) diff --git a/Perpetuum.DataDumper/Base Views/ActiveModuleDataView.cs b/Perpetuum.DataDumper/Base Views/ActiveModuleDataView.cs new file mode 100644 index 000000000..495fc9bee --- /dev/null +++ b/Perpetuum.DataDumper/Base Views/ActiveModuleDataView.cs @@ -0,0 +1,14 @@ +namespace Perpetuum.DataDumper { + public partial class DataDumper + { + public class ActiveModuleDataView : ModuleDataView { + // These are nullable because some items may be + // in a group of active modules but are themselves + // passive and we don't want to show 0 for them + public double? module_accumulator { get; set; } + public double? module_cycle { get; set; } + + } + + } +} diff --git a/Perpetuum.DataDumper/Base Views/EntityDataView.cs b/Perpetuum.DataDumper/Base Views/EntityDataView.cs new file mode 100644 index 000000000..13a1796fb --- /dev/null +++ b/Perpetuum.DataDumper/Base Views/EntityDataView.cs @@ -0,0 +1,9 @@ +using System.Collections.Generic; + +namespace Perpetuum.DataDumper { + public class EntityDataView { + public string item_name { get; set; } // This should actually be renamed... + public string item_key { get; set; } + public List item_categories { get; set; } + } +} diff --git a/Perpetuum.DataDumper/Base Views/ItemDataView.cs b/Perpetuum.DataDumper/Base Views/ItemDataView.cs new file mode 100644 index 000000000..d470670ae --- /dev/null +++ b/Perpetuum.DataDumper/Base Views/ItemDataView.cs @@ -0,0 +1,12 @@ +namespace Perpetuum.DataDumper { + public partial class DataDumper + { + public class ItemDataView : EntityDataView { + public double item_mass { get; set; } + public double item_volume { get; set; } + public double item_volume_packed { get; set; } + + } + + } +} diff --git a/Perpetuum.DataDumper/Base Views/ModuleDataView.cs b/Perpetuum.DataDumper/Base Views/ModuleDataView.cs new file mode 100644 index 000000000..b54f0d64e --- /dev/null +++ b/Perpetuum.DataDumper/Base Views/ModuleDataView.cs @@ -0,0 +1,14 @@ +using System.Collections.Generic; + +namespace Perpetuum.DataDumper { + public partial class DataDumper + { + public class ModuleDataView : ItemDataView { + public string module_tier { get; set; } + public double module_cpu { get; set; } + public double module_reactor { get; set; } + public List module_extensions_required { get; set; } + } + + } +} diff --git a/Perpetuum.DataDumper/DataDumper.cs b/Perpetuum.DataDumper/DataDumper.cs index 7a080e911..9f31e502e 100644 --- a/Perpetuum.DataDumper/DataDumper.cs +++ b/Perpetuum.DataDumper/DataDumper.cs @@ -24,19 +24,19 @@ using System.Reflection; using NPOI.SS.UserModel; -namespace Perpetuum.DataDumper -{ +namespace Perpetuum.DataDumper { public partial class DataDumper { private string serverRoot; private string dictionaryPath; + public IExtensionReader ExtensionReader; + private IContainer container; EntityFactory entityFactory; IEntityServices entityServices; - IExtensionReader extensionReader; IEntityDefaultReader defaultReader; - Dictionary itemNames; + Dictionary itemNames = new Dictionary(); ISparkRepository sparkRepository; // Some static lists for helpers @@ -49,12 +49,6 @@ public partial class DataDumper CategoryFlags.cf_missile_ammo, CategoryFlags.cf_projectile_ammo }; - private static List views = new List { - new DataDumpConfiguration { ViewType = typeof(AmmoWeaponDataView), ViewCategory = "cf_ammo" }, - new DataDumpConfiguration { ViewType = typeof(ModuleWeaponDataView), ViewCategory = "cf_weapons" } - - }; - public DataDumper(IContainer container, string serverRoot, string dictionaryPath) { this.serverRoot = serverRoot; @@ -65,7 +59,7 @@ public DataDumper(IContainer container, string serverRoot, string dictionaryPath entityFactory = container.Resolve(); - extensionReader = container.Resolve(); + ExtensionReader = container.Resolve(); defaultReader = container.Resolve(); @@ -75,14 +69,14 @@ public DataDumper(IContainer container, string serverRoot, string dictionaryPath entityServices = container.Resolve(); + // Testing for new data dumps + // // var getEd = defaultReader.GetByName("def_named1_small_armor_repairer"); // var getCats = String.Join(";", getEd.CategoryFlags.GetCategoryFlagsTree().Where(x => x.ToString() != "undefined").Select(x => x.ToString()).ToList()); // var testMissile = productionDataReader.ProductionComponents[64]; // var testRobot = productionDataReader.ProductionComponents[193]; // var testRobot2 = productionDataReader.ProductionComponents[208]; - var itemNames = new Dictionary(); - var dataLines = System.IO.File.ReadAllText(dictionaryPath); var dictionaryText = GenXY.GenxyConverter.Deserialize(dataLines); @@ -91,19 +85,13 @@ public DataDumper(IContainer container, string serverRoot, string dictionaryPath var sourceDict = (Dictionary)dictionaryText["dictionary"]; foreach (var item in sourceDict) { - itemNames.Add(item.Key, item.Value.ToString()); + itemNames.Add(item.Key, item.Value.ToString().Trim()); } } else { throw new Exception("Dictionary file is invalid"); } - //foreach (var line in dataLines) - //{ - // var parts = line.Split(new char[] { '\t' }); - // itemNames.Add(parts[0], parts[1]); - //} - // Now read the names from JSON files string dictionaryLocation = System.IO.Path.Combine(serverRoot, @"customDictionary\0.json"); @@ -131,35 +119,6 @@ public string GetLocalizedName(string itemKey) } } - public class EntityDataView { - public string item_name { get; set; } // This should actually be renamed... - public string item_key { get; set; } - public List item_categories { get; set; } - } - - public class ItemDataView : EntityDataView { - public double item_mass { get; set; } - public double item_volume { get; set; } - public double item_volume_packed { get; set; } - - } - - public class ModuleDataView : ItemDataView { - public string module_tier { get; set; } - public double module_cpu { get; set; } - public double module_reactor { get; set; } - public List module_extensions_required { get; set; } - } - - public class ActiveModuleDataView : ModuleDataView { - // These are nullable because some items may be - // in a group of active modules but are themselves - // passive and we don't want to show 0 for them - public double? module_accumulator { get; set; } - public double? module_cycle { get; set; } - - } - public static string GenerateCargoDefinition(Type viewType, string tableName, string listDelimiter = ";") { string header = "\n{{#cargo_declare:_table="+tableName+"\n"; string body = ""; @@ -197,7 +156,7 @@ public class ActiveModuleDataView : ModuleDataView { } - private void InitItemView(ItemDataView view, Entity entity) { + public void InitItemView(ItemDataView view, Entity entity) { view.item_name = GetLocalizedName(entity.ED.Name); view.item_key = entity.ED.Name; view.item_categories = entity.ED.CategoryFlags.GetCategoryFlagsTree().Where(x=> x.ToString() != "undefined").Select(x => x.ToString()).ToList(); @@ -206,7 +165,7 @@ private void InitItemView(ItemDataView view, Entity entity) { view.item_volume = entity.ED.CalculateVolume(false, 1); } - private void InitModuleView(ModuleDataView view, Modules.Module module) { + public void InitModuleView(ModuleDataView view, Modules.Module module) { InitItemView(view, module); view.module_tier = module.ED.GameTierString(); @@ -216,18 +175,18 @@ private void InitModuleView(ModuleDataView view, Modules.Module module) { view.module_extensions_required = new List(); foreach (var extension in module.ED.EnablerExtensions.Keys) { - view.module_extensions_required.Add(GetLocalizedName(extensionReader.GetExtensionName(extension.id)) + "(" + extension.level + ")"); + view.module_extensions_required.Add(GetLocalizedName(ExtensionReader.GetExtensionName(extension.id)) + "(" + extension.level + ")"); } } - private void InitActiveModuleView(ActiveModuleDataView view, ActiveModule module) { + public void InitActiveModuleView(ActiveModuleDataView view, ActiveModule module) { InitModuleView(view, module); view.module_accumulator = module.CoreUsage; view.module_cycle = module.CycleTime.TotalSeconds; } - private string GetModifierString(ItemPropertyModifier mod) { + public static string GetModifierString(ItemPropertyModifier mod) { var returnValue = ""; if (mod.HasValue) { returnValue = ((mod.Value - 1) * 100) + "%"; @@ -238,103 +197,7 @@ private string GetModifierString(ItemPropertyModifier mod) { } return returnValue; - } - - // Factory Methods - - private class DataDumpConfiguration { - public Type ViewType { get; set; } - public String ViewCategory { get; set; } - } - - - public void DumpGenericData(string categoryName, string outputPath) - { - var returnData = new List>(); - List headers = null; - var categoryData = GetDataByItemCategoryName(categoryName); - - foreach (var categoryItem in categoryData) - { - string itemName = categoryItem["definitionname"].ToString(); - int itemId = (int)categoryItem["definition"]; - try - { - // var currentDefaults = defaultReader.GetByName(itemName); - var currentObject = entityFactory.Create(itemName, EntityIDGenerator.Random); - - var dictionaryData = currentObject.ToDictionary(); - - if (currentObject is Modules.Weapons.WeaponModule) - { - dictionaryData["ammoCategoryFlags"] = (CategoryFlags)dictionaryData["ammoCategoryFlags"]; - } - - if (headers == null || headers.Count == 0) - { - // We only want certain properties, yo! - headers = currentObject.GetType().GetProperties().Select(i => i.Name).ToList(); // new List { "BlobEmission", "BlobEmissionRadius", "Mass", "Volume", "MaxTargetingRange", "PowerGrid", "Cpu", "AmmoReloadTime", "MissileHitChance", "Height", "ArmorMax", "ActualMass", "CoreMax", "SignatureRadius", "SensorStrength", "DetectionStrength", "StealthStrength", "Massiveness", "ReactorRadiation", "Slope", "CoreRechargeTime", "BlockingRadius", "HitSize" }; - returnData.Add((new string[] { "Item Name" }).Concat(headers).ToList()); - } - - var currentProperties = new List(); - - currentProperties.Add(itemName); - - // Parse the object - foreach (string prop in headers) - { - try - { - var currentProp = currentObject.GetType().GetProperty(prop); - - if (currentProp == null) - { - currentProperties.Add("Error: Prop not found"); - } - else - { - var currentMethod = currentProp.GetGetMethod(true); - - if (currentMethod == null) - { - currentProperties.Add("Error: Getter not found"); - } - else - { - object value = currentMethod.Invoke(currentObject, null); - string stringValue = value?.ToString() ?? ""; - currentProperties.Add(stringValue.Replace(",", ";")); - } - - } - } - catch (Exception) - { - currentProperties.Add("EXCEPTION"); - } - - } - - returnData.Add(currentProperties); - - } - catch (Exception) - { - returnData.Add(new List { itemName, "BIG EXCEPTION" }); - } - } - - System.IO.File.WriteAllLines(outputPath, returnData.Select(x => String.Join(",", x))); - - } - - // cf_railguns, look at definition column - - public void WriteDataView(List> dataRows, string filePath) - { - System.IO.File.WriteAllLines(filePath, dataRows.Select(x => String.Join(",", x))); - } + } public void WriteDataView(List> dataRows, string sheetName, ISheet worksheet, ref int currentDataRow) { // Deal with the header @@ -397,19 +260,6 @@ public List> ComposeDataView(List data, string wikiTableName } else { currentValue = currentProp.GetValue(item)?.ToString().Replace(",",";") ?? ""; } - //var currentMethod = currentProp.GetGetMethod(true); - - //if (currentMethod == null) - //{ - // currentValue = "Error: Getter not found"; - //} - //else - //{ - // object value = currentMethod.Invoke(item, null); - // string stringValue = value?.ToString() ?? ""; - // currentValue = stringValue.Replace(",", ";"); - //} - } } catch (Exception) @@ -434,9 +284,8 @@ public List> ComposeDataView(List data, string wikiTableName return returnData; } - - + // TODO: Refactor this to use the built-in function instead of SQL private List GetDataByItemCategoryName(string categoryName) { var itemData = Db.Query().CommandText( @@ -449,168 +298,45 @@ private List GetDataByItemCategoryName(string categoryName) return itemData; } - // var Extension - // var test2 = entityFactory.Create(684, EntityIDGenerator.Random, true); - // var test3 = entityFactory.Create("def_standard_small_armor_plate", EntityIDGenerator.Random, true); - - public void GetRobotData(string outputPath) - { - var botNames = GetDataByItemCategoryName("cf_robots"); - - var returnData = new List>(); - List headers = null; + public List DumpDataView(DataExportMapping mapping) { + var returnItems = new List(); - var botDataList = new List(); + // Handle sparks first, refactor later + if (mapping.ViewType == typeof(SparkDataView)) { + var sparkData = sparkRepository.GetAll(); - foreach (var botData in botNames) - { - string botName = botData["definitionname"].ToString(); - try - { - var currentBot = (Robot)entityFactory.Create(botName, EntityIDGenerator.Random); + foreach (var spark in sparkData) { + try { + var currentView = new SparkDataView(spark, this); - currentBot.Unpack(); - - botDataList.Add(currentBot); - - // var dataView = new RobotDataView(currentBot as Robot); - - if (headers == null || headers.Count == 0) - { - // We only want certain properties, yo! - headers = new List { "BlobEmission", "BlobEmissionRadius", "Mass", "Volume", "MaxTargetingRange", "PowerGrid", "Cpu", "AmmoReloadTime", "MissileHitChance", "Height", "ArmorMax", "ActualMass", "CoreMax", "SignatureRadius", "SensorStrength", "DetectionStrength", "StealthStrength", "Massiveness", "ReactorRadiation", "Slope", "CoreRechargeTime", "BlockingRadius", "HitSize" }; // currentBot.GetType().GetProperties().Select(i => i.Name).ToList(); - - var propNames = ((Robot)currentBot).Properties.Select(x => x.Field.ToString()); - var slotProps = new List { "Capacity", "SlotsHead", "SlotsChassis", "SlotsLegs" }; - // headers.Remove("Definition"); - returnData.Add((new string[] { "Bot Name" }).Concat(headers).Concat(propNames).Concat(slotProps).ToList()); + returnItems.Add(currentView); + } catch (Exception ex) { + Console.WriteLine(ex.Message); } + } - var currentProperties = new List(); - - currentProperties.Add(botName); - - // Parse the object - foreach (string prop in headers) - { - try - { - string errorMessage; - var currentProp = currentBot.GetType().GetProperty(prop); - - if (currentProp == null) - { - currentProperties.Add("Error: Prop not found"); - } - else - { - var currentMethod = currentProp.GetGetMethod(true); - - if (currentMethod == null) - { - currentProperties.Add("Error: Getter not found"); - } - else - { - object value = currentMethod.Invoke(currentBot, null); - string stringValue = value?.ToString() ?? ""; - currentProperties.Add(stringValue.Replace(",", ";")); - } - - } - } - catch (Exception) - { - currentProperties.Add("EXCEPTION"); - } - - } - - Robot input = (Robot)currentBot; - - // Parse the extra properties - foreach (var item in input.Properties) - { - currentProperties.Add(item.Value.ToString()); - } - - RobotHead head = input.GetRobotComponent(); - RobotChassis chassis = input.GetRobotComponent(); - RobotLeg legs = input.GetRobotComponent(); - RobotInventory inventory = input.Components.OfType().SingleOrDefault(); - - currentProperties.Add(inventory.GetCapacityInfo()["capacity"].ToString()); - currentProperties.Add(String.Join(";", head.ED.Options.SlotFlags.Select(x => ((SlotFlags)x).ToString()))); - currentProperties.Add(String.Join(";", chassis.ED.Options.SlotFlags.Select(x => ((SlotFlags)x).ToString().Replace(", ", "|")))); - currentProperties.Add(String.Join(";", legs.ED.Options.SlotFlags.Select(x => ((SlotFlags)x).ToString().Replace(", ", "|")))); - - - - // This returns the ID and required level - var extData = input.ExtensionBonusEnablerExtensions.ToList(); - - for (int i = 1; i <= 10; i++) - { - if (extData.Count >= i) - { - var currentItem = extData[i - 1]; - currentProperties.Add(extensionReader.GetExtensionName(currentItem.id) + "=" + currentItem.level); - } - else - { - currentProperties.Add(""); // Fill in with empty - } - } - - var requiredExtensions = input.ED.EnablerExtensions; // Gets the list of extensiosn required from definition. seems to match above. - - for (int i = 1; i <= 10; i++) - { - var currentKeys = requiredExtensions.Keys.ToList(); - if (currentKeys.Count >= i) - { - var currentItem = currentKeys[i - 1]; - currentProperties.Add(extensionReader.GetExtensionName(currentItem.id) + "=" + currentItem.level); - } - else - { - currentProperties.Add(""); // Fill in with empty - } - } + return returnItems; - // Aggregate field, bonus - var bonuses = input.RobotComponents.SelectMany(component => component.ExtensionBonuses).ToList(); // head.ExtensionBonuses.Concat(chassis.ExtensionBonuses).Concat(legs.ExtensionBonuses).ToList(); + } - for (int i = 1; i <= 10; i++) - { - if (bonuses.Count >= i) - { - var currentItem = bonuses[i - 1]; - currentProperties.Add(extensionReader.GetExtensionName(currentItem.extensionId) + "=" + currentItem.aggregateField + "+" + currentItem.bonus); - } - else - { - currentProperties.Add(""); // Fill in with empty - } - } + var categoryData = GetDataByItemCategoryName(mapping.Category); - // We don't need this since we have the object already - // var extData2 = extensionReader.GetEnablerExtensions(input.Definition); + foreach (var categoryItem in categoryData) { + string itemName = categoryItem["definitionname"].ToString(); + int itemId = (int)categoryItem["definition"]; + try { + object currentObject = entityFactory.Create(itemName, EntityIDGenerator.Random); - returnData.Add(currentProperties); + dynamic currentView = Activator.CreateInstance(mapping.ViewType, currentObject, this); + returnItems.Add(currentView); + } catch (Exception ex) { + Console.WriteLine(ex.Message); } - catch (Exception) - { - returnData.Add(new List { botName, "BIG EXCEPTION" }); - } - } - // now write all the data - string filePath = outputPath; - - System.IO.File.WriteAllLines(filePath, returnData.Select(x => String.Join(",", x))); + } + return returnItems; } diff --git a/Perpetuum.DataDumper/DataExportMapping.cs b/Perpetuum.DataDumper/DataExportMapping.cs index 57d905a06..3ec275eb3 100644 --- a/Perpetuum.DataDumper/DataExportMapping.cs +++ b/Perpetuum.DataDumper/DataExportMapping.cs @@ -1,4 +1,5 @@ -using System; +using Perpetuum.DataDumper.Views; +using System; using System.Collections.Generic; using System.Linq; using System.Text; @@ -20,5 +21,22 @@ public override string ToString() { return ViewType.Name.ToString(); } + public static List Mappings = new List() { + // These universal ones are strange because they're stored in a different category + // even though in the game UI they're the same thing and they have basically the same stats + // Also the univeral one is a regular module while the others are Active + new DataExportMapping("ModuleDrillerStats", typeof(ModuleDrillerDataView), "cf_drillers"), + new DataExportMapping("ModuleArmorHardenerStats", typeof(ModuleArmorHardenerDataView), "cf_armor_hardeners"), + new DataExportMapping("ModuleShieldGeneratorStats", typeof(ModuleShieldGeneratorDataView), "cf_shield_generators"), + new DataExportMapping("ModuleERPStats", typeof(ModuleERPDataView), "cf_kers"), + new DataExportMapping("ModuleRemArmorRepairerStats", typeof(ModuleRemoteArmorRepairerDataView), "cf_remote_armor_repairers"), + new DataExportMapping("ModuleArmorPlateStats", typeof(ModuleArmorPlateDataView), "cf_armor_plates"), + new DataExportMapping("SparkStats", typeof(SparkDataView), ""), + new DataExportMapping("ModuleArmorRepairerStats", typeof(ModuleArmorRepairerDataView), "cf_armor_repair_systems"), + new DataExportMapping("AmmoWeaponStats", typeof(AmmoWeaponDataView), "cf_ammo"), + new DataExportMapping("WeaponStats", typeof(ModuleWeaponDataView), "cf_weapons"), + new DataExportMapping("RobotStats", typeof(RobotDataView), "cf_robot") + }; + } } diff --git a/Perpetuum.DataDumper/DumperForm.cs b/Perpetuum.DataDumper/DumperForm.cs index f902b8068..9824f3f25 100644 --- a/Perpetuum.DataDumper/DumperForm.cs +++ b/Perpetuum.DataDumper/DumperForm.cs @@ -28,27 +28,11 @@ public DumperForm() { PerpetuumLightBootstrapper bootstrapper; - private static List mappings = new List() { - // These universal ones are strange because they're stored in a different category - // even though in the game UI they're the same thing and they have basically the same stats - // Also the univeral one is a regular module while the others are Active - new DataExportMapping("ModuleDrillerStatus", typeof(ModuleDrillerDataView), "cf_drillers"), - new DataExportMapping("ModuleArmorHardenerStats", typeof(ModuleArmorHardenerDataView), "cf_armor_hardeners"), - new DataExportMapping("ModuleShieldGeneratorStats", typeof(ModuleShieldGeneratorDataView), "cf_shield_generators"), - new DataExportMapping("ModuleERPStats", typeof(ModuleERPDataView), "cf_kers"), - new DataExportMapping("ModuleRemArmorRepairerStats", typeof(ModuleRemoteArmorRepairerDataView), "cf_remote_armor_repairers"), - new DataExportMapping("ModuleArmorPlateStats", typeof(ModuleArmorPlateDataView), "cf_armor_plates"), - new DataExportMapping("SparkStats", typeof(SparkDataView), ""), - new DataExportMapping("ModuleArmorRepairerStats", typeof(ModuleArmorRepairerDataView), "cf_armor_repair_systems"), - new DataExportMapping("AmmoWeaponStats", typeof(AmmoWeaponDataView), "cf_ammo"), - new DataExportMapping("WeaponStats", typeof(ModuleWeaponDataView), "cf_weapons") - }; - private void Form1_Load(object sender, EventArgs e) { serverPathTextbox.Text = Properties.Settings.Default.ServerPath; dictionaryPathTextbox.Text = Properties.Settings.Default.DictionaryPath; - foreach (var item in mappings) { + foreach (var item in DataExportMapping.Mappings) { mappingSelectList.Items.Add(item, true); } } @@ -67,8 +51,6 @@ private void StartButton_Click(object sender, EventArgs e) { bootstrapper.InitDumper(Properties.Settings.Default.ServerPath, Properties.Settings.Default.DictionaryPath); - bootstrapper.Dumper.GetRobotData("robot.csv"); - IWorkbook workbook = new XSSFWorkbook(); ISheet definitionsSheet = workbook.CreateSheet("Definitions"); @@ -117,13 +99,13 @@ private void StartButton_Click(object sender, EventArgs e) { } private void allTypesButton_Click(object sender, EventArgs e) { - for (int i = 0; i < mappings.Count; i++) { + for (int i = 0; i < DataExportMapping.Mappings.Count; i++) { mappingSelectList.SetItemChecked(i, true); } } private void clearTypesButton_Click(object sender, EventArgs e) { - for (int i = 0; i < mappings.Count; i++) { + for (int i = 0; i < DataExportMapping.Mappings.Count; i++) { mappingSelectList.SetItemChecked(i, false); } } diff --git a/Perpetuum.DataDumper/Factory/DataDumper.AmmoWeapon.cs b/Perpetuum.DataDumper/Factory/DataDumper.AmmoWeapon.cs deleted file mode 100644 index fd220c3c8..000000000 --- a/Perpetuum.DataDumper/Factory/DataDumper.AmmoWeapon.cs +++ /dev/null @@ -1,53 +0,0 @@ -using Perpetuum.DataDumper.Views; -using Perpetuum.ExportedTypes; -using Perpetuum.Items.Ammos; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using static Perpetuum.DataDumper.DataDumper; - -namespace Perpetuum.DataDumper { - public partial class DataDumper { - public AmmoWeaponDataView NewAmmoWeaponDataView(Ammo item) { - var newView = new AmmoWeaponDataView(); - InitItemView(newView, item); - - var dictionaryData = item.ToDictionary(); - - newView.damage_chemical = item.GetBasePropertyModifier(AggregateField.damage_chemical).Value; - newView.damage_kinetic = item.GetBasePropertyModifier(AggregateField.damage_kinetic).Value; - newView.damage_seismic = item.GetBasePropertyModifier(AggregateField.damage_explosive).Value; - newView.damage_thermal = item.GetBasePropertyModifier(AggregateField.damage_thermal).Value; - newView.damage_toxic = item.GetBasePropertyModifier(AggregateField.damage_toxic).Value; - - newView.modifier_falloff = (item.GetBasePropertyModifier(AggregateField.falloff).Value * 10).ToString(); - newView.explosion_radius = item.GetBasePropertyModifier(AggregateField.explosion_radius).Value; - - // Empty out the 0's - if (newView.damage_chemical == 0) { newView.damage_chemical = null; }; - if (newView.damage_kinetic == 0) { newView.damage_kinetic = null; }; - if (newView.damage_seismic == 0) { newView.damage_seismic = null; }; - if (newView.damage_thermal == 0) { newView.damage_thermal = null; }; - if (newView.damage_toxic == 0) { newView.damage_toxic = null; }; - - if (newView.modifier_falloff == "0") { newView.modifier_falloff = null; }; // keeping this as a string for now because other modules may use it as a modifier? - if (newView.explosion_radius == 0) { newView.explosion_radius = null; }; - - // This will get the property even if it doesn't explicitly exist - // It will be set to the default value, but the HasValue will tell - // us if it's something other than the default - - newView.modifier_range = GetModifierString(item.GetBasePropertyModifier(AggregateField.optimal_range_modifier)); - - var rangeProp = item.GetBasePropertyModifier(AggregateField.optimal_range); - - if (rangeProp.HasValue) { - newView.optimal_range = rangeProp.Value * 10; - } - - return newView; - } - } -} \ No newline at end of file diff --git a/Perpetuum.DataDumper/Factory/DataDumper.ModuleArmorHardener.cs b/Perpetuum.DataDumper/Factory/DataDumper.ModuleArmorHardener.cs deleted file mode 100644 index 2e16d43f2..000000000 --- a/Perpetuum.DataDumper/Factory/DataDumper.ModuleArmorHardener.cs +++ /dev/null @@ -1,61 +0,0 @@ -using Perpetuum.DataDumper.Views; -using Perpetuum.ExportedTypes; -using Perpetuum.Items.Ammos; -using Perpetuum.Modules; -using Perpetuum.Modules.Weapons; -using Perpetuum.Services.ExtensionService; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using static Perpetuum.DataDumper.DataDumper; - -namespace Perpetuum.DataDumper { - public partial class DataDumper { - private void FillModuleData(ModuleArmorHardenerDataView view, Module module) { - view.module_resist_active_chemical = module.GetBasePropertyModifier(AggregateField.effect_resist_chemical).Value; - view.module_resist_passive_chemical = module.GetBasePropertyModifier(AggregateField.resist_chemical).Value; - view.module_resist_active_kinetic = module.GetBasePropertyModifier(AggregateField.effect_resist_kinetic).Value; - view.module_resist_passive_kinetic = module.GetBasePropertyModifier(AggregateField.resist_kinetic).Value; - view.module_resist_active_seismic = module.GetBasePropertyModifier(AggregateField.effect_resist_explosive).Value; - view.module_resist_passive_seismic = module.GetBasePropertyModifier(AggregateField.resist_explosive).Value; - view.module_resist_active_thermal = module.GetBasePropertyModifier(AggregateField.effect_resist_thermal).Value; - view.module_resist_passive_thermal = module.GetBasePropertyModifier(AggregateField.resist_thermal).Value; - - var passives = new List> { - new Tuple(view.module_resist_passive_chemical,view.module_resist_active_chemical, "Chemical"), - new Tuple(view.module_resist_passive_kinetic, view.module_resist_active_kinetic, "Kinetic"), - new Tuple(view.module_resist_passive_seismic, view.module_resist_active_seismic, "Seismic"), - new Tuple(view.module_resist_passive_thermal, view.module_resist_active_thermal, "Thermal") - }; - - if (passives.Where(x => x.Item1 != 0).Count() > 1) { - view.module_resist_type = "All"; - view.module_resist_passive = module.GetBasePropertyModifier(AggregateField.resist_chemical).Value; - } else { - var activeType = passives.Where(x => x.Item1 != 0).Single(); - view.module_resist_type = activeType.Item3; - view.module_resist_passive = activeType.Item1; - view.module_resist_active = activeType.Item2; - } - } - public ModuleArmorHardenerDataView NewModuleArmorHardenerDataView(ActiveModule module) { - var newView = new ModuleArmorHardenerDataView(); - InitActiveModuleView(newView, module); - - FillModuleData(newView, module); - - return newView; - } - - public ModuleArmorHardenerDataView NewModuleArmorHardenerDataView(Module module) { - var newView = new ModuleArmorHardenerDataView(); - InitModuleView(newView, module); - - FillModuleData(newView, module); - - return newView; - } - } -} \ No newline at end of file diff --git a/Perpetuum.DataDumper/Factory/DataDumper.ModuleArmorPlate.cs b/Perpetuum.DataDumper/Factory/DataDumper.ModuleArmorPlate.cs deleted file mode 100644 index d1392613e..000000000 --- a/Perpetuum.DataDumper/Factory/DataDumper.ModuleArmorPlate.cs +++ /dev/null @@ -1,27 +0,0 @@ -using Perpetuum.DataDumper.Views; -using Perpetuum.ExportedTypes; -using Perpetuum.Items.Ammos; -using Perpetuum.Modules; -using Perpetuum.Modules.Weapons; -using Perpetuum.Services.ExtensionService; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using static Perpetuum.DataDumper.DataDumper; - -namespace Perpetuum.DataDumper { - public partial class DataDumper { - public ModuleArmorPlateDataView NewModuleArmorPlateDataView(Module module) { - var newView = new ModuleArmorPlateDataView(); - InitModuleView(newView, module); - - newView.module_hp = module.GetBasePropertyModifier(AggregateField.armor_max).Value; - newView.module_demob_resist = module.GetBasePropertyModifier(AggregateField.massiveness).Value * 100; - newView.module_surface_hit = module.GetBasePropertyModifier(AggregateField.signature_radius).Value; - - return newView; - } - } -} \ No newline at end of file diff --git a/Perpetuum.DataDumper/Factory/DataDumper.ModuleArmorRepair.cs b/Perpetuum.DataDumper/Factory/DataDumper.ModuleArmorRepair.cs deleted file mode 100644 index 863b57f25..000000000 --- a/Perpetuum.DataDumper/Factory/DataDumper.ModuleArmorRepair.cs +++ /dev/null @@ -1,37 +0,0 @@ -using Perpetuum.DataDumper.Views; -using Perpetuum.ExportedTypes; -using Perpetuum.Items.Ammos; -using Perpetuum.Modules; -using Perpetuum.Modules.Weapons; -using Perpetuum.Services.ExtensionService; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using static Perpetuum.DataDumper.DataDumper; - -namespace Perpetuum.DataDumper { - public partial class DataDumper { - public ModuleArmorRepairerDataView NewModuleArmorRepairDataView(ArmorRepairModule module) { - var newView = new ModuleArmorRepairerDataView(); - InitItemView(newView, module); - - var dictionaryData = module.ToDictionary(); - - // Now we are ready to map up the data - newView.module_tier = module.ED.GameTierString(); - newView.cpu = module.CpuUsage; - newView.reactor = module.PowerGridUsage; - newView.module_accumulator = module.CoreUsage; - newView.module_cycle = module.CycleTime.TotalSeconds; - newView.module_repair_amount = module.GetBasePropertyModifier(AggregateField.armor_repair_amount).Value; - - foreach (var extension in module.ED.EnablerExtensions.Keys) { - newView.module_extensions_required += GetLocalizedName(extensionReader.GetExtensionName(extension.id)) + "(" + extension.level + ");"; - } - - return newView; - } - } -} \ No newline at end of file diff --git a/Perpetuum.DataDumper/Factory/DataDumper.ModuleDriller.cs b/Perpetuum.DataDumper/Factory/DataDumper.ModuleDriller.cs deleted file mode 100644 index 8c4512d02..000000000 --- a/Perpetuum.DataDumper/Factory/DataDumper.ModuleDriller.cs +++ /dev/null @@ -1,25 +0,0 @@ -using Perpetuum.DataDumper.Views; -using Perpetuum.ExportedTypes; -using Perpetuum.Items.Ammos; -using Perpetuum.Modules; -using Perpetuum.Modules.Weapons; -using Perpetuum.Services.ExtensionService; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using static Perpetuum.DataDumper.DataDumper; - -namespace Perpetuum.DataDumper { - public partial class DataDumper { - public ModuleDrillerDataView NewModuleDrillerDataView(DrillerModule module) { - var newView = new ModuleDrillerDataView(); - InitActiveModuleView(newView, module); - - newView.module_mining_modifier = module.GetBasePropertyModifier(AggregateField.mining_amount_modifier).Value; - - return newView; - } - } -} \ No newline at end of file diff --git a/Perpetuum.DataDumper/Factory/DataDumper.ModuleERP.cs b/Perpetuum.DataDumper/Factory/DataDumper.ModuleERP.cs deleted file mode 100644 index a2286efa3..000000000 --- a/Perpetuum.DataDumper/Factory/DataDumper.ModuleERP.cs +++ /dev/null @@ -1,28 +0,0 @@ -using Perpetuum.DataDumper.Views; -using Perpetuum.ExportedTypes; -using Perpetuum.Items.Ammos; -using Perpetuum.Modules; -using Perpetuum.Modules.Weapons; -using Perpetuum.Services.ExtensionService; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using static Perpetuum.DataDumper.DataDumper; - -namespace Perpetuum.DataDumper { - public partial class DataDumper { - public ModuleERPDataView NewModuleERPDataView(Module module) { - var newView = new ModuleERPDataView(); - InitModuleView(newView, module); - - newView.module_recovery_chemical = module.GetBasePropertyModifier(AggregateField.chemical_damage_to_core_modifier).Value * 100; - newView.module_recovery_kinetic = module.GetBasePropertyModifier(AggregateField.kinetic_damage_to_core_modifier).Value * 100; - newView.module_recovery_seismic = module.GetBasePropertyModifier(AggregateField.explosive_damage_to_core_modifier).Value * 100; - newView.module_recovery_thermal = module.GetBasePropertyModifier(AggregateField.thermal_damage_to_core_modifier).Value * 100; - - return newView; - } - } -} \ No newline at end of file diff --git a/Perpetuum.DataDumper/Factory/DataDumper.ModuleRemoteArmorRepair.cs b/Perpetuum.DataDumper/Factory/DataDumper.ModuleRemoteArmorRepair.cs deleted file mode 100644 index e79c99cba..000000000 --- a/Perpetuum.DataDumper/Factory/DataDumper.ModuleRemoteArmorRepair.cs +++ /dev/null @@ -1,26 +0,0 @@ -using Perpetuum.DataDumper.Views; -using Perpetuum.ExportedTypes; -using Perpetuum.Items.Ammos; -using Perpetuum.Modules; -using Perpetuum.Modules.Weapons; -using Perpetuum.Services.ExtensionService; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using static Perpetuum.DataDumper.DataDumper; - -namespace Perpetuum.DataDumper { - public partial class DataDumper { - public ModuleRemoteArmorRepairerDataView NewModuleRemoteArmorRepairerDataView(ActiveModule module) { - var newView = new ModuleRemoteArmorRepairerDataView(); - InitActiveModuleView(newView, module); - - newView.module_optimal_range = module.GetBasePropertyModifier(AggregateField.optimal_range).Value * 10; - newView.module_repair_amount = module.GetBasePropertyModifier(AggregateField.armor_repair_amount).Value; - - return newView; - } - } -} \ No newline at end of file diff --git a/Perpetuum.DataDumper/Factory/DataDumper.ModuleShieldGenerator.cs b/Perpetuum.DataDumper/Factory/DataDumper.ModuleShieldGenerator.cs deleted file mode 100644 index 5c1bef45b..000000000 --- a/Perpetuum.DataDumper/Factory/DataDumper.ModuleShieldGenerator.cs +++ /dev/null @@ -1,26 +0,0 @@ -using Perpetuum.DataDumper.Views; -using Perpetuum.ExportedTypes; -using Perpetuum.Items.Ammos; -using Perpetuum.Modules; -using Perpetuum.Modules.Weapons; -using Perpetuum.Services.ExtensionService; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using static Perpetuum.DataDumper.DataDumper; - -namespace Perpetuum.DataDumper { - public partial class DataDumper { - public ModuleShieldGeneratorDataView NewModuleShieldGeneratorDataView(ActiveModule module) { - var newView = new ModuleShieldGeneratorDataView(); - InitActiveModuleView(newView, module); - - newView.module_shield_radius = module.GetBasePropertyModifier(AggregateField.shield_radius).Value; - newView.module_absorption_ratio = Math.Round(1 / module.GetBasePropertyModifier(AggregateField.shield_absorbtion).Value, 3); - - return newView; - } - } -} \ No newline at end of file diff --git a/Perpetuum.DataDumper/Factory/DataDumper.ModuleWeapon.cs b/Perpetuum.DataDumper/Factory/DataDumper.ModuleWeapon.cs deleted file mode 100644 index 114da8885..000000000 --- a/Perpetuum.DataDumper/Factory/DataDumper.ModuleWeapon.cs +++ /dev/null @@ -1,59 +0,0 @@ -using Perpetuum.DataDumper.Views; -using Perpetuum.ExportedTypes; -using Perpetuum.Items.Ammos; -using Perpetuum.Modules.Weapons; -using Perpetuum.Services.ExtensionService; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using static Perpetuum.DataDumper.DataDumper; - -namespace Perpetuum.DataDumper { - public partial class DataDumper { - public ModuleWeaponDataView NewWeaponModuleDataView(WeaponModule module) { - var newView = new ModuleWeaponDataView(); - InitItemView(newView, module); - - var dictionaryData = module.ToDictionary(); - - dictionaryData["ammoCategoryFlags"] = (CategoryFlags)dictionaryData["ammoCategoryFlags"]; - - // Now we are ready to map up the data - newView.cpu = module.CpuUsage; - newView.reactor = module.PowerGridUsage; - newView.ammo_type = GetLocalizedName(((CategoryFlags)dictionaryData["ammoCategoryFlags"]).ToString()).Replace(";undefined", ""); - newView.slot_status = module.ED.AttributeFlags.ActiveModule ? "Active" : "Passive"; - newView.slot_flags = module.ModuleFlag.ToString(); - newView.ammo_capacity = module.AmmoCapacity; - newView.module_tier = module.ED.GameTierString(); - - newView.module_accumulator = module.CoreUsage; - newView.module_cycle = module.CycleTime.TotalSeconds; - newView.module_damage = module.DamageModifier.Value * 100; - newView.module_falloff = module.Properties.Single(x => x.Field == AggregateField.falloff).Value * 10; - newView.module_hit_dispersion = module.Accuracy.Value; - newView.module_optimal_range = module.OptimalRange * 10; - - var rangeModifierProperty = module.GetBasePropertyModifier(AggregateField.module_missile_range_modifier); - - if (rangeModifierProperty.HasValue) { - string directionSymbol = "+"; - - if (rangeModifierProperty.Value < 0) { - directionSymbol = "-"; - } - - newView.missile_optimal_range = directionSymbol + (rangeModifierProperty.Value - 1) * 100 + "%"; - - } - - foreach (var extension in module.ED.EnablerExtensions.Keys) { - newView.module_extensions_required += GetLocalizedName(extensionReader.GetExtensionName(extension.id)) + "(" + extension.level + ");"; - } - - return newView; - } - } -} \ No newline at end of file diff --git a/Perpetuum.DataDumper/Factory/DataDumper.Resolver.cs b/Perpetuum.DataDumper/Factory/DataDumper.Resolver.cs deleted file mode 100644 index 0d656ced3..000000000 --- a/Perpetuum.DataDumper/Factory/DataDumper.Resolver.cs +++ /dev/null @@ -1,96 +0,0 @@ -using Open.Nat; -using Perpetuum.DataDumper.Views; -using Perpetuum.EntityFramework; -using Perpetuum.Items.Ammos; -using Perpetuum.Modules; -using Perpetuum.Modules.Weapons; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Perpetuum.DataDumper { - public partial class DataDumper { - public dynamic DumpDataView(DataExportMapping mapping) { - Type[] typeArgs = new Type[] { typeof(string) }; - var reflectedMethod = typeof(DataDumper).GetMethod("DumpDataView", typeArgs); - var genericMethod = reflectedMethod.MakeGenericMethod(mapping.ViewType); - dynamic results = genericMethod.Invoke(this, new object[] { mapping.Category }); - - // No need, just use dynamic - //var listType = typeof(List<>).MakeGenericType(mapping.ViewType); - - //var typedResults = Convert.ChangeType(results, listType); - return results; - } - - public List DumpDataView(string categoryName) where T : EntityDataView { - var returnItems = new List(); - - // Handle sparks first, refactor later - if (typeof(T) == typeof(SparkDataView)) { - var sparkData = sparkRepository.GetAll(); - - foreach (var spark in sparkData) { - try { - var currentView = NewSparkDataView(spark); - - returnItems.Add(currentView as T); - } catch (Exception ex) { - Console.WriteLine(ex.Message); - } - } - - return returnItems; - - } - - var categoryData = GetDataByItemCategoryName(categoryName); - - foreach (var categoryItem in categoryData) { - T currentView; - - string itemName = categoryItem["definitionname"].ToString(); - int itemId = (int)categoryItem["definition"]; - - try { - object currentObject = entityFactory.Create(itemName, EntityIDGenerator.Random); - - - if (typeof(T) == typeof(ModuleWeaponDataView)) { - currentView = NewWeaponModuleDataView(currentObject as WeaponModule) as T; - } else if (typeof(T) == typeof(AmmoWeaponDataView)) { - currentView = NewAmmoWeaponDataView(currentObject as Ammo) as T; - } else if (typeof(T) == typeof(ModuleArmorRepairerDataView)) { - currentView = NewModuleArmorRepairDataView(currentObject as ArmorRepairModule) as T; - } else if (typeof(T) == typeof(ModuleArmorPlateDataView)) { - currentView = NewModuleArmorPlateDataView(currentObject as Module) as T; - } else if (typeof(T) == typeof(ModuleRemoteArmorRepairerDataView)) { - currentView = NewModuleRemoteArmorRepairerDataView(currentObject as ActiveModule) as T; - } else if (typeof(T) == typeof(ModuleERPDataView)) { - currentView = NewModuleERPDataView(currentObject as Module) as T; - } else if (typeof(T) == typeof(ModuleShieldGeneratorDataView)) { - currentView = NewModuleShieldGeneratorDataView(currentObject as ActiveModule) as T; - } else if (typeof(T) == typeof(ModuleArmorHardenerDataView)) { - if (currentObject.GetType() == typeof(Perpetuum.Modules.EffectModules.ArmorHardenerModule)) { - currentView = NewModuleArmorHardenerDataView(currentObject as ActiveModule) as T; - } else { - currentView = NewModuleArmorHardenerDataView(currentObject as Module) as T; - } - } else if (typeof(T) == typeof(ModuleDrillerDataView)) { - currentView = NewModuleDrillerDataView(currentObject as DrillerModule) as T; - } else { - continue; - } - - returnItems.Add(currentView); - } catch (Exception ex) { - Console.WriteLine(ex.Message); - } - - } - return returnItems; - } - } -} diff --git a/Perpetuum.DataDumper/Factory/DataDumper.Spark.cs b/Perpetuum.DataDumper/Factory/DataDumper.Spark.cs deleted file mode 100644 index da0df85e8..000000000 --- a/Perpetuum.DataDumper/Factory/DataDumper.Spark.cs +++ /dev/null @@ -1,90 +0,0 @@ -using Perpetuum.DataDumper.Views; -using Perpetuum.ExportedTypes; -using Perpetuum.Groups.Alliances; -using Perpetuum.Items.Ammos; -using Perpetuum.Services.ExtensionService; -using Perpetuum.Services.Sparks; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using static Perpetuum.DataDumper.DataDumper; - -namespace Perpetuum.DataDumper { - public partial class DataDumper { - private string SparkBonusString(string extensionName, int value) { - var formulaStrings = new List { "{%BONUS100%}", "{%BONUS%}" }; - - // First check if the localized name exists - var localName = GetLocalizedName(extensionName); - - if (localName == extensionName) { - // This means the desc wasn't found - localName = GetLocalizedName(extensionName + "_desc"); - - foreach (var formula in formulaStrings) { - localName = localName.Replace(formula, value.ToString()); - } - - } - - return localName; - } - - public SparkDataView NewSparkDataView(Spark spark) { - var view = new SparkDataView(); - - view.item_name = GetLocalizedName(spark.sparkName); - view.item_key = spark.sparkName; - // view.item_categories - view.price_equip = spark.changePrice; - view.price_purchase = spark.unlockPrice; - view.required_standing = spark.standingLimit * 100; - view.sequence = spark.displayOrder; - view.icon = spark.icon; - view.energy_prop = spark.energyCredit.ToString(); - - if (spark.allianceEid.HasValue) { - // For some reason the Alliance object doesn't pull over the name - // so we need to pull it as an eneity - // var currentAlliance = Alliance.Repository.Load(spark.allianceEid); - - // Trying as an entity doesn't work either - // var currentAlliance = entityServices.Repository.Load(.Value); - - - var allianceData = AllianceHelper.GetAllianceInfo(); - - foreach (var allianceInfo in allianceData) { - var childDict = (Dictionary) allianceInfo.Value; - long allianceEid = (long) childDict["allianceEID"]; - string allianceName = (string) childDict["name"]; - - if (allianceEid == spark.allianceEid) { - view.alliance = GetLocalizedName(allianceName); - break; - } - } - } - - var extensions = new Dictionary(); - var extensionStrings = new List(); - - foreach (Extension extension in spark.RelatedExtensions) { - var extensionInfo = extensionReader.GetExtensionByID(extension.id); - - extensions.Add(extensionInfo.name, extension.level); - - string localName = SparkBonusString(extensionInfo.name, extension.level); - - extensionStrings.Add(localName); - - } - - view.extensions = String.Join(";", extensionStrings); - - return view; - } - } -} \ No newline at end of file diff --git a/Perpetuum.DataDumper/CargoTypeAttribute.cs b/Perpetuum.DataDumper/Helpers/CargoTypeAttribute.cs similarity index 100% rename from Perpetuum.DataDumper/CargoTypeAttribute.cs rename to Perpetuum.DataDumper/Helpers/CargoTypeAttribute.cs diff --git a/Perpetuum.DataDumper/EnumHelper.cs b/Perpetuum.DataDumper/Helpers/EnumHelper.cs similarity index 100% rename from Perpetuum.DataDumper/EnumHelper.cs rename to Perpetuum.DataDumper/Helpers/EnumHelper.cs diff --git a/Perpetuum.DataDumper/ExtensionMethods.cs b/Perpetuum.DataDumper/Helpers/ExtensionMethods.cs similarity index 100% rename from Perpetuum.DataDumper/ExtensionMethods.cs rename to Perpetuum.DataDumper/Helpers/ExtensionMethods.cs diff --git a/Perpetuum.DataDumper/Perpetuum.DataDumper.csproj b/Perpetuum.DataDumper/Perpetuum.DataDumper.csproj index c34079102..c1ee86687 100644 --- a/Perpetuum.DataDumper/Perpetuum.DataDumper.csproj +++ b/Perpetuum.DataDumper/Perpetuum.DataDumper.csproj @@ -86,34 +86,26 @@ - + + + - - - - - - - - - - - - - + + Form DumperForm.cs + + - + - @@ -168,5 +160,6 @@ Perpetuum + \ No newline at end of file diff --git a/Perpetuum.DataDumper/Views/AmmoWeaponDataView.cs b/Perpetuum.DataDumper/Views/AmmoWeaponDataView.cs index 14f5a9101..96df8a690 100644 --- a/Perpetuum.DataDumper/Views/AmmoWeaponDataView.cs +++ b/Perpetuum.DataDumper/Views/AmmoWeaponDataView.cs @@ -1,4 +1,5 @@ -using Perpetuum.Items.Ammos; +using Perpetuum.ExportedTypes; +using Perpetuum.Items.Ammos; using System; using System.Collections.Generic; using System.Linq; @@ -19,5 +20,44 @@ public class AmmoWeaponDataView : ItemDataView { public string modifier_range { get; set; } public string modifier_falloff { get; set; } + public AmmoWeaponDataView(Ammo item, DataDumper dumper) { + dumper.InitItemView(this, item); + + var dictionaryData = item.ToDictionary(); + + damage_chemical = item.GetBasePropertyModifier(AggregateField.damage_chemical).Value; + damage_kinetic = item.GetBasePropertyModifier(AggregateField.damage_kinetic).Value; + damage_seismic = item.GetBasePropertyModifier(AggregateField.damage_explosive).Value; + damage_thermal = item.GetBasePropertyModifier(AggregateField.damage_thermal).Value; + damage_toxic = item.GetBasePropertyModifier(AggregateField.damage_toxic).Value; + + modifier_falloff = (item.GetBasePropertyModifier(AggregateField.falloff).Value * 10).ToString(); + explosion_radius = item.GetBasePropertyModifier(AggregateField.explosion_radius).Value; + + // Empty out the 0's + if (damage_chemical == 0) { damage_chemical = null; }; + if (damage_kinetic == 0) { damage_kinetic = null; }; + if (damage_seismic == 0) { damage_seismic = null; }; + if (damage_thermal == 0) { damage_thermal = null; }; + if (damage_toxic == 0) { damage_toxic = null; }; + + if (modifier_falloff == "0") { modifier_falloff = null; }; // keeping this as a string for now because other modules may use it as a modifier? + if (explosion_radius == 0) { explosion_radius = null; }; + + // This will get the property even if it doesn't explicitly exist + // It will be set to the default value, but the HasValue will tell + // us if it's something other than the default + + modifier_range = GetModifierString(item.GetBasePropertyModifier(AggregateField.optimal_range_modifier)); + + var rangeProp = item.GetBasePropertyModifier(AggregateField.optimal_range); + + if (rangeProp.HasValue) { + optimal_range = rangeProp.Value * 10; + } + } + } + + } diff --git a/Perpetuum.DataDumper/Views/ModuleArmorHardenerDataView.cs b/Perpetuum.DataDumper/Views/ModuleArmorHardenerDataView.cs index f61837d09..bf0dcd339 100644 --- a/Perpetuum.DataDumper/Views/ModuleArmorHardenerDataView.cs +++ b/Perpetuum.DataDumper/Views/ModuleArmorHardenerDataView.cs @@ -1,4 +1,5 @@ using Perpetuum.Containers; +using Perpetuum.ExportedTypes; using Perpetuum.Modules; using Perpetuum.Modules.Weapons; using System; @@ -22,5 +23,46 @@ public class ModuleArmorHardenerDataView : ActiveModuleDataView { public string module_resist_type { get; set; } public double module_resist_passive { get; set; } public double module_resist_active { get; set; } + + public ModuleArmorHardenerDataView(ActiveModule item, DataDumper dumper) { + dumper.InitActiveModuleView(this, item); + + FillModuleData(item); + } + + public ModuleArmorHardenerDataView(Module item, DataDumper dumper) { + dumper.InitModuleView(this, item); + + FillModuleData(item); + } + + private void FillModuleData(Module module) { + module_resist_active_chemical = module.GetBasePropertyModifier(AggregateField.effect_resist_chemical).Value; + module_resist_passive_chemical = module.GetBasePropertyModifier(AggregateField.resist_chemical).Value; + module_resist_active_kinetic = module.GetBasePropertyModifier(AggregateField.effect_resist_kinetic).Value; + module_resist_passive_kinetic = module.GetBasePropertyModifier(AggregateField.resist_kinetic).Value; + module_resist_active_seismic = module.GetBasePropertyModifier(AggregateField.effect_resist_explosive).Value; + module_resist_passive_seismic = module.GetBasePropertyModifier(AggregateField.resist_explosive).Value; + module_resist_active_thermal = module.GetBasePropertyModifier(AggregateField.effect_resist_thermal).Value; + module_resist_passive_thermal = module.GetBasePropertyModifier(AggregateField.resist_thermal).Value; + + var passives = new List> { + new Tuple(module_resist_passive_chemical,module_resist_active_chemical, "Chemical"), + new Tuple(module_resist_passive_kinetic, module_resist_active_kinetic, "Kinetic"), + new Tuple(module_resist_passive_seismic, module_resist_active_seismic, "Seismic"), + new Tuple(module_resist_passive_thermal, module_resist_active_thermal, "Thermal") + }; + + if (passives.Where(x => x.Item1 != 0).Count() > 1) { + module_resist_type = "All"; + module_resist_passive = module.GetBasePropertyModifier(AggregateField.resist_chemical).Value; + } else { + var activeType = passives.Where(x => x.Item1 != 0).Single(); + module_resist_type = activeType.Item3; + module_resist_passive = activeType.Item1; + module_resist_active = activeType.Item2; + } + } } + } diff --git a/Perpetuum.DataDumper/Views/ModuleArmorPlateView.cs b/Perpetuum.DataDumper/Views/ModuleArmorPlateView.cs index b373c34e7..095918499 100644 --- a/Perpetuum.DataDumper/Views/ModuleArmorPlateView.cs +++ b/Perpetuum.DataDumper/Views/ModuleArmorPlateView.cs @@ -1,4 +1,5 @@ using Perpetuum.Containers; +using Perpetuum.ExportedTypes; using Perpetuum.Modules; using Perpetuum.Modules.Weapons; using System; @@ -13,5 +14,13 @@ public class ModuleArmorPlateDataView : ModuleDataView { public double module_hp { get; set; } public double module_surface_hit { get; set; } public double module_demob_resist { get; set; } + + public ModuleArmorPlateDataView(Module item, DataDumper dumper) { + dumper.InitModuleView(this, item); + + module_hp = item.GetBasePropertyModifier(AggregateField.armor_max).Value; + module_demob_resist = item.GetBasePropertyModifier(AggregateField.massiveness).Value * 100; + module_surface_hit = item.GetBasePropertyModifier(AggregateField.signature_radius).Value; + } } } diff --git a/Perpetuum.DataDumper/Views/ModuleArmorRepairerDataView.cs b/Perpetuum.DataDumper/Views/ModuleArmorRepairerDataView.cs index 0ef7e1ba9..467a56f0b 100644 --- a/Perpetuum.DataDumper/Views/ModuleArmorRepairerDataView.cs +++ b/Perpetuum.DataDumper/Views/ModuleArmorRepairerDataView.cs @@ -1,4 +1,5 @@ using Perpetuum.Containers; +using Perpetuum.ExportedTypes; using Perpetuum.Modules; using Perpetuum.Modules.Weapons; using System; @@ -9,15 +10,14 @@ using static Perpetuum.DataDumper.DataDumper; namespace Perpetuum.DataDumper.Views { - public class ModuleArmorRepairerDataView : ItemDataView { - public string module_tier { get; set; } - public double cpu { get; set; } - public double reactor { get; set; } - - public double module_accumulator { get; set; } - public double module_cycle { get; set; } + public class ModuleArmorRepairerDataView : ActiveModuleDataView { public double module_repair_amount { get; set; } - public string module_extensions_required { get; set; } + public ModuleArmorRepairerDataView(ArmorRepairModule item, DataDumper dumper) { + dumper.InitActiveModuleView(this, item); + + module_repair_amount = item.GetBasePropertyModifier(AggregateField.armor_repair_amount).Value; + + } } } diff --git a/Perpetuum.DataDumper/Views/ModuleDrillerDataView.cs b/Perpetuum.DataDumper/Views/ModuleDrillerDataView.cs index 7595f8ff2..e7f30f2ab 100644 --- a/Perpetuum.DataDumper/Views/ModuleDrillerDataView.cs +++ b/Perpetuum.DataDumper/Views/ModuleDrillerDataView.cs @@ -1,4 +1,5 @@ using Perpetuum.Containers; +using Perpetuum.ExportedTypes; using Perpetuum.Modules; using Perpetuum.Modules.Weapons; using System; @@ -12,5 +13,10 @@ namespace Perpetuum.DataDumper.Views { public class ModuleDrillerDataView : ActiveModuleDataView { public double module_mining_modifier { get; set; } + public ModuleDrillerDataView(DrillerModule item, DataDumper dumper) { + dumper.InitActiveModuleView(this, item); + + module_mining_modifier = item.GetBasePropertyModifier(AggregateField.mining_amount_modifier).Value; + } } } diff --git a/Perpetuum.DataDumper/Views/ModuleERPDataView.cs b/Perpetuum.DataDumper/Views/ModuleERPDataView.cs index d39688adc..1790c3eb9 100644 --- a/Perpetuum.DataDumper/Views/ModuleERPDataView.cs +++ b/Perpetuum.DataDumper/Views/ModuleERPDataView.cs @@ -1,4 +1,5 @@ using Perpetuum.Containers; +using Perpetuum.ExportedTypes; using Perpetuum.Modules; using Perpetuum.Modules.Weapons; using System; @@ -15,5 +16,14 @@ public class ModuleERPDataView : ActiveModuleDataView { public double module_recovery_kinetic { get; set; } public double module_recovery_seismic { get; set; } public double module_recovery_thermal { get; set; } + + public ModuleERPDataView(Module item, DataDumper dumper) { + dumper.InitModuleView(this, item); + + module_recovery_chemical = item.GetBasePropertyModifier(AggregateField.chemical_damage_to_core_modifier).Value * 100; + module_recovery_kinetic = item.GetBasePropertyModifier(AggregateField.kinetic_damage_to_core_modifier).Value * 100; + module_recovery_seismic = item.GetBasePropertyModifier(AggregateField.explosive_damage_to_core_modifier).Value * 100; + module_recovery_thermal = item.GetBasePropertyModifier(AggregateField.thermal_damage_to_core_modifier).Value * 100; + } } } diff --git a/Perpetuum.DataDumper/Views/ModuleRemoteArmorRepairerDataView.cs b/Perpetuum.DataDumper/Views/ModuleRemoteArmorRepairerDataView.cs index bf25cafe9..76057e2b5 100644 --- a/Perpetuum.DataDumper/Views/ModuleRemoteArmorRepairerDataView.cs +++ b/Perpetuum.DataDumper/Views/ModuleRemoteArmorRepairerDataView.cs @@ -1,4 +1,5 @@ using Perpetuum.Containers; +using Perpetuum.ExportedTypes; using Perpetuum.Modules; using Perpetuum.Modules.Weapons; using System; @@ -13,5 +14,12 @@ public class ModuleRemoteArmorRepairerDataView : ActiveModuleDataView { public double module_repair_amount { get; set; } public double module_optimal_range { get; set; } + + public ModuleRemoteArmorRepairerDataView(ActiveModule item, DataDumper dumper) { + dumper.InitActiveModuleView(this, item); + + module_optimal_range = item.GetBasePropertyModifier(AggregateField.optimal_range).Value * 10; + module_repair_amount = item.GetBasePropertyModifier(AggregateField.armor_repair_amount).Value; + } } -} +} \ No newline at end of file diff --git a/Perpetuum.DataDumper/Views/ModuleResistancePlatingDataView.cs b/Perpetuum.DataDumper/Views/ModuleResistancePlatingDataView.cs deleted file mode 100644 index 635177265..000000000 --- a/Perpetuum.DataDumper/Views/ModuleResistancePlatingDataView.cs +++ /dev/null @@ -1,15 +0,0 @@ -using Perpetuum.Containers; -using Perpetuum.Modules; -using Perpetuum.Modules.Weapons; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using static Perpetuum.DataDumper.DataDumper; - -namespace Perpetuum.DataDumper.Views { - public class ModuleResistancePlatingDataView : ModuleArmorHardenerDataView { - - } -} diff --git a/Perpetuum.DataDumper/Views/ModuleShieldGeneratorDataView.cs b/Perpetuum.DataDumper/Views/ModuleShieldGeneratorDataView.cs index c9221fe84..b68a83f06 100644 --- a/Perpetuum.DataDumper/Views/ModuleShieldGeneratorDataView.cs +++ b/Perpetuum.DataDumper/Views/ModuleShieldGeneratorDataView.cs @@ -1,4 +1,5 @@ using Perpetuum.Containers; +using Perpetuum.ExportedTypes; using Perpetuum.Modules; using Perpetuum.Modules.Weapons; using System; @@ -13,5 +14,12 @@ public class ModuleShieldGeneratorDataView : ActiveModuleDataView { public double module_shield_radius { get; set; } public double module_absorption_ratio { get; set; } + + public ModuleShieldGeneratorDataView(ActiveModule item, DataDumper dumper) { + dumper.InitActiveModuleView(this, item); + + module_shield_radius = item.GetBasePropertyModifier(AggregateField.shield_radius).Value; + module_absorption_ratio = Math.Round(1 / item.GetBasePropertyModifier(AggregateField.shield_absorbtion).Value, 3); + } } } diff --git a/Perpetuum.DataDumper/Views/ModuleWeaponDataView.cs b/Perpetuum.DataDumper/Views/ModuleWeaponDataView.cs index d23457c91..f4d49c413 100644 --- a/Perpetuum.DataDumper/Views/ModuleWeaponDataView.cs +++ b/Perpetuum.DataDumper/Views/ModuleWeaponDataView.cs @@ -1,4 +1,5 @@ -using Perpetuum.Modules; +using Perpetuum.ExportedTypes; +using Perpetuum.Modules; using Perpetuum.Modules.Weapons; using System; using System.Collections.Generic; @@ -8,25 +9,15 @@ using static Perpetuum.DataDumper.DataDumper; namespace Perpetuum.DataDumper.Views { - public class ModuleWeaponDataView : ItemDataView { - public double cpu { get; set; } - public double reactor { get; set; } + public class ModuleWeaponDataView : ActiveModuleDataView { public string ammo_type { get; set; } - public string slot_status { get; set; } - public int ammo_capacity { get; set; } - - public string module_tier { get; set; } - - public double module_accumulator { get; set; } - public double module_cycle { get; set; } public double module_damage { get; set; } public double module_falloff { get; set; } public double module_hit_dispersion { get; set; } public double module_optimal_range { get; set; } public string missile_optimal_range { get; set; } - public string module_extensions_required { get; set; } - + private List slot_flag_values; public string slot_flags { get { @@ -54,5 +45,34 @@ public string slot_location { } } + public ModuleWeaponDataView(WeaponModule item, DataDumper dumper) { + dumper.InitActiveModuleView(this, item); + + var dictionaryData = item.ToDictionary(); + + dictionaryData["ammoCategoryFlags"] = (CategoryFlags)dictionaryData["ammoCategoryFlags"]; + + ammo_type = dumper.GetLocalizedName(((CategoryFlags)dictionaryData["ammoCategoryFlags"]).ToString()).Replace(";undefined", ""); + slot_flags = item.ModuleFlag.ToString(); + ammo_capacity = item.AmmoCapacity; + module_damage = item.DamageModifier.Value * 100; + module_falloff = item.Properties.Single(x => x.Field == AggregateField.falloff).Value * 10; + module_hit_dispersion = item.Accuracy.Value; + module_optimal_range = item.OptimalRange * 10; + + var rangeModifierProperty = item.GetBasePropertyModifier(AggregateField.module_missile_range_modifier); + + if (rangeModifierProperty.HasValue) { + string directionSymbol = "+"; + + if (rangeModifierProperty.Value < 0) { + directionSymbol = "-"; + } + + missile_optimal_range = directionSymbol + (rangeModifierProperty.Value - 1) * 100 + "%"; + + } + } + } } diff --git a/Perpetuum.DataDumper/RobotDataView.cs b/Perpetuum.DataDumper/Views/RobotDataView.cs similarity index 99% rename from Perpetuum.DataDumper/RobotDataView.cs rename to Perpetuum.DataDumper/Views/RobotDataView.cs index b9b4527ea..a254cddd2 100644 --- a/Perpetuum.DataDumper/RobotDataView.cs +++ b/Perpetuum.DataDumper/Views/RobotDataView.cs @@ -8,7 +8,7 @@ namespace Perpetuum.DataDumper { class RobotDataView { - // Main Status + // Main Stats public double Speed { get; set; } public double Armor { get; set; } public double Accumulator { get; set; } diff --git a/Perpetuum.DataDumper/Views/SparkDataView.cs b/Perpetuum.DataDumper/Views/SparkDataView.cs index 21966f0af..a2a813cf5 100644 --- a/Perpetuum.DataDumper/Views/SparkDataView.cs +++ b/Perpetuum.DataDumper/Views/SparkDataView.cs @@ -1,4 +1,8 @@ -using Perpetuum.Items.Ammos; +using NPOI.POIFS.Storage; +using Perpetuum.Groups.Alliances; +using Perpetuum.Items.Ammos; +using Perpetuum.Services.ExtensionService; +using Perpetuum.Services.Sparks; using System; using System.Collections.Generic; using System.Linq; @@ -16,5 +20,76 @@ public class SparkDataView : EntityDataView { public string extensions { get; set; } public string alliance { get; set; } public string energy_prop { get; set; } + + public SparkDataView(Spark spark, DataDumper dumper) { + + item_name = dumper.GetLocalizedName(spark.sparkName); + item_key = spark.sparkName; + item_categories = new List(); // No categories + price_equip = spark.changePrice; + price_purchase = spark.unlockPrice; + required_standing = spark.standingLimit * 100; + sequence = spark.displayOrder; + icon = spark.icon; + energy_prop = spark.energyCredit.ToString(); + + if (spark.allianceEid.HasValue) { + // For some reason the Alliance object doesn't pull over the name + // so we need to pull it as an eneity + // var currentAlliance = Alliance.Repository.Load(spark.allianceEid); + + // Trying as an entity doesn't work either + // var currentAlliance = entityServices.Repository.Load(.Value); + + + var allianceData = AllianceHelper.GetAllianceInfo(); + + foreach (var allianceInfo in allianceData) { + var childDict = (Dictionary)allianceInfo.Value; + long allianceEid = (long)childDict["allianceEID"]; + string allianceName = (string)childDict["name"]; + + if (allianceEid == spark.allianceEid) { + alliance = dumper.GetLocalizedName(allianceName); + break; + } + } + } + + var extensionsDict = new Dictionary(); + var extensionStrings = new List(); + + foreach (Extension extension in spark.RelatedExtensions) { + var extensionInfo = dumper.ExtensionReader.GetExtensionByID(extension.id); + + extensionsDict.Add(extensionInfo.name, extension.level); + + string localName = SparkBonusString(extensionInfo.name, extension.level, dumper); + + extensionStrings.Add(localName); + + } + + this.extensions = String.Join(";", extensionStrings); + } + + private string SparkBonusString(string extensionName, int value, DataDumper dumper) { + var formulaStrings = new List { "{%BONUS100%}", "{%BONUS%}" }; + + // First check if the localized name exists + var localName = dumper.GetLocalizedName(extensionName); + + if (localName == extensionName) { + // This means the desc wasn't found + localName = dumper.GetLocalizedName(extensionName + "_desc"); + + foreach (var formula in formulaStrings) { + localName = localName.Replace(formula, value.ToString()); + } + + } + + return localName; + } } } From 4cfec0a64b1811b9f13fb9b332d737532aab029c Mon Sep 17 00:00:00 2001 From: docsaintly Date: Sun, 25 Oct 2020 05:09:11 +0000 Subject: [PATCH 4/8] Started to refactor properties to Camel Casing Added option to open exported file Added more module categories --- .../Base Views/ActiveModuleDataView.cs | 6 +- .../Base Views/EntityDataView.cs | 6 +- .../Base Views/ItemDataView.cs | 6 +- .../Base Views/ModuleDataView.cs | 8 +- Perpetuum.DataDumper/DataDumper.cs | 53 +++++++++---- Perpetuum.DataDumper/DataExportMapping.cs | 15 +++- Perpetuum.DataDumper/DumperForm.cs | 11 ++- .../Perpetuum.DataDumper.csproj | 10 ++- .../Views/AmmoWeaponDataView.cs | 52 ++++++------- .../Views/ModuleArmorHardenerDataView.cs | 56 +++++++------- .../Views/ModuleArmorPlateView.cs | 12 +-- .../Views/ModuleArmorRepairerDataView.cs | 4 +- .../Views/ModuleAuxAccumulator.cs | 22 ++++++ .../Views/ModuleDemobilizerDataView.cs | 22 ++++++ .../Views/ModuleERPDataView.cs | 16 ++-- .../Views/ModuleEnergyDrainerDataView.cs | 24 ++++++ ...iew.cs => ModuleEnergyInjectorDataView.cs} | 10 +-- .../Views/ModuleEnergyNeutralizerDataView.cs | 24 ++++++ .../Views/ModuleEnergyTransfererDataView.cs | 22 ++++++ .../Views/ModuleHarvesterDataView.cs | 24 ++++++ .../Views/ModuleMinerDataView.cs | 24 ++++++ .../Views/ModuleNexusDataView.cs | 76 +++++++++++++++++++ Perpetuum.DataDumper/Views/SparkDataView.cs | 6 +- 23 files changed, 395 insertions(+), 114 deletions(-) create mode 100644 Perpetuum.DataDumper/Views/ModuleAuxAccumulator.cs create mode 100644 Perpetuum.DataDumper/Views/ModuleDemobilizerDataView.cs create mode 100644 Perpetuum.DataDumper/Views/ModuleEnergyDrainerDataView.cs rename Perpetuum.DataDumper/Views/{ModuleDrillerDataView.cs => ModuleEnergyInjectorDataView.cs} (55%) create mode 100644 Perpetuum.DataDumper/Views/ModuleEnergyNeutralizerDataView.cs create mode 100644 Perpetuum.DataDumper/Views/ModuleEnergyTransfererDataView.cs create mode 100644 Perpetuum.DataDumper/Views/ModuleHarvesterDataView.cs create mode 100644 Perpetuum.DataDumper/Views/ModuleMinerDataView.cs create mode 100644 Perpetuum.DataDumper/Views/ModuleNexusDataView.cs diff --git a/Perpetuum.DataDumper/Base Views/ActiveModuleDataView.cs b/Perpetuum.DataDumper/Base Views/ActiveModuleDataView.cs index 495fc9bee..a97757db5 100644 --- a/Perpetuum.DataDumper/Base Views/ActiveModuleDataView.cs +++ b/Perpetuum.DataDumper/Base Views/ActiveModuleDataView.cs @@ -5,9 +5,9 @@ public class ActiveModuleDataView : ModuleDataView { // These are nullable because some items may be // in a group of active modules but are themselves // passive and we don't want to show 0 for them - public double? module_accumulator { get; set; } - public double? module_cycle { get; set; } - + public double? ModuleAccumulator { get; set; } + public double? ModuleCycle { get; set; } + public double? ModuleOptimalRange { get; set; } } } diff --git a/Perpetuum.DataDumper/Base Views/EntityDataView.cs b/Perpetuum.DataDumper/Base Views/EntityDataView.cs index 13a1796fb..6fbe440ee 100644 --- a/Perpetuum.DataDumper/Base Views/EntityDataView.cs +++ b/Perpetuum.DataDumper/Base Views/EntityDataView.cs @@ -2,8 +2,8 @@ namespace Perpetuum.DataDumper { public class EntityDataView { - public string item_name { get; set; } // This should actually be renamed... - public string item_key { get; set; } - public List item_categories { get; set; } + public string ItemName { get; set; } // This should actually be renamed... + public string ItemKey { get; set; } + public List ItemCategories { get; set; } } } diff --git a/Perpetuum.DataDumper/Base Views/ItemDataView.cs b/Perpetuum.DataDumper/Base Views/ItemDataView.cs index d470670ae..2566e8600 100644 --- a/Perpetuum.DataDumper/Base Views/ItemDataView.cs +++ b/Perpetuum.DataDumper/Base Views/ItemDataView.cs @@ -2,9 +2,9 @@ public partial class DataDumper { public class ItemDataView : EntityDataView { - public double item_mass { get; set; } - public double item_volume { get; set; } - public double item_volume_packed { get; set; } + public double ItemMass { get; set; } + public double ItemVolume { get; set; } + public double ItemVolumePacked { get; set; } } diff --git a/Perpetuum.DataDumper/Base Views/ModuleDataView.cs b/Perpetuum.DataDumper/Base Views/ModuleDataView.cs index b54f0d64e..963048171 100644 --- a/Perpetuum.DataDumper/Base Views/ModuleDataView.cs +++ b/Perpetuum.DataDumper/Base Views/ModuleDataView.cs @@ -4,10 +4,10 @@ namespace Perpetuum.DataDumper { public partial class DataDumper { public class ModuleDataView : ItemDataView { - public string module_tier { get; set; } - public double module_cpu { get; set; } - public double module_reactor { get; set; } - public List module_extensions_required { get; set; } + public string ModuleTier { get; set; } + public double ModuleCpu { get; set; } + public double ModuleReactor { get; set; } + public List ExtensionsRequired { get; set; } } } diff --git a/Perpetuum.DataDumper/DataDumper.cs b/Perpetuum.DataDumper/DataDumper.cs index 9f31e502e..bd1474e43 100644 --- a/Perpetuum.DataDumper/DataDumper.cs +++ b/Perpetuum.DataDumper/DataDumper.cs @@ -157,43 +157,58 @@ public string GetLocalizedName(string itemKey) } public void InitItemView(ItemDataView view, Entity entity) { - view.item_name = GetLocalizedName(entity.ED.Name); - view.item_key = entity.ED.Name; - view.item_categories = entity.ED.CategoryFlags.GetCategoryFlagsTree().Where(x=> x.ToString() != "undefined").Select(x => x.ToString()).ToList(); - view.item_mass = entity.Mass; - view.item_volume_packed = entity.ED.CalculateVolume(true, 1); - view.item_volume = entity.ED.CalculateVolume(false, 1); + view.ItemName = GetLocalizedName(entity.ED.Name); + view.ItemKey = entity.ED.Name; + view.ItemCategories = entity.ED.CategoryFlags.GetCategoryFlagsTree().Where(x=> x.ToString() != "undefined").Select(x => x.ToString()).ToList(); + view.ItemMass = entity.Mass; + view.ItemVolumePacked = entity.ED.CalculateVolume(true, 1); + view.ItemVolume = entity.ED.CalculateVolume(false, 1); } public void InitModuleView(ModuleDataView view, Modules.Module module) { InitItemView(view, module); - view.module_tier = module.ED.GameTierString(); - view.module_cpu = module.CpuUsage; - view.module_reactor = module.PowerGridUsage; + view.ModuleTier = module.ED.GameTierString(); + view.ModuleCpu = module.CpuUsage; + view.ModuleReactor = module.PowerGridUsage; - view.module_extensions_required = new List(); + view.ExtensionsRequired = new List(); foreach (var extension in module.ED.EnablerExtensions.Keys) { - view.module_extensions_required.Add(GetLocalizedName(ExtensionReader.GetExtensionName(extension.id)) + "(" + extension.level + ")"); + view.ExtensionsRequired.Add(GetLocalizedName(ExtensionReader.GetExtensionName(extension.id)) + "(" + extension.level + ")"); } } public void InitActiveModuleView(ActiveModuleDataView view, ActiveModule module) { InitModuleView(view, module); - view.module_accumulator = module.CoreUsage; - view.module_cycle = module.CycleTime.TotalSeconds; + view.ModuleAccumulator = module.CoreUsage; + view.ModuleCycle = module.CycleTime.TotalSeconds; + + var range = module.GetBasePropertyModifier(AggregateField.optimal_range); + + if (range.HasValue) { + view.ModuleOptimalRange = range.Value * 10; + } } public static string GetModifierString(ItemPropertyModifier mod) { var returnValue = ""; if (mod.HasValue) { - returnValue = ((mod.Value - 1) * 100) + "%"; + if (mod.ToString().Contains("Formula: Add")) { + returnValue = mod.Value * 100 + "%"; + + if (mod.Value > 0) { + returnValue = "+" + returnValue; + } + } else { + returnValue = ((mod.Value - 1) * 100) + "%"; - if (mod.Value - 1 > 0) { - returnValue = "+" + returnValue; + if (mod.Value - 1 > 0) { + returnValue = "+" + returnValue; + } } + } return returnValue; @@ -340,5 +355,11 @@ public List DumpDataView(DataExportMapping mapping) { } + public object GenerateItem(string itemName) { + var result = entityFactory.Create(itemName, EntityIDGenerator.Random); + + return result; + } + } } diff --git a/Perpetuum.DataDumper/DataExportMapping.cs b/Perpetuum.DataDumper/DataExportMapping.cs index 3ec275eb3..7b53702d0 100644 --- a/Perpetuum.DataDumper/DataExportMapping.cs +++ b/Perpetuum.DataDumper/DataExportMapping.cs @@ -25,7 +25,8 @@ public override string ToString() { // These universal ones are strange because they're stored in a different category // even though in the game UI they're the same thing and they have basically the same stats // Also the univeral one is a regular module while the others are Active - new DataExportMapping("ModuleDrillerStats", typeof(ModuleDrillerDataView), "cf_drillers"), + new DataExportMapping("ModuleMinerStats", typeof(ModuleMinerDataView), "cf_drillers"), + new DataExportMapping("ModuleHarvesterStats", typeof(ModuleHarvesterDataView), "cf_harvesters"), new DataExportMapping("ModuleArmorHardenerStats", typeof(ModuleArmorHardenerDataView), "cf_armor_hardeners"), new DataExportMapping("ModuleShieldGeneratorStats", typeof(ModuleShieldGeneratorDataView), "cf_shield_generators"), new DataExportMapping("ModuleERPStats", typeof(ModuleERPDataView), "cf_kers"), @@ -34,8 +35,16 @@ public override string ToString() { new DataExportMapping("SparkStats", typeof(SparkDataView), ""), new DataExportMapping("ModuleArmorRepairerStats", typeof(ModuleArmorRepairerDataView), "cf_armor_repair_systems"), new DataExportMapping("AmmoWeaponStats", typeof(AmmoWeaponDataView), "cf_ammo"), - new DataExportMapping("WeaponStats", typeof(ModuleWeaponDataView), "cf_weapons"), - new DataExportMapping("RobotStats", typeof(RobotDataView), "cf_robot") + new DataExportMapping("ModuleWeaponStats", typeof(ModuleWeaponDataView), "cf_weapons"), + new DataExportMapping("RobotStats", typeof(RobotDataView), "cf_robot"), + new DataExportMapping("ModuleAuxAccumulatorStats", typeof(ModuleAuxAccumulatorDataView), "cf_core_batteries"), + new DataExportMapping("ModuleEnergyTransfererStats", typeof(ModuleEnergyTransfererDataView), "cf_energy_transferers"), + new DataExportMapping("ModuleEnergyDrainerStats", typeof(ModuleEnergyDrainerDataView), "cf_energy_vampires"), + new DataExportMapping("ModuleEnergyNeutralizerStats", typeof(ModuleEnergyNeutralizerDataView), "cf_energy_neutralizers"), + new DataExportMapping("ModuleEnergyInjectorStats", typeof(ModuleEnergyInjectorDataView), "cf_core_boosters"), + new DataExportMapping("ModuleDemobilizerStats", typeof(ModuleDemobilizerDataView), "cf_webber"), + new DataExportMapping("ModuleNexusStats", typeof(ModuleNexusDataView), "cf_gang_assist_modules") + }; } diff --git a/Perpetuum.DataDumper/DumperForm.cs b/Perpetuum.DataDumper/DumperForm.cs index 9824f3f25..536a010d0 100644 --- a/Perpetuum.DataDumper/DumperForm.cs +++ b/Perpetuum.DataDumper/DumperForm.cs @@ -10,6 +10,7 @@ using System.Collections.Generic; using System.ComponentModel; using System.Data; +using System.Diagnostics; using System.Drawing; using System.IO; using System.Linq; @@ -32,7 +33,7 @@ private void Form1_Load(object sender, EventArgs e) { serverPathTextbox.Text = Properties.Settings.Default.ServerPath; dictionaryPathTextbox.Text = Properties.Settings.Default.DictionaryPath; - foreach (var item in DataExportMapping.Mappings) { + foreach (var item in DataExportMapping.Mappings.OrderBy(x=> x.TableName).ToList()) { mappingSelectList.Items.Add(item, true); } } @@ -63,7 +64,7 @@ private void StartButton_Click(object sender, EventArgs e) { // We need to group by the Cargo Table because we may have multipler // definitions writing into the same table. - + foreach (var tableGroup in tableGroupings) { // Write the definition for the group @@ -94,7 +95,11 @@ private void StartButton_Click(object sender, EventArgs e) { workbook.Write(new FileStream(filePath, FileMode.CreateNew)); - MessageBox.Show($"File exported to:\n{filePath}"); + var result = MessageBox.Show($"File exported to:\n{filePath}\n\nWould you like to open it?", "Export finished", MessageBoxButtons.YesNo); + + if (result == DialogResult.Yes) { + Process.Start(filePath); + } } diff --git a/Perpetuum.DataDumper/Perpetuum.DataDumper.csproj b/Perpetuum.DataDumper/Perpetuum.DataDumper.csproj index c1ee86687..113c981b2 100644 --- a/Perpetuum.DataDumper/Perpetuum.DataDumper.csproj +++ b/Perpetuum.DataDumper/Perpetuum.DataDumper.csproj @@ -104,8 +104,16 @@ + + + + + + + + - + diff --git a/Perpetuum.DataDumper/Views/AmmoWeaponDataView.cs b/Perpetuum.DataDumper/Views/AmmoWeaponDataView.cs index 96df8a690..87dce23e9 100644 --- a/Perpetuum.DataDumper/Views/AmmoWeaponDataView.cs +++ b/Perpetuum.DataDumper/Views/AmmoWeaponDataView.cs @@ -9,51 +9,51 @@ namespace Perpetuum.DataDumper.Views { public class AmmoWeaponDataView : ItemDataView { - public double? damage_chemical { get; set; } - public double? damage_kinetic { get; set; } - public double? damage_seismic { get; set; } - public double? damage_thermal { get; set; } - public double? damage_toxic { get; set; } - public double damage_total { get => (damage_chemical ?? 0) + (damage_kinetic ?? 0) + (damage_seismic ?? 0) + (damage_thermal ?? 0); } - public double? optimal_range { get; set; } - public double? explosion_radius { get; set; } - public string modifier_range { get; set; } - public string modifier_falloff { get; set; } + public double? DamageChemical { get; set; } + public double? DamageKinetic { get; set; } + public double? DamageSeismic { get; set; } + public double? DamageThermal { get; set; } + public double? DamageToxic { get; set; } + public double DamageTotal { get => (DamageChemical ?? 0) + (DamageKinetic ?? 0) + (DamageSeismic ?? 0) + (DamageThermal ?? 0); } + public double? OptimalRange { get; set; } + public double? ExplosionRadius { get; set; } + public string ModifierRange { get; set; } + public string ModifierFalloff { get; set; } public AmmoWeaponDataView(Ammo item, DataDumper dumper) { dumper.InitItemView(this, item); var dictionaryData = item.ToDictionary(); - damage_chemical = item.GetBasePropertyModifier(AggregateField.damage_chemical).Value; - damage_kinetic = item.GetBasePropertyModifier(AggregateField.damage_kinetic).Value; - damage_seismic = item.GetBasePropertyModifier(AggregateField.damage_explosive).Value; - damage_thermal = item.GetBasePropertyModifier(AggregateField.damage_thermal).Value; - damage_toxic = item.GetBasePropertyModifier(AggregateField.damage_toxic).Value; + DamageChemical = item.GetBasePropertyModifier(AggregateField.damage_chemical).Value; + DamageKinetic = item.GetBasePropertyModifier(AggregateField.damage_kinetic).Value; + DamageSeismic = item.GetBasePropertyModifier(AggregateField.damage_explosive).Value; + DamageThermal = item.GetBasePropertyModifier(AggregateField.damage_thermal).Value; + DamageToxic = item.GetBasePropertyModifier(AggregateField.damage_toxic).Value; - modifier_falloff = (item.GetBasePropertyModifier(AggregateField.falloff).Value * 10).ToString(); - explosion_radius = item.GetBasePropertyModifier(AggregateField.explosion_radius).Value; + ModifierFalloff = (item.GetBasePropertyModifier(AggregateField.falloff).Value * 10).ToString(); + ExplosionRadius = item.GetBasePropertyModifier(AggregateField.explosion_radius).Value; // Empty out the 0's - if (damage_chemical == 0) { damage_chemical = null; }; - if (damage_kinetic == 0) { damage_kinetic = null; }; - if (damage_seismic == 0) { damage_seismic = null; }; - if (damage_thermal == 0) { damage_thermal = null; }; - if (damage_toxic == 0) { damage_toxic = null; }; + if (DamageChemical == 0) { DamageChemical = null; }; + if (DamageKinetic == 0) { DamageKinetic = null; }; + if (DamageSeismic == 0) { DamageSeismic = null; }; + if (DamageThermal == 0) { DamageThermal = null; }; + if (DamageToxic == 0) { DamageToxic = null; }; - if (modifier_falloff == "0") { modifier_falloff = null; }; // keeping this as a string for now because other modules may use it as a modifier? - if (explosion_radius == 0) { explosion_radius = null; }; + if (ModifierFalloff == "0") { ModifierFalloff = null; }; // keeping this as a string for now because other modules may use it as a modifier? + if (ExplosionRadius == 0) { ExplosionRadius = null; }; // This will get the property even if it doesn't explicitly exist // It will be set to the default value, but the HasValue will tell // us if it's something other than the default - modifier_range = GetModifierString(item.GetBasePropertyModifier(AggregateField.optimal_range_modifier)); + ModifierRange = GetModifierString(item.GetBasePropertyModifier(AggregateField.optimal_range_modifier)); var rangeProp = item.GetBasePropertyModifier(AggregateField.optimal_range); if (rangeProp.HasValue) { - optimal_range = rangeProp.Value * 10; + OptimalRange = rangeProp.Value * 10; } } diff --git a/Perpetuum.DataDumper/Views/ModuleArmorHardenerDataView.cs b/Perpetuum.DataDumper/Views/ModuleArmorHardenerDataView.cs index bf0dcd339..b8f6ba7b4 100644 --- a/Perpetuum.DataDumper/Views/ModuleArmorHardenerDataView.cs +++ b/Perpetuum.DataDumper/Views/ModuleArmorHardenerDataView.cs @@ -12,17 +12,17 @@ namespace Perpetuum.DataDumper.Views { public class ModuleArmorHardenerDataView : ActiveModuleDataView { - public double module_resist_active_chemical { get; set; } - public double module_resist_passive_chemical { get; set; } - public double module_resist_active_kinetic { get; set; } - public double module_resist_passive_kinetic { get; set; } - public double module_resist_active_seismic { get; set; } - public double module_resist_passive_seismic { get; set; } - public double module_resist_active_thermal { get; set; } - public double module_resist_passive_thermal { get; set; } - public string module_resist_type { get; set; } - public double module_resist_passive { get; set; } - public double module_resist_active { get; set; } + public double ModuleResistActiveChemical { get; set; } + public double ModuleResistPassiveChemical { get; set; } + public double ModuleResistActiveKinetic { get; set; } + public double ModuleResistPassiveKinetic { get; set; } + public double ModuleResistActiveSeismic { get; set; } + public double ModuleResistPassiveSeismic { get; set; } + public double ModuleResistActiveThermal { get; set; } + public double ModuleResistPassiveThermal { get; set; } + public string ModuleResistType { get; set; } + public double ModuleResistPassive { get; set; } + public double ModuleResistActive { get; set; } public ModuleArmorHardenerDataView(ActiveModule item, DataDumper dumper) { dumper.InitActiveModuleView(this, item); @@ -37,30 +37,30 @@ public ModuleArmorHardenerDataView(Module item, DataDumper dumper) { } private void FillModuleData(Module module) { - module_resist_active_chemical = module.GetBasePropertyModifier(AggregateField.effect_resist_chemical).Value; - module_resist_passive_chemical = module.GetBasePropertyModifier(AggregateField.resist_chemical).Value; - module_resist_active_kinetic = module.GetBasePropertyModifier(AggregateField.effect_resist_kinetic).Value; - module_resist_passive_kinetic = module.GetBasePropertyModifier(AggregateField.resist_kinetic).Value; - module_resist_active_seismic = module.GetBasePropertyModifier(AggregateField.effect_resist_explosive).Value; - module_resist_passive_seismic = module.GetBasePropertyModifier(AggregateField.resist_explosive).Value; - module_resist_active_thermal = module.GetBasePropertyModifier(AggregateField.effect_resist_thermal).Value; - module_resist_passive_thermal = module.GetBasePropertyModifier(AggregateField.resist_thermal).Value; + ModuleResistActiveChemical = module.GetBasePropertyModifier(AggregateField.effect_resist_chemical).Value; + ModuleResistPassiveChemical = module.GetBasePropertyModifier(AggregateField.resist_chemical).Value; + ModuleResistActiveKinetic = module.GetBasePropertyModifier(AggregateField.effect_resist_kinetic).Value; + ModuleResistPassiveKinetic = module.GetBasePropertyModifier(AggregateField.resist_kinetic).Value; + ModuleResistActiveSeismic = module.GetBasePropertyModifier(AggregateField.effect_resist_explosive).Value; + ModuleResistPassiveSeismic = module.GetBasePropertyModifier(AggregateField.resist_explosive).Value; + ModuleResistActiveThermal = module.GetBasePropertyModifier(AggregateField.effect_resist_thermal).Value; + ModuleResistPassiveThermal = module.GetBasePropertyModifier(AggregateField.resist_thermal).Value; var passives = new List> { - new Tuple(module_resist_passive_chemical,module_resist_active_chemical, "Chemical"), - new Tuple(module_resist_passive_kinetic, module_resist_active_kinetic, "Kinetic"), - new Tuple(module_resist_passive_seismic, module_resist_active_seismic, "Seismic"), - new Tuple(module_resist_passive_thermal, module_resist_active_thermal, "Thermal") + new Tuple(ModuleResistPassiveChemical,ModuleResistActiveChemical, "Chemical"), + new Tuple(ModuleResistPassiveKinetic, ModuleResistActiveKinetic, "Kinetic"), + new Tuple(ModuleResistPassiveSeismic, ModuleResistActiveSeismic, "Seismic"), + new Tuple(ModuleResistPassiveThermal, ModuleResistActiveThermal, "Thermal") }; if (passives.Where(x => x.Item1 != 0).Count() > 1) { - module_resist_type = "All"; - module_resist_passive = module.GetBasePropertyModifier(AggregateField.resist_chemical).Value; + ModuleResistType = "All"; + ModuleResistPassive = module.GetBasePropertyModifier(AggregateField.resist_chemical).Value; } else { var activeType = passives.Where(x => x.Item1 != 0).Single(); - module_resist_type = activeType.Item3; - module_resist_passive = activeType.Item1; - module_resist_active = activeType.Item2; + ModuleResistType = activeType.Item3; + ModuleResistPassive = activeType.Item1; + ModuleResistActive = activeType.Item2; } } } diff --git a/Perpetuum.DataDumper/Views/ModuleArmorPlateView.cs b/Perpetuum.DataDumper/Views/ModuleArmorPlateView.cs index 095918499..a15c68749 100644 --- a/Perpetuum.DataDumper/Views/ModuleArmorPlateView.cs +++ b/Perpetuum.DataDumper/Views/ModuleArmorPlateView.cs @@ -11,16 +11,16 @@ namespace Perpetuum.DataDumper.Views { public class ModuleArmorPlateDataView : ModuleDataView { - public double module_hp { get; set; } - public double module_surface_hit { get; set; } - public double module_demob_resist { get; set; } + public double ModuleHp { get; set; } + public double ModuleSurfaceHit { get; set; } + public double ModuleDemobResist { get; set; } public ModuleArmorPlateDataView(Module item, DataDumper dumper) { dumper.InitModuleView(this, item); - module_hp = item.GetBasePropertyModifier(AggregateField.armor_max).Value; - module_demob_resist = item.GetBasePropertyModifier(AggregateField.massiveness).Value * 100; - module_surface_hit = item.GetBasePropertyModifier(AggregateField.signature_radius).Value; + ModuleHp = item.GetBasePropertyModifier(AggregateField.armor_max).Value; + ModuleDemobResist = item.GetBasePropertyModifier(AggregateField.massiveness).Value * 100; + ModuleSurfaceHit = item.GetBasePropertyModifier(AggregateField.signature_radius).Value; } } } diff --git a/Perpetuum.DataDumper/Views/ModuleArmorRepairerDataView.cs b/Perpetuum.DataDumper/Views/ModuleArmorRepairerDataView.cs index 467a56f0b..b7847d420 100644 --- a/Perpetuum.DataDumper/Views/ModuleArmorRepairerDataView.cs +++ b/Perpetuum.DataDumper/Views/ModuleArmorRepairerDataView.cs @@ -11,12 +11,12 @@ namespace Perpetuum.DataDumper.Views { public class ModuleArmorRepairerDataView : ActiveModuleDataView { - public double module_repair_amount { get; set; } + public double ModuleRepairAmount { get; set; } public ModuleArmorRepairerDataView(ArmorRepairModule item, DataDumper dumper) { dumper.InitActiveModuleView(this, item); - module_repair_amount = item.GetBasePropertyModifier(AggregateField.armor_repair_amount).Value; + ModuleRepairAmount = item.GetBasePropertyModifier(AggregateField.armor_repair_amount).Value; } } diff --git a/Perpetuum.DataDumper/Views/ModuleAuxAccumulator.cs b/Perpetuum.DataDumper/Views/ModuleAuxAccumulator.cs new file mode 100644 index 000000000..3a1a08265 --- /dev/null +++ b/Perpetuum.DataDumper/Views/ModuleAuxAccumulator.cs @@ -0,0 +1,22 @@ +using Perpetuum.Containers; +using Perpetuum.ExportedTypes; +using Perpetuum.Modules; +using Perpetuum.Modules.Weapons; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using static Perpetuum.DataDumper.DataDumper; + +namespace Perpetuum.DataDumper.Views { + public class ModuleAuxAccumulatorDataView : ModuleDataView { + public double ModuleAccumulatorCapacity { get; set; } + + public ModuleAuxAccumulatorDataView(Module item, DataDumper dumper) { + dumper.InitModuleView(this, item); + + ModuleAccumulatorCapacity = item.GetBasePropertyModifier(AggregateField.core_max).Value; + } + } +} diff --git a/Perpetuum.DataDumper/Views/ModuleDemobilizerDataView.cs b/Perpetuum.DataDumper/Views/ModuleDemobilizerDataView.cs new file mode 100644 index 000000000..8dec65589 --- /dev/null +++ b/Perpetuum.DataDumper/Views/ModuleDemobilizerDataView.cs @@ -0,0 +1,22 @@ +using Perpetuum.Containers; +using Perpetuum.ExportedTypes; +using Perpetuum.Modules; +using Perpetuum.Modules.Weapons; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using static Perpetuum.DataDumper.DataDumper; + +namespace Perpetuum.DataDumper.Views { + public class ModuleDemobilizerDataView : ActiveModuleDataView { + public double ModuleTopSpeedModifier { get; set; } + + public ModuleDemobilizerDataView(ActiveModule item, DataDumper dumper) { + dumper.InitActiveModuleView(this, item); + + ModuleTopSpeedModifier = item.GetBasePropertyModifier(AggregateField.effect_massivness_speed_max_modifier).Value * 100; + } + } +} diff --git a/Perpetuum.DataDumper/Views/ModuleERPDataView.cs b/Perpetuum.DataDumper/Views/ModuleERPDataView.cs index 1790c3eb9..19a7a25bc 100644 --- a/Perpetuum.DataDumper/Views/ModuleERPDataView.cs +++ b/Perpetuum.DataDumper/Views/ModuleERPDataView.cs @@ -12,18 +12,18 @@ namespace Perpetuum.DataDumper.Views { public class ModuleERPDataView : ActiveModuleDataView { - public double module_recovery_chemical { get; set; } - public double module_recovery_kinetic { get; set; } - public double module_recovery_seismic { get; set; } - public double module_recovery_thermal { get; set; } + public double ModuleRecoveryChemical { get; set; } + public double ModuleRecoveryKinetic { get; set; } + public double ModuleRecoverySeismic { get; set; } + public double ModuleRecoveryThermal { get; set; } public ModuleERPDataView(Module item, DataDumper dumper) { dumper.InitModuleView(this, item); - module_recovery_chemical = item.GetBasePropertyModifier(AggregateField.chemical_damage_to_core_modifier).Value * 100; - module_recovery_kinetic = item.GetBasePropertyModifier(AggregateField.kinetic_damage_to_core_modifier).Value * 100; - module_recovery_seismic = item.GetBasePropertyModifier(AggregateField.explosive_damage_to_core_modifier).Value * 100; - module_recovery_thermal = item.GetBasePropertyModifier(AggregateField.thermal_damage_to_core_modifier).Value * 100; + ModuleRecoveryChemical = item.GetBasePropertyModifier(AggregateField.chemical_damage_to_core_modifier).Value * 100; + ModuleRecoveryKinetic = item.GetBasePropertyModifier(AggregateField.kinetic_damage_to_core_modifier).Value * 100; + ModuleRecoverySeismic = item.GetBasePropertyModifier(AggregateField.explosive_damage_to_core_modifier).Value * 100; + ModuleRecoveryThermal = item.GetBasePropertyModifier(AggregateField.thermal_damage_to_core_modifier).Value * 100; } } } diff --git a/Perpetuum.DataDumper/Views/ModuleEnergyDrainerDataView.cs b/Perpetuum.DataDumper/Views/ModuleEnergyDrainerDataView.cs new file mode 100644 index 000000000..2ebf4f342 --- /dev/null +++ b/Perpetuum.DataDumper/Views/ModuleEnergyDrainerDataView.cs @@ -0,0 +1,24 @@ +using Perpetuum.Containers; +using Perpetuum.ExportedTypes; +using Perpetuum.Modules; +using Perpetuum.Modules.Weapons; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using static Perpetuum.DataDumper.DataDumper; + +namespace Perpetuum.DataDumper.Views { + public class ModuleEnergyDrainerDataView : ActiveModuleDataView { + public double ModuleEnergyTransfer { get; set; } + public double ModuleElectrostaticDispersion { get; set; } + + public ModuleEnergyDrainerDataView(ActiveModule item, DataDumper dumper) { + dumper.InitActiveModuleView(this, item); + + ModuleEnergyTransfer = item.GetBasePropertyModifier(AggregateField.energy_vampired_amount).Value; + ModuleElectrostaticDispersion = item.GetBasePropertyModifier(AggregateField.energy_dispersion).Value; + } + } +} diff --git a/Perpetuum.DataDumper/Views/ModuleDrillerDataView.cs b/Perpetuum.DataDumper/Views/ModuleEnergyInjectorDataView.cs similarity index 55% rename from Perpetuum.DataDumper/Views/ModuleDrillerDataView.cs rename to Perpetuum.DataDumper/Views/ModuleEnergyInjectorDataView.cs index e7f30f2ab..30d9d928e 100644 --- a/Perpetuum.DataDumper/Views/ModuleDrillerDataView.cs +++ b/Perpetuum.DataDumper/Views/ModuleEnergyInjectorDataView.cs @@ -10,13 +10,13 @@ using static Perpetuum.DataDumper.DataDumper; namespace Perpetuum.DataDumper.Views { - public class ModuleDrillerDataView : ActiveModuleDataView { - public double module_mining_modifier { get; set; } - - public ModuleDrillerDataView(DrillerModule item, DataDumper dumper) { + public class ModuleEnergyInjectorDataView : ActiveModuleDataView { + public int AmmoCapacity { get; set; } + public ModuleEnergyInjectorDataView(ActiveModule item, DataDumper dumper) { dumper.InitActiveModuleView(this, item); - module_mining_modifier = item.GetBasePropertyModifier(AggregateField.mining_amount_modifier).Value; + AmmoCapacity = item.AmmoCapacity; + } } } diff --git a/Perpetuum.DataDumper/Views/ModuleEnergyNeutralizerDataView.cs b/Perpetuum.DataDumper/Views/ModuleEnergyNeutralizerDataView.cs new file mode 100644 index 000000000..09b76e1c2 --- /dev/null +++ b/Perpetuum.DataDumper/Views/ModuleEnergyNeutralizerDataView.cs @@ -0,0 +1,24 @@ +using Perpetuum.Containers; +using Perpetuum.ExportedTypes; +using Perpetuum.Modules; +using Perpetuum.Modules.Weapons; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using static Perpetuum.DataDumper.DataDumper; + +namespace Perpetuum.DataDumper.Views { + public class ModuleEnergyNeutralizerDataView : ActiveModuleDataView { + public double ModuleEnergyTransfer { get; set; } + public double ModuleElectrostaticDispersion { get; set; } + + public ModuleEnergyNeutralizerDataView(ActiveModule item, DataDumper dumper) { + dumper.InitActiveModuleView(this, item); + + ModuleEnergyTransfer = item.GetBasePropertyModifier(AggregateField.energy_neutralized_amount).Value; + ModuleElectrostaticDispersion = item.GetBasePropertyModifier(AggregateField.energy_dispersion).Value; + } + } +} diff --git a/Perpetuum.DataDumper/Views/ModuleEnergyTransfererDataView.cs b/Perpetuum.DataDumper/Views/ModuleEnergyTransfererDataView.cs new file mode 100644 index 000000000..bad49d0b0 --- /dev/null +++ b/Perpetuum.DataDumper/Views/ModuleEnergyTransfererDataView.cs @@ -0,0 +1,22 @@ +using Perpetuum.Containers; +using Perpetuum.ExportedTypes; +using Perpetuum.Modules; +using Perpetuum.Modules.Weapons; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using static Perpetuum.DataDumper.DataDumper; + +namespace Perpetuum.DataDumper.Views { + public class ModuleEnergyTransfererDataView : ActiveModuleDataView { + public double ModuleEnergyTransfer { get; set; } + + public ModuleEnergyTransfererDataView(ActiveModule item, DataDumper dumper) { + dumper.InitActiveModuleView(this, item); + + ModuleEnergyTransfer = item.GetBasePropertyModifier(AggregateField.energy_transfer_amount).Value; + } + } +} diff --git a/Perpetuum.DataDumper/Views/ModuleHarvesterDataView.cs b/Perpetuum.DataDumper/Views/ModuleHarvesterDataView.cs new file mode 100644 index 000000000..d9c479e11 --- /dev/null +++ b/Perpetuum.DataDumper/Views/ModuleHarvesterDataView.cs @@ -0,0 +1,24 @@ +using Perpetuum.Containers; +using Perpetuum.ExportedTypes; +using Perpetuum.Modules; +using Perpetuum.Modules.Weapons; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using static Perpetuum.DataDumper.DataDumper; + +namespace Perpetuum.DataDumper.Views { + public class ModuleHarvesterDataView : ActiveModuleDataView { + public double ModuleMiningModifier { get; set; } + public int AmmoCapacity { get; set; } + + public ModuleHarvesterDataView(GathererModule item, DataDumper dumper) { + dumper.InitActiveModuleView(this, item); + + ModuleMiningModifier = item.GetBasePropertyModifier(AggregateField.mining_amount_modifier).Value; + AmmoCapacity = item.AmmoCapacity; + } + } +} diff --git a/Perpetuum.DataDumper/Views/ModuleMinerDataView.cs b/Perpetuum.DataDumper/Views/ModuleMinerDataView.cs new file mode 100644 index 000000000..b8df9ee71 --- /dev/null +++ b/Perpetuum.DataDumper/Views/ModuleMinerDataView.cs @@ -0,0 +1,24 @@ +using Perpetuum.Containers; +using Perpetuum.ExportedTypes; +using Perpetuum.Modules; +using Perpetuum.Modules.Weapons; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using static Perpetuum.DataDumper.DataDumper; + +namespace Perpetuum.DataDumper.Views { + public class ModuleMinerDataView : ActiveModuleDataView { + public double ModuleMiningModifier { get; set; } + public int AmmoCapacity { get; set; } + + public ModuleMinerDataView(DrillerModule item, DataDumper dumper) { + dumper.InitActiveModuleView(this, item); + + ModuleMiningModifier = item.GetBasePropertyModifier(AggregateField.mining_amount_modifier).Value; + AmmoCapacity = item.AmmoCapacity; + } + } +} diff --git a/Perpetuum.DataDumper/Views/ModuleNexusDataView.cs b/Perpetuum.DataDumper/Views/ModuleNexusDataView.cs new file mode 100644 index 000000000..fe32eb440 --- /dev/null +++ b/Perpetuum.DataDumper/Views/ModuleNexusDataView.cs @@ -0,0 +1,76 @@ +using Perpetuum.Containers; +using Perpetuum.ExportedTypes; +using Perpetuum.Modules; +using Perpetuum.Modules.Weapons; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using static Perpetuum.DataDumper.DataDumper; + +namespace Perpetuum.DataDumper.Views { + public class ModuleNexusDataView : ActiveModuleDataView { + public string NexusCategory { get; set; } + public string NexusPropertyName { get; set; } + public string NexusPropertyValue { get; set; } + public double ModuleEffectRadius { get; set; } + public string ModuleEffectRadiusModifier { get; set; } + + static List fixedModifiers = new List { + AggregateField.core_usage, AggregateField.cpu_usage, + AggregateField.cycle_time, AggregateField.default_effect_range, + AggregateField.powergrid_usage, AggregateField.effect_enhancer_aura_radius_modifier }; + + private string GetModuleType(GangModule item) { + if (item.IsCategory(CategoryFlags.cf_gang_assist_speed)) { + return "Velocity"; + } else if (item.IsCategory(CategoryFlags.cf_gang_assist_information)) { + return "Farlock"; + } else if (item.IsCategory(CategoryFlags.cf_gang_assist_industry)) { + return "Industrial"; + } else if (item.IsCategory(CategoryFlags.cf_gang_assist_siege)) { + return "Assault"; + } else if (item.IsCategory(CategoryFlags.cf_gang_assist_defense)) { + return "Armor"; + } else if (item.IsCategory(CategoryFlags.cf_gang_assist_ewar)) { + return "EW"; + } else if (item.IsCategory(CategoryFlags.cf_gang_assist_shared_dataprocessing)) { + return "Lock Booster"; + } else if (item.IsCategory(CategoryFlags.cf_gang_assist_coordinated_manuevering)) { + return "Evasive"; + } else if (item.IsCategory(CategoryFlags.cf_gang_assist_maintance)) { + return "Repairer"; + } else if (item.IsCategory(CategoryFlags.cf_gang_assist_precision_firing)) { + return "Critical Hit"; + } else if (item.IsCategory(CategoryFlags.cf_gang_assist_core_management)) { + return "Recharger"; + } else if (item.IsCategory(CategoryFlags.cf_gang_assist_fast_extracting)) { + return "Fast Extractor"; + } else if (item.IsCategory(CategoryFlags.cf_gang_assist_shield_calculations)) { + return "Shield"; + } else { + return ""; + } + } + + public ModuleNexusDataView(GangModule item, DataDumper dumper) { + dumper.InitActiveModuleView(this, item); + + var specialProperty = item.BasePropertyModifiers.All.Where(x => !fixedModifiers.Contains(x.Field)).Single(); + + NexusCategory = GetModuleType(item); + + NexusPropertyName = dumper.GetLocalizedName(specialProperty.Field.ToString()); + NexusPropertyValue = GetModifierString(specialProperty); + + ModuleEffectRadius = item.GetBasePropertyModifier(AggregateField.default_effect_range).Value; + + var radiusMod = item.GetBasePropertyModifier(AggregateField.effect_enhancer_aura_radius_modifier); + + if (radiusMod.HasValue) { + ModuleEffectRadiusModifier = GetModifierString(radiusMod); + } + } + } +} diff --git a/Perpetuum.DataDumper/Views/SparkDataView.cs b/Perpetuum.DataDumper/Views/SparkDataView.cs index a2a813cf5..93b5b7194 100644 --- a/Perpetuum.DataDumper/Views/SparkDataView.cs +++ b/Perpetuum.DataDumper/Views/SparkDataView.cs @@ -23,9 +23,9 @@ public class SparkDataView : EntityDataView { public SparkDataView(Spark spark, DataDumper dumper) { - item_name = dumper.GetLocalizedName(spark.sparkName); - item_key = spark.sparkName; - item_categories = new List(); // No categories + ItemName = dumper.GetLocalizedName(spark.sparkName); + ItemKey = spark.sparkName; + ItemCategories = new List(); // No categories price_equip = spark.changePrice; price_purchase = spark.unlockPrice; required_standing = spark.standingLimit * 100; From 919db09748e39d1479eb4eda4542b491b070b5d0 Mon Sep 17 00:00:00 2001 From: DerekJarvis <6828105+DerekJarvis@users.noreply.github.com> Date: Mon, 2 Nov 2020 06:54:11 +0000 Subject: [PATCH 5/8] Fixed Demobilizer stat display --- Perpetuum.DataDumper/Views/ModuleDemobilizerDataView.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Perpetuum.DataDumper/Views/ModuleDemobilizerDataView.cs b/Perpetuum.DataDumper/Views/ModuleDemobilizerDataView.cs index 8dec65589..8652dbc68 100644 --- a/Perpetuum.DataDumper/Views/ModuleDemobilizerDataView.cs +++ b/Perpetuum.DataDumper/Views/ModuleDemobilizerDataView.cs @@ -11,12 +11,12 @@ namespace Perpetuum.DataDumper.Views { public class ModuleDemobilizerDataView : ActiveModuleDataView { - public double ModuleTopSpeedModifier { get; set; } + public string ModuleTopSpeedModifier { get; set; } public ModuleDemobilizerDataView(ActiveModule item, DataDumper dumper) { dumper.InitActiveModuleView(this, item); - ModuleTopSpeedModifier = item.GetBasePropertyModifier(AggregateField.effect_massivness_speed_max_modifier).Value * 100; + ModuleTopSpeedModifier = GetModifierString(item.GetBasePropertyModifier(AggregateField.effect_massivness_speed_max_modifier)); } } } From d9c5be48fcbce65743f91b5c0a53341f20cdcfbe Mon Sep 17 00:00:00 2001 From: DerekJarvis <6828105+DerekJarvis@users.noreply.github.com> Date: Sat, 2 Jan 2021 08:36:42 +0000 Subject: [PATCH 6/8] Updated Data Dumper to work with robots --- Perpetuum.DataDumper/DataDumper.cs | 24 ++++- .../Views/ModuleWeaponDataView.cs | 6 +- Perpetuum.DataDumper/Views/RobotDataView.cs | 98 ++++++++++++++----- 3 files changed, 97 insertions(+), 31 deletions(-) diff --git a/Perpetuum.DataDumper/DataDumper.cs b/Perpetuum.DataDumper/DataDumper.cs index bd1474e43..3f61973cf 100644 --- a/Perpetuum.DataDumper/DataDumper.cs +++ b/Perpetuum.DataDumper/DataDumper.cs @@ -40,10 +40,10 @@ public partial class DataDumper ISparkRepository sparkRepository; // Some static lists for helpers - public static SlotFlags[] sizeFlags = new SlotFlags[] { SlotFlags.small, SlotFlags.medium, SlotFlags.large }; - public static SlotFlags[] typeFlags = new SlotFlags[] { SlotFlags.turret, SlotFlags.missile, SlotFlags.melee, SlotFlags.industrial, SlotFlags.ew_and_engineering }; - public static SlotFlags[] locationFlags = new SlotFlags[] { SlotFlags.head, SlotFlags.chassis, SlotFlags.leg }; - public static List ammoWeaponCategories = new List { + public static SlotFlags[] SLOT_SIZE_FLAGS = new SlotFlags[] { SlotFlags.small, SlotFlags.medium, SlotFlags.large }; + public static SlotFlags[] SLOT_TYPE_FLAGS = new SlotFlags[] { SlotFlags.turret, SlotFlags.missile, SlotFlags.melee, SlotFlags.industrial, SlotFlags.ew_and_engineering }; + public static SlotFlags[] SLOT_LOCATION_FLAGS = new SlotFlags[] { SlotFlags.head, SlotFlags.chassis, SlotFlags.leg }; + public static List CATEGORIES_AMMO_WEAPON = new List { CategoryFlags.cf_railgun_ammo, CategoryFlags.cf_laser_ammo, CategoryFlags.cf_missile_ammo, @@ -334,6 +334,22 @@ public List DumpDataView(DataExportMapping mapping) { } + if(mapping.ViewType == typeof(RobotDataView)) { + var robotDefinitions = defaultReader.GetAll().GetByCategoryFlags(CategoryFlags.cf_robots); + + foreach (var robotDefinition in robotDefinitions) { + object currentObject = entityFactory.Create(robotDefinition.Name, EntityIDGenerator.Random); + + ((Robot)currentObject).Unpack(); + + dynamic currentView = Activator.CreateInstance(mapping.ViewType, currentObject, this); + + returnItems.Add(currentView); + } + + return returnItems; + } + var categoryData = GetDataByItemCategoryName(mapping.Category); foreach (var categoryItem in categoryData) { diff --git a/Perpetuum.DataDumper/Views/ModuleWeaponDataView.cs b/Perpetuum.DataDumper/Views/ModuleWeaponDataView.cs index f4d49c413..5f20f4dcf 100644 --- a/Perpetuum.DataDumper/Views/ModuleWeaponDataView.cs +++ b/Perpetuum.DataDumper/Views/ModuleWeaponDataView.cs @@ -29,19 +29,19 @@ public string slot_flags { } public string slot_type { get { - return slot_flag_values.Intersect(typeFlags).SingleOrDefault().ToString(); + return slot_flag_values.Intersect(SLOT_TYPE_FLAGS).SingleOrDefault().ToString(); } } public string slot_size { get { - return slot_flag_values.Intersect(sizeFlags).SingleOrDefault().ToString(); + return slot_flag_values.Intersect(SLOT_SIZE_FLAGS).SingleOrDefault().ToString(); } } public string slot_location { get { - return slot_flag_values.Intersect(locationFlags).SingleOrDefault().ToString(); + return slot_flag_values.Intersect(SLOT_LOCATION_FLAGS).SingleOrDefault().ToString(); } } diff --git a/Perpetuum.DataDumper/Views/RobotDataView.cs b/Perpetuum.DataDumper/Views/RobotDataView.cs index a254cddd2..f8412b7a5 100644 --- a/Perpetuum.DataDumper/Views/RobotDataView.cs +++ b/Perpetuum.DataDumper/Views/RobotDataView.cs @@ -1,13 +1,15 @@ using Perpetuum.ExportedTypes; +using Perpetuum.Modules; using Perpetuum.Robots; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; +using static Perpetuum.DataDumper.DataDumper; -namespace Perpetuum.DataDumper { - class RobotDataView { +namespace Perpetuum.DataDumper.Views { + public class RobotDataView : ItemDataView { // Main Stats public double Speed { get; set; } public double Armor { get; set; } @@ -31,46 +33,94 @@ class RobotDataView { public double ResistanceChem { get; set; } public double ResistanceKinetic { get; set; } public double ResistanceSeismic { get; set; } - public decimal ResistanceThermal { get; set; } - public decimal ResistanceDemobilizer { get; set; } + public double ResistanceThermal { get; set; } + public double ResistanceDemobilizer { get; set; } // Targeting - public decimal SensorStrength { get; set; } - public decimal LockingRange { get; set; } - public decimal LockingTime { get; set; } - public decimal MaxLockedTargets { get; set; } - public decimal SignalDetection { get; set; } - public decimal SignalMasking { get; set; } + public double SensorStrength { get; set; } + public double LockingRange { get; set; } + public double LockingTime { get; set; } + public double MaxLockedTargets { get; set; } + public double SignalDetection { get; set; } + public double SignalMasking { get; set; } // Misc - public decimal AccumulatorRecharge { get; set; } - public decimal AccumulatorStability { get; set; } - public decimal InterferenceEmission { get; set; } - public decimal InterferenceRadius { get; set; } - public decimal InterferenceMin { get; set; } - public decimal InterferenceMax{ get; set; } - - public RobotDataView(Robot input) { + public double AccumulatorRecharge { get; set; } + public double AccumulatorStability { get; set; } + public double InterferenceEmission { get; set; } + public double InterferenceRadius { get; set; } + public double InterferenceMin { get; set; } + public double InterferenceMax { get; set; } + + public RobotDataView(Robot input, DataDumper dumper) { + dumper.InitItemView(this, input); + + var dictionaryData = input.ToDictionary(); + RobotHead head = input.GetRobotComponent(); RobotChassis chassis = input.GetRobotComponent(); RobotLeg legs = input.GetRobotComponent(); RobotInventory inventory = input.Components.OfType().SingleOrDefault(); - var props = input.Properties; + var allSlotFlags = head.ED.Options.SlotFlags + .Concat(chassis.ED.Options.SlotFlags) + .Concat(legs.ED.Options.SlotFlags).ToList(); - var test3 = input.GetPropertyModifier(AggregateField.speed_max); + var typeFlags = new List(); + + foreach (var slotFlags in allSlotFlags) { + var currentSlotTypes = EnumHelper.MaskToList((SlotFlags)Convert.ToInt64(slotFlags)).ToList() + .Intersect(SLOT_TYPE_FLAGS).ToList(); + + typeFlags.AddRange(currentSlotTypes); + } + - Speed = (double)input.Properties.SingleOrDefault(x=> x.Field == AggregateField.speed_max).Value; + // main Stats + Speed = (double)input.Properties.SingleOrDefault(x=> x.Field == AggregateField.speed_max).Value * 36; // needs to be multiplied by 36 Armor = input.ArmorMax; Accumulator = input.CoreMax; - Cargo = (int) inventory.GetCapacityInfo()["capacity"]; + Cargo = (double) inventory.GetCapacityInfo()["capacity"]; Cpu = input.Cpu; - Reactor = input.ReactorRadiation; - SlopeCapacity = input.Slope; + // The Max property is what we want, but it's not public and since this is a fake robot it will equal max + Reactor = input.PowerGrid; + SlopeCapacity = input.Slope; // TODO: Find multiplier for this + // Slots SlotsHead = head.MaxSlots; SlotsChassis = chassis.MaxSlots; SlotsLeg = legs.MaxSlots; + SlotsGuns = typeFlags.Where(x => x == SlotFlags.turret).Count(); + SlotsMissiles = typeFlags.Where(x => x == SlotFlags.missile).Count(); + SlotsIndustrial = typeFlags.Where(x => x == SlotFlags.industrial).Count(); + SlotsMisc = typeFlags.Where(x => x == SlotFlags.ew_and_engineering).Count(); + + // Defense + SurfaceSize = input.SignatureRadius; + ResistanceChem = input.GetPropertyModifier(AggregateField.resist_chemical).Value; + ResistanceKinetic = input.GetPropertyModifier(AggregateField.resist_kinetic).Value; + ResistanceSeismic = input.GetPropertyModifier(AggregateField.resist_explosive).Value; + ResistanceThermal = input.GetPropertyModifier(AggregateField.resist_thermal).Value; + ResistanceDemobilizer = input.GetPropertyModifier(AggregateField.effect_massivness_speed_max_modifier).Value; // TODO: Check this + + + // Targeting + SensorStrength = input.SensorStrength; // input.GetPropertyModifier(AggregateField.sensor_strength).Value; + + // Same as input.GetPropertyModifier(AggregateField.locking_range).Value * 10; + LockingRange = input.MaxTargetingRange * 10; + LockingTime = input.GetPropertyModifier(AggregateField.locking_time).Value / 1000; + MaxLockedTargets = input.GetPropertyModifier(AggregateField.locked_targets_max).Value; + SignalDetection = input.DetectionStrength; + SignalMasking = input.StealthStrength; + + // Misc + AccumulatorRecharge = input.CoreRechargeTime.TotalSeconds; + AccumulatorStability = input.ReactorRadiation; // TODO: Find this + InterferenceEmission = input.GetPropertyModifier(AggregateField.blob_emission).Value; // Same as input.BlobEmission but it's not public + InterferenceRadius = input.GetPropertyModifier(AggregateField.blob_emission_radius).Value * 10; // Same as input.BlobEmissionRadius but it's not public + InterferenceMin = input.GetPropertyModifier(AggregateField.blob_level_low).Value; + InterferenceMax = input.GetPropertyModifier(AggregateField.blob_level_high).Value; } } From 957423ce90e6360afc011e35093f8096395a73e6 Mon Sep 17 00:00:00 2001 From: DerekJarvis <6828105+DerekJarvis@users.noreply.github.com> Date: Sat, 9 Jan 2021 10:32:15 +0000 Subject: [PATCH 7/8] Robot data updates --- Perpetuum.DataDumper/Views/RobotDataView.cs | 25 ++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/Perpetuum.DataDumper/Views/RobotDataView.cs b/Perpetuum.DataDumper/Views/RobotDataView.cs index f8412b7a5..df7419dcf 100644 --- a/Perpetuum.DataDumper/Views/RobotDataView.cs +++ b/Perpetuum.DataDumper/Views/RobotDataView.cs @@ -83,8 +83,17 @@ public RobotDataView(Robot input, DataDumper dumper) { Cargo = (double) inventory.GetCapacityInfo()["capacity"]; Cpu = input.Cpu; // The Max property is what we want, but it's not public and since this is a fake robot it will equal max - Reactor = input.PowerGrid; - SlopeCapacity = input.Slope; // TODO: Find multiplier for this + Reactor = input.PowerGrid; + + if (input.Slope == 4) { + SlopeCapacity = 45; + } else if (input.Slope == 5) { + SlopeCapacity= 51; + } else if (input.Slope == 6) { + SlopeCapacity= 56; + } else { + SlopeCapacity = input.Slope; + } // Slots SlotsHead = head.MaxSlots; @@ -101,7 +110,7 @@ public RobotDataView(Robot input, DataDumper dumper) { ResistanceKinetic = input.GetPropertyModifier(AggregateField.resist_kinetic).Value; ResistanceSeismic = input.GetPropertyModifier(AggregateField.resist_explosive).Value; ResistanceThermal = input.GetPropertyModifier(AggregateField.resist_thermal).Value; - ResistanceDemobilizer = input.GetPropertyModifier(AggregateField.effect_massivness_speed_max_modifier).Value; // TODO: Check this + ResistanceDemobilizer = 0; // input.GetPropertyModifier(AggregateField.effect_massivness_speed_max_modifier).Value; // Targeting @@ -116,12 +125,18 @@ public RobotDataView(Robot input, DataDumper dumper) { // Misc AccumulatorRecharge = input.CoreRechargeTime.TotalSeconds; - AccumulatorStability = input.ReactorRadiation; // TODO: Find this + AccumulatorStability = input.ReactorRadiation; InterferenceEmission = input.GetPropertyModifier(AggregateField.blob_emission).Value; // Same as input.BlobEmission but it's not public InterferenceRadius = input.GetPropertyModifier(AggregateField.blob_emission_radius).Value * 10; // Same as input.BlobEmissionRadius but it's not public InterferenceMin = input.GetPropertyModifier(AggregateField.blob_level_low).Value; InterferenceMax = input.GetPropertyModifier(AggregateField.blob_level_high).Value; - + + // Required Extensions + var testExt = input.ExtensionBonusEnablerExtensions.ToList(); + var test2 = input.ED.EnablerExtensions; // Extensions required (Extension + Level) + var test3 = input.RobotComponents.SelectMany(component => component.ExtensionBonuses).ToList(); // Bonuses from extension + + // Extension Bonuses } } } From 11829e6154ea6445cd09f24a1db02f556b545cd8 Mon Sep 17 00:00:00 2001 From: DerekJarvis <6828105+DerekJarvis@users.noreply.github.com> Date: Sun, 24 Jan 2021 22:50:22 +0000 Subject: [PATCH 8/8] Weapons view updated to new format. Updated on Wiki. --- .../Views/ModuleWeaponDataView.cs | 48 +++++++++---------- 1 file changed, 23 insertions(+), 25 deletions(-) diff --git a/Perpetuum.DataDumper/Views/ModuleWeaponDataView.cs b/Perpetuum.DataDumper/Views/ModuleWeaponDataView.cs index 5f20f4dcf..c295d64d8 100644 --- a/Perpetuum.DataDumper/Views/ModuleWeaponDataView.cs +++ b/Perpetuum.DataDumper/Views/ModuleWeaponDataView.cs @@ -10,38 +10,37 @@ namespace Perpetuum.DataDumper.Views { public class ModuleWeaponDataView : ActiveModuleDataView { - public string ammo_type { get; set; } - public int ammo_capacity { get; set; } - public double module_damage { get; set; } - public double module_falloff { get; set; } - public double module_hit_dispersion { get; set; } - public double module_optimal_range { get; set; } - public string missile_optimal_range { get; set; } + public string AmmoType { get; set; } + public int AmmoCapacity { get; set; } + public double ModuleDamage { get; set; } + public double ModuleFalloff { get; set; } + public double ModuleHitDispersion { get; set; } + public string MissileOptimalRange { get; set; } - private List slot_flag_values; - public string slot_flags { + private List SlotFlagValues; + public string SlotFlags { get { - return String.Join(";", slot_flag_values.Select(x => x.ToString())); + return String.Join(";", SlotFlagValues.Select(x => x.ToString())); } set { - slot_flag_values = EnumHelper.MaskToList((SlotFlags)Convert.ToInt64(value)).ToList(); + SlotFlagValues = EnumHelper.MaskToList((SlotFlags)Convert.ToInt64(value)).ToList(); } } - public string slot_type { + public string SlotType { get { - return slot_flag_values.Intersect(SLOT_TYPE_FLAGS).SingleOrDefault().ToString(); + return SlotFlagValues.Intersect(SLOT_TYPE_FLAGS).SingleOrDefault().ToString(); } } - public string slot_size { + public string SlotSize { get { - return slot_flag_values.Intersect(SLOT_SIZE_FLAGS).SingleOrDefault().ToString(); + return SlotFlagValues.Intersect(SLOT_SIZE_FLAGS).SingleOrDefault().ToString(); } } - public string slot_location { + public string SlotLocation { get { - return slot_flag_values.Intersect(SLOT_LOCATION_FLAGS).SingleOrDefault().ToString(); + return SlotFlagValues.Intersect(SLOT_LOCATION_FLAGS).SingleOrDefault().ToString(); } } @@ -52,13 +51,12 @@ public ModuleWeaponDataView(WeaponModule item, DataDumper dumper) { dictionaryData["ammoCategoryFlags"] = (CategoryFlags)dictionaryData["ammoCategoryFlags"]; - ammo_type = dumper.GetLocalizedName(((CategoryFlags)dictionaryData["ammoCategoryFlags"]).ToString()).Replace(";undefined", ""); - slot_flags = item.ModuleFlag.ToString(); - ammo_capacity = item.AmmoCapacity; - module_damage = item.DamageModifier.Value * 100; - module_falloff = item.Properties.Single(x => x.Field == AggregateField.falloff).Value * 10; - module_hit_dispersion = item.Accuracy.Value; - module_optimal_range = item.OptimalRange * 10; + AmmoType = dumper.GetLocalizedName(((CategoryFlags)dictionaryData["ammoCategoryFlags"]).ToString()).Replace(";undefined", ""); + SlotFlags = item.ModuleFlag.ToString(); + AmmoCapacity = item.AmmoCapacity; + ModuleDamage = item.DamageModifier.Value * 100; + ModuleFalloff = item.Properties.Single(x => x.Field == AggregateField.falloff).Value * 10; + ModuleHitDispersion = item.Accuracy.Value; var rangeModifierProperty = item.GetBasePropertyModifier(AggregateField.module_missile_range_modifier); @@ -69,7 +67,7 @@ public ModuleWeaponDataView(WeaponModule item, DataDumper dumper) { directionSymbol = "-"; } - missile_optimal_range = directionSymbol + (rangeModifierProperty.Value - 1) * 100 + "%"; + MissileOptimalRange = directionSymbol + (rangeModifierProperty.Value - 1) * 100 + "%"; } }