public XElement ProcessGunListFile(string nation)
 {
     return(ProcessModuleListFile(_paths.GetGunListFile(nation), "gun", g => BigworldXmlPreprocessor.ProcessGunNode(g, this.CommonVehicleData, true)));
 }
        public XElement ProcessTankFile(string nation, string key)
        {
            var element = BigworldXmlPreprocessor.LoadFile(_paths.GetTankFile(nation, key));

            element.TrimNameTail()
            .NameToAttribute("tank")
            .RenameElement("crew", "crews")
            .RenameElement("camouflage", "camouflageInfo")
            .ProcessElements("crews",
                             e => e.NameToAttribute("crew", "role")
                             .TextToElement("secondaryRoles")
                             .Select("secondaryRoles",
                                     s =>
                                     s.TextToElementList("secondaryRole")))
            .Select("hull",
                    e =>
            {
                e.ProcessArmorList(this.CommonVehicleData)
                .Select("armor",
                        a => a.AppendCommonArmorGroup(this.CommonVehicleData, "surveyingDevice")
                        .AppendCommonArmorGroup(this.CommonVehicleData, "turretRotator"));

                BigworldXmlPreprocessor.ProcessHitTester(e);
            })
            .ProcessTankModuleListNode("chassis",
                                       "chassis",
                                       _localization,
                                       e =>
            {
                e.ProcessArmorList(this.CommonVehicleData)
                .Select("terrainResistance",
                        t => t.TextToElements("hard", "medium", "soft"));

                BigworldXmlPreprocessor.ProcessHitTester(e);
            })
            .RenameElement("turrets0", "turrets")
            .ProcessTankModuleListNode("turrets",
                                       "turret",
                                       _localization,
                                       e =>
            {
                e.ProcessArmorList(this.CommonVehicleData)
                .Select("armor", a => a.AppendCommonArmorGroup(this.CommonVehicleData, "surveyingDevice"))
                .ProcessTankModuleListNode("guns",
                                           "gun",
                                           _localization,
                                           g => BigworldXmlPreprocessor.ProcessGunNode(g, this.CommonVehicleData, false));


                BigworldXmlPreprocessor.ProcessHitTester(e);
            })
            .ProcessTankModuleListNode("engines",
                                       "engine",
                                       _localization,
                                       BigworldXmlPreprocessor.ProcessEngineNode)
            .ProcessTankModuleListNode("fuelTanks", "fuelTank", _localization)
            .ProcessTankModuleListNode("radios", "radio", _localization);

            var unlockNodes = element.XPathSelectElements("(chassis/chassis|turrets/turret|turrets/turret/guns/gun|engines/engine|radios/radio)/unlocks/*");

            foreach (var unlockNode in unlockNodes)
            {
                string searchRootPath;
                switch (unlockNode.Name.LocalName)
                {
                case "gun":
                    searchRootPath = "turrets/turret/guns/gun";
                    break;

                case "chassis":
                    searchRootPath = "chassis/chassis";
                    break;

                case "turret":
                    searchRootPath = "turrets/turret";
                    break;

                case "engine":
                    searchRootPath = "engines/engine";
                    break;

                case "radio":
                    searchRootPath = "radios/radio";
                    break;

                default:
                    continue;
                }

                var targetElements = element.XPathSelectElements(string.Format("{0}[@key='{1}']",
                                                                               searchRootPath,
                                                                               unlockNode.Attribute("key").Value));

                foreach (var targetElement in targetElements)
                {
                    var costElement = unlockNode.Element("cost");
                    Debug.Assert(costElement != null, "costElement != null");
                    targetElement.SetElementValue("experience", costElement.Value);
                }
            }

            return(element);
        }