public void DispatchEvents(VerifierResult res) { if (MalformedWadFiles != null) { MalformedWadFiles(res.MalformedWadFiles); } if (MisnamedModDirs != null) { MisnamedModDirs(res.MisnamedModDirs); } if (NotExistingFiles != null) { NotExistingFiles(res.NotExistingFiles); } if (MissingTextures != null) { MissingTextures(res.MissingTextures); } if (UsedSprites != null) { UsedSprites(res.UsedSprites); } if (MissingSprites != null) { MissingSprites(res.MissingSprites); } if (UsedSounds != null) { UsedSounds(res.UsedSounds); } if (MissingSounds != null) { MissingSounds(res.MissingSounds); } if (UsedModels != null) { UsedModels(res.UsedModels); } if (MissingModels != null) { MissingModels(res.MissingModels); } }
public static int CalculateBadPoints(VerifierResult res) { return res.MalformedWadFiles.Length + res.MisnamedModDirs.Length * 2 + res.NotExistingFiles.Length * 4; }
public VerifierResult VerifyMap(string map) { VerifierResult res = new VerifierResult(); ValveFile[] wadfiles = GetWadFiles(); var fullmap = Path.Combine(ModMapsDirectory, map); if (!File.Exists(fullmap)) { throw new Exception(string.Format("Map does not exist: {0}", fullmap)); } BSPParser bp = new BSPParser(File.OpenRead(fullmap)); if (!bp.LoadDirectoryTables()) { throw new Exception("Malformed file"); } var textureList = bp.LoadMipTexturesArray() .Where(t => t.offset1 == 0 && t.offset2 == 0 && t.offset3 == 0 && t.offset4 == 0) .Select(t => t.name.ToString()) .ToList(); string entities = bp.ReadEntities(); bp.Close(); EntityParser ep = new EntityParser(entities); var ent = ep.ReadEntities(); List <ValveFile> existingWads = new List <ValveFile>(); List <string> malformedWadFiles = new List <string>(); List <string> misnamedModDirs = new List <string>(); List <string> notExistingFiles = new List <string>(); if (ent.ContainsKey("worldspawn")) { string skyname = ent["worldspawn"][0]["skyname"]; string wadList = ent["worldspawn"][0]["wad"]; var list = Seperate(wadList); foreach (string fullReferencedWadFile in list) { string referencedRelevantWadFile = fullReferencedWadFile.GetRelevantPath(); ValveFile referencedFile = new ValveFile(referencedRelevantWadFile); ValveFile existingFile = GetWadFile(wadfiles, referencedFile); if (referencedRelevantWadFile != fullReferencedWadFile) { malformedWadFiles.Add(fullReferencedWadFile); } if (existingFile != null) { if (existingFile.Compare(referencedFile) == ValveFileDifference.EqualFile) { misnamedModDirs.Add(fullReferencedWadFile); } existingWads.Add(existingFile); } else { notExistingFiles.Add(fullReferencedWadFile); } } res.MalformedWadFiles = malformedWadFiles.ToArray(); res.MisnamedModDirs = misnamedModDirs.ToArray(); res.NotExistingFiles = notExistingFiles.ToArray(); #region Textures List <string> existingFilenames = new List <string>(); foreach (var wadFile in existingWads) { WADParser wp = new WADParser(File.OpenRead(wadFile.ToString(BaseDirectory))); existingFilenames.AddRange(wp.LoadFileArray().Select(f => f.filename.ToString().ToLower())); wp.Close(); } List <string> missingTextures = new List <string>(); foreach (var item in textureList) { if (!existingFilenames.Contains(item.ToLower())) { missingTextures.Add(item); } } res.MissingTextures = missingTextures.ToArray(); #endregion #region Sprites List <string> sprites = new List <string>(); if (ent.ContainsKey("env_sprite")) { foreach (var dict in ent["env_sprite"]) { string model = dict["model"]; if (!sprites.Contains(model)) { sprites.Add(model); } } } res.UsedSprites = sprites.ToArray(); List <string> missingSprites = new List <string>(); foreach (string sprite in sprites) { ValveFile file = GetFile(sprite); if (file == null) { missingSprites.Add(sprite); } } res.MissingSprites = missingSprites.ToArray(); #endregion #region Sounds List <string> sounds = new List <string>(); if (ent.ContainsKey("ambient_generic")) { foreach (var ambient in ent["ambient_generic"]) { if (ambient.ContainsKey("message")) { string message = Path.Combine(SoundDir, ambient["message"]); if (!sounds.Contains(message)) { sounds.Add(message); } } } } res.UsedSounds = sounds.ToArray(); List <string> missingSounds = new List <string>(); foreach (string sound in sounds) { ValveFile file = GetFile(sound); if (file == null) { missingSounds.Add(sound); } } res.MissingSounds = missingSounds.ToArray(); #endregion #region Models List <string> models = new List <string>(); foreach (var entityPair in ent) { foreach (var entity in entityPair.Value) { if (entity.ContainsKey("model")) { string model = entity["model"]; if (!model.EndsWith(".mdl")) { continue; } if (!models.Contains(model)) { models.Add(model); } } } } res.UsedModels = models.ToArray(); List <string> missingModels = new List <string>(); foreach (var model in models) { ValveFile file = GetFile(model); if (file == null) { missingModels.Add(model); } } res.MissingModels = missingModels.ToArray(); #endregion } res.UsedFileList = Sort(res.UsedSprites, res.UsedSounds, res.UsedModels); res.MissingFileList = Sort(res.MissingSprites, res.MissingSounds, res.MissingModels); return(res); }
public VerifierResult VerifyMap(string map) { VerifierResult res = new VerifierResult(); ValveFile[] wadfiles = GetWadFiles(); var fullmap = Path.Combine(ModMapsDirectory, map); if (!File.Exists(fullmap)) { throw new Exception(string.Format("Map does not exist: {0}", fullmap)); } BSPParser bp = new BSPParser(File.OpenRead(fullmap)); if (!bp.LoadDirectoryTables()) { throw new Exception("Malformed file"); } List<string> textureList = new List<string>(); bp.LoadMipTextureOffsets(); bp.OnLoadMipTexture += (texture) => { if ((texture.offset1 == 0) && (texture.offset2 == 0) && (texture.offset3 == 0) && (texture.offset4 == 0)) { textureList.Add(texture.Name); } }; bp.LoadMipTextures(); string entities = bp.ReadEntities(); bp.Close(); EntityParser ep = new EntityParser(entities); var ent = ep.ReadEntities(); List<ValveFile> existingWads = new List<ValveFile>(); List<string> malformedWadFiles = new List<string>(); List<string> misnamedModDirs = new List<string>(); List<string> notExistingFiles = new List<string>(); if (ent.ContainsKey("worldspawn")) { string skyname = ent["worldspawn"][0]["skyname"]; string wadList = ent["worldspawn"][0]["wad"]; var list = Seperate(wadList); foreach (string fullReferencedWadFile in list) { string referencedRelevantWadFile = fullReferencedWadFile.GetRelevantPath(); ValveFile referencedFile = new ValveFile(referencedRelevantWadFile); ValveFile existingFile = GetWadFile(wadfiles, referencedFile); if (referencedRelevantWadFile != fullReferencedWadFile) { malformedWadFiles.Add(fullReferencedWadFile); } if (existingFile != null) { if (existingFile.Compare(referencedFile) == ValveFileDifference.EqualFile) { misnamedModDirs.Add(fullReferencedWadFile); } existingWads.Add(existingFile); } else { notExistingFiles.Add(fullReferencedWadFile); } } res.MalformedWadFiles = malformedWadFiles.ToArray(); res.MisnamedModDirs = misnamedModDirs.ToArray(); res.NotExistingFiles = notExistingFiles.ToArray(); #region Textures List<string> existingFilenames = new List<string>(); foreach (var wadFile in existingWads) { WADParser wp = new WADParser(File.OpenRead(wadFile.ToString(BaseDirectory))); wp.OnLoadFile += (file) => { existingFilenames.Add(file.Filename.ToLower()); }; wp.LoadFiles(); wp.Close(); } List<string> missingTextures = new List<string>(); foreach (var item in textureList) { if (!existingFilenames.Contains(item.ToLower())) { missingTextures.Add(item); } } res.MissingTextures = missingTextures.ToArray(); #endregion #region Sprites List<string> sprites = new List<string>(); if (ent.ContainsKey("env_sprite")) { foreach (var dict in ent["env_sprite"]) { string model = dict["model"]; if (!sprites.Contains(model)) { sprites.Add(model); } } } res.UsedSprites = sprites.ToArray(); List<string> missingSprites = new List<string>(); foreach (string sprite in sprites) { ValveFile file = GetFile(sprite); if (file == null) { missingSprites.Add(sprite); } } res.MissingSprites = missingSprites.ToArray(); #endregion #region Sounds List<string> sounds = new List<string>(); if (ent.ContainsKey("ambient_generic")) { foreach (var ambient in ent["ambient_generic"]) { if (ambient.ContainsKey("message")) { string message = Path.Combine(SoundDir, ambient["message"]); if (!sounds.Contains(message)) { sounds.Add(message); } } } } res.UsedSounds = sounds.ToArray(); List<string> missingSounds = new List<string>(); foreach (string sound in sounds) { ValveFile file = GetFile(sound); if (file == null) { missingSounds.Add(sound); } } res.MissingSounds = missingSounds.ToArray(); #endregion #region Models List<string> models = new List<string>(); foreach (var entityPair in ent) { foreach (var entity in entityPair.Value) { if (entity.ContainsKey("model")) { string model = entity["model"]; if (!model.EndsWith(".mdl")) { continue; } if (!models.Contains(model)) { models.Add(model); } } } } res.UsedModels = models.ToArray(); List<string> missingModels = new List<string>(); foreach (var model in models) { ValveFile file = GetFile(model); if (file == null) { missingModels.Add(model); } } res.MissingModels = missingModels.ToArray(); #endregion } List<string> usedFileList = new List<string>(); usedFileList.AddRange(res.UsedSprites); usedFileList.AddRange(res.UsedSounds); usedFileList.AddRange(res.UsedModels); usedFileList.Sort(); res.UsedFileList = usedFileList.ToArray(); List<string> missingFileList = new List<string>(); missingFileList.AddRange(res.MissingSprites); missingFileList.AddRange(res.MissingSounds); missingFileList.AddRange(res.MissingModels); missingFileList.Sort(); res.MissingFileList = missingFileList.ToArray(); return res; }