예제 #1
0
        public List <string> GetAllPaths()
        {
            List <string> returner = new List <string>();

            //Look in map file first
            if (ProjectProperties.CurrentProjectPropperties.InputMap != null &&
                ProjectProperties.CurrentProjectPropperties.InputMap.Exists)
            {
                if (ProjectProperties.CurrentProjectPropperties.InputMap is FileInfo)
                {
                    using (
                        MpqEditor.MpqReader reader =
                            new MpqEditor.MpqReader(ProjectProperties.CurrentProjectPropperties.InputMap.FullName))
                    {
                        string[] files = reader.FindFiles(SupportedFiles);
                        foreach (string file in files)
                        {
                            if (!returner.Contains(file))
                            {
                                returner.Add(file);
                            }
                        }
                    }
                }
            }
            //Look in standard library after
            if (Options.General.SC2Exe == null ||
                !Options.General.SC2Exe.Exists)
            {
                RegistryKey key = Registry.LocalMachine;
                key = key.OpenSubKey("SOFTWARE\\Wow6432Node\\Blizzard Entertainment\\Starcraft II Retail");
                Options.General.SC2Exe = new FileInfo((string)key.GetValue("GamePath"));
            }
            string sc2Dir = Options.General.SC2Exe.Directory.FullName;

            //no need to find new versions, just peek into the data directory to get all file path.
            //SC2Assets\Assets\Textures

            DirectoryInfo versionDir = new DirectoryInfo(Options.General.SC2Exe.Directory + @"\SC2Data");
            String        strModDir  = versionDir.FullName;

            using (CascStorageContext casc = new CascStorageContext(strModDir))
            {
                var files = casc.SearchFiles("*");//currently, only * operation is supported.

                foreach (var file in files)
                {
                    //ignore
                    if (!file.FileName.Contains(@"base.sc2assets/Assets/Textures/"))
                    {
                        continue;
                    }
                    bool supported = false;
                    foreach (var ftype in SupportedFiles)
                    {
                        if (file.FileName.EndsWith(ftype.Substring(1)))
                        {
                            supported = true;
                        }
                    }
                    if (!supported)
                    {
                        continue;
                    }
                    //add files to returner
                    if (!returner.Contains(file.FileName))
                    {
                        returner.Add(file.FileName);
                    }
                }
            }

            //look in mod directories

            Stack <DirectoryInfo> modDirs = new Stack <DirectoryInfo>();

            modDirs.Push(new DirectoryInfo(Options.General.SC2Exe.Directory + @"\Mods"));

            List <FileInfo> modfiles = new List <FileInfo>();

            //parse base mods and store SC2Mod files
            while (modDirs.Count != 0)
            {
                DirectoryInfo curVdir = modDirs.Pop();
                if (!curVdir.Exists)
                {
                    continue;
                }

                foreach (var subDir in curVdir.GetDirectories())
                {
                    List <FileInfo> filesToSearch = new List <FileInfo>();

                    filesToSearch.AddRange(subDir.GetFiles("*.SC2Mod"));

                    if (filesToSearch.Count > 0)
                    {
                        modfiles.AddRange(filesToSearch);
                    }

                    filesToSearch.Clear();
                }
            }

            //Read Assets\Textures\files
            foreach (var archive in modfiles)
            {
                MpqEditor.MpqReader fileReader = new MpqEditor.MpqReader(archive.FullName);
                {
                    if (!fileReader.Valid)
                    {
                        continue;
                    }

                    //fileReader.FindFiles("*.SC2Data");
                    foreach (var supportedfile in SupportedFiles)
                    {
                        string[] textureFiles = fileReader.FindFiles("Assets\\Textures\\" + supportedfile);
                        foreach (var imagefile in textureFiles)
                        {
                            if (!returner.Contains(imagefile))
                            {
                                returner.Add(imagefile);
                            }
                        }
                    }
                    fileReader.Dispose();
                }
            }


            //no need to find new versions

            //StarCraft II\Versions\<newest>\patch.SC2Archive\Mods\Core.SC2Mod\Base.SC2Assets\Assets\Textures\..
            //StarCraft II\Versions\<newest>\patch.SC2Archive\Mods\Liberty.SC2Mod\Base.SC2Assets\Assets\Textures\..
            //StarCraft II\Versions\<newest>\patch.SC2Archive\Campaigns\Liberty.SC2Campaign\Base.SC2Assets\Assets\Textures\..
            //StarCraft II\Mods\Core.SC2Mod\base.SC2Assets\Assets\Textures\..
            //StarCraft II\Mods\Liberty.SC2Mod\base.SC2Assets\Assets\Textures\..
            //StarCraft II\Mods\Liberty.SC2Mod\enGB.SC2Assets\Assets\Textures\..

            //StarCraft II\*.SC2Assets|Assets\Textures\..
            returner.Sort();
            return(returner);
        }