From d97f469a7eba8c44ad062d681eee378d4c9f1d3e Mon Sep 17 00:00:00 2001 From: algernon-A Date: Fri, 9 Sep 2022 23:54:09 +1000 Subject: [PATCH] Minor refactoring. --- Code/VolumetricData/ConfigurationUtils.cs | 407 ++++++++++++---------- 1 file changed, 221 insertions(+), 186 deletions(-) diff --git a/Code/VolumetricData/ConfigurationUtils.cs b/Code/VolumetricData/ConfigurationUtils.cs index 441bda5..94a2d7b 100644 --- a/Code/VolumetricData/ConfigurationUtils.cs +++ b/Code/VolumetricData/ConfigurationUtils.cs @@ -54,259 +54,294 @@ internal static void LoadSettings() { XmlSerializer xmlSerializer = new XmlSerializer(typeof(Configuration)); - if (!(xmlSerializer.Deserialize(reader) is Configuration configFile)) + if (xmlSerializer.Deserialize(reader) is Configuration configFile) { - Logging.Error("couldn't deserialize configuration file"); + Deserialize(configFile); } else { - // Deserialise population calculation packs. - foreach (Configuration.PopPackXML xmlPack in configFile.PopPacks) + Logging.Error("couldn't deserialize configuration file"); + } + } + + // Record configuation as being read. + ConfigRead = true; + } + catch (Exception e) + { + Logging.LogException(e, "exception reading configuration file"); + } + } + + /// + /// Save settings to XML file. + /// + internal static void SaveSettings() + { + try + { + // Pretty straightforward. + using (StreamWriter writer = new StreamWriter(Path.Combine(UserDirPath, ConfigFileName))) + { + XmlSerializer xmlSerializer = new XmlSerializer(typeof(Configuration)); + + // Write to file. + xmlSerializer.Serialize(writer, Serialize()); + } + + // Delete any legacy (appdir) config. + if (File.Exists(ConfigFileName)) + { + File.Delete(ConfigFileName); + } + } + catch (Exception e) + { + Logging.LogException(e, "exception saving configuration file"); + } + } + + + /// + /// Serializes current settings into a new configuration. + /// + /// New configuration. + private static Configuration Serialize() + { + try + { + Configuration configuration = new Configuration + { + // Serialise custom packs. + PopPacks = new List(), + }; + + // Iterate through all calculation packs in our dictionary. + foreach (DataPack calcPack in PopData.Instance.CalcPacks) + { + // Look for volumetric packs. + if (calcPack is VolumetricPopPack volPack) + { + // Look for packs marked as custom. + if (volPack.Version == DataPack.DataVersion.CustomOne) { - // Convert to volumetric pack. - VolumetricPopPack volPack = new VolumetricPopPack(DataPack.DataVersion.CustomOne, xmlPack.Service) + // Found one - serialise it. + Configuration.PopPackXML xmlPack = new Configuration.PopPackXML() { - Name = xmlPack.Name, + Name = volPack.Name, + Service = volPack.Service, + CalculationLevels = new List(), }; - // Iterate through each level in the xml and add to our volumetric pack. - foreach (Configuration.PopLevel calculationLevel in xmlPack.CalculationLevels) + // Iterate through each level and add it to our serialisation. + for (int i = 0; i < volPack.Levels.Length; ++i) { - volPack.Levels[calculationLevel.Level] = new VolumetricPopPack.LevelData() + Configuration.PopLevel xmlLevel = new Configuration.PopLevel() { - EmptyArea = calculationLevel.EmptyArea, - EmptyPercent = calculationLevel.EmptyPercent, - AreaPer = calculationLevel.AreaPer, - MultiFloorUnits = calculationLevel.MultiLevel, + Level = i, + EmptyArea = volPack.Levels[i].EmptyArea, + EmptyPercent = volPack.Levels[i].EmptyPercent, + AreaPer = volPack.Levels[i].AreaPer, + MultiLevel = volPack.Levels[i].MultiFloorUnits, }; + + xmlPack.CalculationLevels.Add(xmlLevel); } - // Add new pack to our dictionary. - PopData.Instance.AddCalculationPack(volPack); + // Add to file. + configuration.PopPacks.Add(xmlPack); } + } + } + + // Serialise custom packs. + // TODO method with above + configuration.FloorPacks = new List(); - // Deserialise floor calculation packs. - foreach (Configuration.FloorPackXML xmlPack in configFile.FloorPacks) + // Iterate through all calculation packs in our dictionary. + foreach (DataPack calcPack in FloorData.Instance.CalcPacks) + { + // Look for volumetric packs. + if (calcPack is FloorDataPack floorPack) + { + // Look for packs marked as custom. + if (floorPack.Version == DataPack.DataVersion.CustomOne) { - // Convert to floor pack. - FloorDataPack floorPack = new FloorDataPack(DataPack.DataVersion.CustomOne) + // Found one - serialise it. + Configuration.FloorPackXML xmlPack = new Configuration.FloorPackXML() { - Name = xmlPack.Name, - m_floorHeight = xmlPack.FloorHeight, - m_firstFloorMin = xmlPack.FirstMin, - m_firstFloorExtra = xmlPack.FirstExtra, - m_firstFloorEmpty = xmlPack.FirstEmpty, + Name = floorPack.Name, + FloorHeight = floorPack.m_floorHeight, + FirstMin = floorPack.m_firstFloorMin, + FirstExtra = floorPack.m_firstFloorExtra, + FirstEmpty = floorPack.m_firstFloorEmpty, }; - // Add new pack to our dictionary. - FloorData.Instance.AddCalculationPack(floorPack); + // Add to file. + configuration.FloorPacks.Add(xmlPack); } + } + } - // Deserialise consumption records. - DataMapping mapper = new DataMapping(); - foreach (Configuration.ConsumptionRecord consumptionRecord in configFile.Consumption) - { - // Get relevant DataStore array for this record. - int[][] dataArray = mapper.GetArray(consumptionRecord.Service, consumptionRecord.SubService); - - // Iterate through each consumption line and populate relevant DataStore fields. - foreach (Configuration.ConsumptionLine consumptionLine in consumptionRecord.Levels) - { - int level = (int)consumptionLine.Level; - dataArray[level][DataStore.POWER] = consumptionLine.Power; - dataArray[level][DataStore.WATER] = consumptionLine.Water; - dataArray[level][DataStore.SEWAGE] = consumptionLine.Sewage; - dataArray[level][DataStore.GARBAGE] = consumptionLine.Garbage; - dataArray[level][DataStore.GROUND_POLLUTION] = consumptionLine.Pollution; - dataArray[level][DataStore.NOISE_POLLUTION] = consumptionLine.Noise; - dataArray[level][DataStore.MAIL] = consumptionLine.Mail; - dataArray[level][DataStore.INCOME] = consumptionLine.Income; - } - } + // Serialise consumption information. + configuration.Consumption = GetConsumptionRecords(); - // Deserialise default pack lists. - PopData.Instance.DeserializeDefaults(configFile.PopDefaults); - FloorData.Instance.DeserializeDefaults(configFile.FloorDefaults); + // Serialise default dictionaries. + configuration.PopDefaults = PopData.Instance.SerializeDefaults(); + configuration.FloorDefaults = FloorData.Instance.SerializeDefaults(); - // Deserialise building pack lists. - PopData.Instance.DeserializeBuildings(configFile.Buildings); - FloorData.Instance.DeserializeBuildings(configFile.Buildings); - SchoolData.Instance.DeserializeBuildings(configFile.Buildings); - Multipliers.Instance.DeserializeBuildings(configFile.Buildings); + // Serialise building pack dictionaries, in order. + SortedList buildingList = PopData.Instance.SerializeBuildings(); + buildingList = FloorData.Instance.SerializeBuildings(buildingList); + buildingList = SchoolData.Instance.SerializeBuildings(buildingList); + buildingList = Multipliers.Instance.SerializeBuildings(buildingList); + configuration.Buildings = buildingList.Values.ToList(); - // Deserialise building population overrides. - PopData.Instance.DeserializeOverrides(configFile.PopOverrides); + // Serialise building population overrides. + configuration.PopOverrides = PopData.Instance.SerializeOverrides(); - // Deserialize floor overrides. - foreach (Configuration.FloorCalcOverride floorOverride in configFile.Floors) - { - FloorData.Instance.SetOverride(floorOverride.Prefab, new FloorDataPack(DataPack.DataVersion.OverrideOne) - { - m_firstFloorMin = floorOverride.FirstHeight, - m_floorHeight = floorOverride.FloorHeight, - }); - } + // Serialise floor overrides. + configuration.Floors = FloorData.Instance.SerializeOverrides(); - // Deserialise visit modes. - Visitors.DeserializeVisits(configFile.VisitorModes); + // Serialise visit modes. + configuration.VisitorModes = Visitors.SerializeVisits(); - // Deserialise commercial sales multipliers. - GoodsUtils.DeserializeSalesMults(configFile.SalesMults); + // Serialise commercial sales multipliers. + configuration.SalesMults = GoodsUtils.SerializeSalesMults(); - // Deserialise office production multipliers. - OfficeProduction.DeserializeProdMults(configFile.OffProdMults); + // Serialise office production multipliers. + configuration.OffProdMults = OfficeProduction.SerializeProdMults(); - // Deserialize industrial production calculation modes. - IndustrialProduction.DeserializeProds(configFile.IndProdModes); - ExtractorProduction.DeserializeProds(configFile.ExtProdModes); + // Serialize industrial production calculation modes. + configuration.IndProdModes = IndustrialProduction.SerializeProds(); + configuration.ExtProdModes = ExtractorProduction.SerializeProds(); - // Deserialise commercial inventory caps. - GoodsUtils.DeserializeInvCaps(configFile.ComIndCaps); - } - } + // Serialise commercial inventory caps. + configuration.ComIndCaps = GoodsUtils.SerializeInvCaps(); - // Record configuation as being read. - ConfigRead = true; + return configuration; } catch (Exception e) { - Logging.LogException(e, "exception reading configuration file"); + Logging.LogException(e, "exception serializing configuration"); + return null; } } /// - /// Save settings to XML file. + /// Deserializes the provided configuration file. /// - internal static void SaveSettings() + /// Configuration to deserialize. + private static void Deserialize(Configuration configuration) { try { - // Pretty straightforward. Serialisation is within settings file class. - using (StreamWriter writer = new StreamWriter(Path.Combine(UserDirPath, ConfigFileName))) + // Deserialise population calculation packs. + foreach (Configuration.PopPackXML xmlPack in configuration.PopPacks) { - XmlSerializer xmlSerializer = new XmlSerializer(typeof(Configuration)); - Configuration configFile = new Configuration + // Convert to volumetric pack. + VolumetricPopPack volPack = new VolumetricPopPack(DataPack.DataVersion.CustomOne, xmlPack.Service) { - // Serialise custom packs. - PopPacks = new List(), + Name = xmlPack.Name, }; - // Iterate through all calculation packs in our dictionary. - foreach (DataPack calcPack in PopData.Instance.CalcPacks) + // Iterate through each level in the xml and add to our volumetric pack. + foreach (Configuration.PopLevel calculationLevel in xmlPack.CalculationLevels) { - // Look for volumetric packs. - if (calcPack is VolumetricPopPack volPack) + volPack.Levels[calculationLevel.Level] = new VolumetricPopPack.LevelData() { - // Look for packs marked as custom. - if (volPack.Version == DataPack.DataVersion.CustomOne) - { - // Found one - serialise it. - Configuration.PopPackXML xmlPack = new Configuration.PopPackXML() - { - Name = volPack.Name, - Service = volPack.Service, - CalculationLevels = new List(), - }; - - // Iterate through each level and add it to our serialisation. - for (int i = 0; i < volPack.Levels.Length; ++i) - { - Configuration.PopLevel xmlLevel = new Configuration.PopLevel() - { - Level = i, - EmptyArea = volPack.Levels[i].EmptyArea, - EmptyPercent = volPack.Levels[i].EmptyPercent, - AreaPer = volPack.Levels[i].AreaPer, - MultiLevel = volPack.Levels[i].MultiFloorUnits, - }; - - xmlPack.CalculationLevels.Add(xmlLevel); - } - - // Add to file. - configFile.PopPacks.Add(xmlPack); - } - } + EmptyArea = calculationLevel.EmptyArea, + EmptyPercent = calculationLevel.EmptyPercent, + AreaPer = calculationLevel.AreaPer, + MultiFloorUnits = calculationLevel.MultiLevel, + }; } - // Serialise custom packs. - // TODO method with above - configFile.FloorPacks = new List(); + // Add new pack to our dictionary. + PopData.Instance.AddCalculationPack(volPack); + } - // Iterate through all calculation packs in our dictionary. - foreach (DataPack calcPack in FloorData.Instance.CalcPacks) + // Deserialise floor calculation packs. + foreach (Configuration.FloorPackXML xmlPack in configuration.FloorPacks) + { + // Convert to floor pack. + FloorDataPack floorPack = new FloorDataPack(DataPack.DataVersion.CustomOne) { - // Look for volumetric packs. - if (calcPack is FloorDataPack floorPack) - { - // Look for packs marked as custom. - if (floorPack.Version == DataPack.DataVersion.CustomOne) - { - // Found one - serialise it. - Configuration.FloorPackXML xmlPack = new Configuration.FloorPackXML() - { - Name = floorPack.Name, - FloorHeight = floorPack.m_floorHeight, - FirstMin = floorPack.m_firstFloorMin, - FirstExtra = floorPack.m_firstFloorExtra, - FirstEmpty = floorPack.m_firstFloorEmpty, - }; - - // Add to file. - configFile.FloorPacks.Add(xmlPack); - } - } - } + Name = xmlPack.Name, + m_floorHeight = xmlPack.FloorHeight, + m_firstFloorMin = xmlPack.FirstMin, + m_firstFloorExtra = xmlPack.FirstExtra, + m_firstFloorEmpty = xmlPack.FirstEmpty, + }; - // Serialise consumption information. - configFile.Consumption = GetConsumptionRecords(); + // Add new pack to our dictionary. + FloorData.Instance.AddCalculationPack(floorPack); + } - // Serialise default dictionaries. - configFile.PopDefaults = PopData.Instance.SerializeDefaults(); - configFile.FloorDefaults = FloorData.Instance.SerializeDefaults(); + // Deserialise consumption records. + DataMapping mapper = new DataMapping(); + foreach (Configuration.ConsumptionRecord consumptionRecord in configuration.Consumption) + { + // Get relevant DataStore array for this record. + int[][] dataArray = mapper.GetArray(consumptionRecord.Service, consumptionRecord.SubService); - // Serialise building pack dictionaries, in order. - SortedList buildingList = PopData.Instance.SerializeBuildings(); - buildingList = FloorData.Instance.SerializeBuildings(buildingList); - buildingList = SchoolData.Instance.SerializeBuildings(buildingList); - buildingList = Multipliers.Instance.SerializeBuildings(buildingList); - configFile.Buildings = buildingList.Values.ToList(); + // Iterate through each consumption line and populate relevant DataStore fields. + foreach (Configuration.ConsumptionLine consumptionLine in consumptionRecord.Levels) + { + int level = (int)consumptionLine.Level; + dataArray[level][DataStore.POWER] = consumptionLine.Power; + dataArray[level][DataStore.WATER] = consumptionLine.Water; + dataArray[level][DataStore.SEWAGE] = consumptionLine.Sewage; + dataArray[level][DataStore.GARBAGE] = consumptionLine.Garbage; + dataArray[level][DataStore.GROUND_POLLUTION] = consumptionLine.Pollution; + dataArray[level][DataStore.NOISE_POLLUTION] = consumptionLine.Noise; + dataArray[level][DataStore.MAIL] = consumptionLine.Mail; + dataArray[level][DataStore.INCOME] = consumptionLine.Income; + } + } - // Serialise building population overrides. - configFile.PopOverrides = PopData.Instance.SerializeOverrides(); + // Deserialise default pack lists. + PopData.Instance.DeserializeDefaults(configuration.PopDefaults); + FloorData.Instance.DeserializeDefaults(configuration.FloorDefaults); - // Serialise floor overrides. - configFile.Floors = FloorData.Instance.SerializeOverrides(); + // Deserialise building pack lists. + PopData.Instance.DeserializeBuildings(configuration.Buildings); + FloorData.Instance.DeserializeBuildings(configuration.Buildings); + SchoolData.Instance.DeserializeBuildings(configuration.Buildings); + Multipliers.Instance.DeserializeBuildings(configuration.Buildings); - // Serialise visit modes. - configFile.VisitorModes = Visitors.SerializeVisits(); + // Deserialise building population overrides. + PopData.Instance.DeserializeOverrides(configuration.PopOverrides); - // Serialise commercial sales multipliers. - configFile.SalesMults = GoodsUtils.SerializeSalesMults(); + // Deserialize floor overrides. + foreach (Configuration.FloorCalcOverride floorOverride in configuration.Floors) + { + FloorData.Instance.SetOverride(floorOverride.Prefab, new FloorDataPack(DataPack.DataVersion.OverrideOne) + { + m_firstFloorMin = floorOverride.FirstHeight, + m_floorHeight = floorOverride.FloorHeight, + }); + } - // Serialise office production multipliers. - configFile.OffProdMults = OfficeProduction.SerializeProdMults(); + // Deserialise visit modes. + Visitors.DeserializeVisits(configuration.VisitorModes); - // Serialize industrial production calculation modes. - configFile.IndProdModes = IndustrialProduction.SerializeProds(); - configFile.ExtProdModes = ExtractorProduction.SerializeProds(); + // Deserialise commercial sales multipliers. + GoodsUtils.DeserializeSalesMults(configuration.SalesMults); - // Serialise commercial inventory caps. - configFile.ComIndCaps = GoodsUtils.SerializeInvCaps(); + // Deserialise office production multipliers. + OfficeProduction.DeserializeProdMults(configuration.OffProdMults); - // Write to file. - xmlSerializer.Serialize(writer, configFile); - } + // Deserialize industrial production calculation modes. + IndustrialProduction.DeserializeProds(configuration.IndProdModes); + ExtractorProduction.DeserializeProds(configuration.ExtProdModes); - // Delete any legacy (appdir) config. - if (File.Exists(ConfigFileName)) - { - File.Delete(ConfigFileName); - } + // Deserialise commercial inventory caps. + GoodsUtils.DeserializeInvCaps(configuration.ComIndCaps); } catch (Exception e) { - Logging.LogException(e, "exception saving configuration file"); + Logging.LogException(e, "exception deserializing configuration"); } }