/// <summary>
        /// Performs mod structure validation, XML and XSD validation, resource validation and expansion requirement validation.
        /// </summary>
        /// <returns></returns>
        public ModValidationResult Validate()
        {
            ModValidationResult result = new ModValidationResult();

            var modFolder = mod.GetDirectory(@"mod");

            if (modFolder == null)
            {
                result.ModErrors.Add("The required folder, 'mod', was not found.");
                return(result);
            }

            var modFile = modFolder.GetFile("mod.xml");

            if (modFile == null)
            {
                result.ModErrors.Add("The required file, 'mod/mod.xml', was not found.");
                return(result);
            }

            var xmlFiles = modFolder.EnumerateXmlFiles(DredmorInfo.XmlFilesToValidate, SearchOption.TopDirectoryOnly);

            XsdValidator xsd = new XsdValidator();

            result.XmlErrors = xsd.Validate(xmlFiles, true);

            if (!result.IsValid && result.XmlErrors.Any(p => p.XmlExceptionOccurred))
            {
                return(result);
            }

            resources.LoadResources(mod);

            result.XmlErrors.AddRange(
                XmlResourceValidator.Validate(
                    xmlFiles.Where(p => p.Name.ToLower() != "mod.xml"),
                    resources,
                    ExpansionResourcesUsed
                    )
                .Where(p => p.Errors.Count > 0)
                );

            result.ExpansionResourcedUsed = ExpansionResourcesUsed;

            result.ExpansionNumbersUsed =
                ExpansionResourcesUsed.Animations.Select(p => p.ExpansionNumber)
                .Concat(result.ExpansionResourcedUsed.Files.Select(p => p.ExpansionNumber))
                .Concat(result.ExpansionResourcedUsed.ContentResources.Select(p => p.ExpansionNumber))
                .Distinct()
                .OrderBy(p => p)
                .ToList();

            AddRequirementErrors(result, modFile);

            return(result);
        }
        /// <summary>
        /// Performs XML and XSD validation. If no files are malformed the performs resource validation.
        /// </summary>
        /// <returns></returns>
        public CoreValidationResult Validate()
        {
            CoreValidationResult result = new CoreValidationResult();

            var xmlFiles = core.EnumerateXmlFiles(DredmorInfo.XmlFilesToValidate, SearchOption.AllDirectories);

            XsdValidator xsd = new XsdValidator();

            result.XmlErrors = xsd.Validate(xmlFiles, true);

            if (!result.IsValid && result.XmlErrors.Any(p => p.XmlExceptionOccurred))
            {
                return(result);
            }

            resources.LoadResources(core);

            result.XmlErrors.AddRange(
                XmlResourceValidator.Validate(xmlFiles, resources)
                .Where(p => p.Errors.Count > 0)
                );

            return(result);
        }