Beispiel #1
0
        public MountResult MountFiles(MissionSourceInfo srcInfo)
        {
            // load map file into memory
            MapFile mapf = new MapFile();

            if (srcInfo.Map == null)
            {
                return(new MountResult(MountErrorType.MAP_UNDEFINED, Resource.Strings.MountError_MAP_UNDEFINED));
            }
            if (!File.Exists(srcInfo.Map))
            {
                return(new MountResult(MountErrorType.MAP_NOTFOUND, Resource.Strings.MountError_MAP_NOTFOUND.F(srcInfo.Map)));
            }
            try
            {
                mapf.ReadFromFile(srcInfo.Map);
            }
            catch (Exception ex)
            {
                return(new MountResult(MountErrorType.MAP_READ_ERROR, Resource.Strings.MountError_MAP_READ_ERROR, ex));
            }

            // load mis file into memory
            MisFile misf = new MisFile();

            if (srcInfo.Mis == null)
            {
                return(new MountResult(MountErrorType.MIS_UNDEFINED, Resource.Strings.MountError_MIS_UNDEFINED));
            }
            if (!File.Exists(srcInfo.Mis))
            {
                return(new MountResult(MountErrorType.MIS_NOTFOUND, Resource.Strings.MountError_MIS_NOTFOUND.F(srcInfo.Mis)));
            }
            try
            {
                misf.ReadFromFile(srcInfo.Mis);
            }
            catch (Exception ex)
            {
                return(new MountResult(MountErrorType.MIS_READ_ERROR, Resource.Strings.MountError_MIS_READ_ERROR, ex));
            }

            // load (optional) rules file into memory
            MapRulesFile rulf = new MapRulesFile();

            if (srcInfo.Rules != null)
            {
                if (!File.Exists(srcInfo.Rules))
                {
                    return(new MountResult(MountErrorType.RULES_NOTFOUND, Resource.Strings.MountError_RULES_NOTFOUND.F(srcInfo.Rules)));
                }
                try
                {
                    rulf.ReadFromFile(srcInfo.Rules);
                }
                catch (Exception ex)
                {
                    return(new MountResult(MountErrorType.RULES_READ_ERROR, Resource.Strings.MountError_RULES_READ_ERROR, ex));
                }
            }

            // load (optional) mod file into memory
            if (srcInfo.Mod != null)
            {
                if (!File.Exists(srcInfo.Mod))
                {
                    return(new MountResult(MountErrorType.MOD_NOTFOUND, Resource.Strings.MountError_MOD_NOTFOUND.F(srcInfo.Mod)));
                }
                ModFile modf = new ModFile();
                try
                {
                    modf.ReadFromFile(srcInfo.Mod);
                }
                catch (Exception ex)
                {
                    return(new MountResult(MountErrorType.MOD_READ_ERROR, Resource.Strings.MountError_MOD_READ_ERROR, ex));
                }

                // apply mod
                try
                {
                    Mod mod = modf.CreateMod();
                    mod.Apply(ref mapf, ref misf);
                }
                catch (Exception ex)
                {
                    return(new MountResult(MountErrorType.MOD_ERROR, Resource.Strings.MountError_MOD_ERROR, ex));
                }
            }

            // define target paths
            string mapPath = MAPFILE_FORMAT.F(MissionDir, RESERVED_MISSION_NAME);
            string misPath = MISFILE_FORMAT.F(MissionDir, RESERVED_MISSION_NAME);
            string rulPath = RULESFILE_FORMAT.F(MissionDir, RESERVED_MISSION_NAME);

            // write map
            try
            {
                mapf.WriteToFile(mapPath);
            }
            catch (Exception ex)
            {
                return(new MountResult(MountErrorType.MAP_WRITE_ERROR, Resource.Strings.MountError_MAP_WRITE_ERROR, ex));
            }

            // write mis
            try
            {
                misf.WriteToFile(misPath);
            }
            catch (Exception ex)
            {
                return(new MountResult(MountErrorType.MIS_WRITE_ERROR, Resource.Strings.MountError_MIS_WRITE_ERROR, ex));
            }

            // write rules, if defined
            if (srcInfo.Rules != null)
            {
                try
                {
                    rulf.WriteToFile(rulPath);
                }
                catch (Exception ex)
                {
                    return(new MountResult(MountErrorType.RULES_WRITE_ERROR, Resource.Strings.MountError_RULES_WRITE_ERROR, ex));
                }
            }

            return(new MountResult(MountErrorType.SUCCESS));
        }
Beispiel #2
0
        public MountResult ImportMissions <T>(string directoryPath, out Registry <T, MissionSet[]> sortedMissions, Func <MissionSet, T> filter)
        {
            sortedMissions = new Registry <T, MissionSet[]>();
            Registry <T, List <MissionSet> > temp = new Registry <T, List <MissionSet> >();

            if (directoryPath == null || !Directory.Exists(directoryPath) || File.Exists(directoryPath))
            {
                return(new MountResult(MountErrorType.INVALID_DIRECTORY, Resource.Strings.MountError_INVALID_DIRECTORY.F(directoryPath)));
            }

            List <string> errorList = new List <string>();

            foreach (string p in Directory.GetFiles(directoryPath, "*" + RULESFILE_EXT, SearchOption.AllDirectories))
            {
                try
                {
                    string dir  = Path.GetDirectoryName(p);
                    string name = Path.GetFileNameWithoutExtension(p);

                    string sMap = MAPFILE_FORMAT.F(dir, name);
                    string sMis = MISFILE_FORMAT.F(dir, name);
                    string sMod = MODFILE_FORMAT.F(dir, name);

                    // Ignore the set if either the map or the mis file does not exist
                    if (!File.Exists(sMap) || !File.Exists(sMis))
                    {
                        continue;
                    }

                    // The mod file is optional, exclude it if not present
                    if (!File.Exists(sMod))
                    {
                        sMod = null;
                    }

                    MissionSourceInfo srcInfo = new MissionSourceInfo(sMap, sMis, p, sMod);

                    // load rules file into memory (if some error occurs, ignore this set)
                    MapRulesFile rulf = new MapRulesFile();
                    try
                    {
                        rulf.ReadFromFile(p);
                        MissionInfo misInfo = rulf.RetrieveInfo();
                        MissionSet  set     = new MissionSet(misInfo, srcInfo);

                        T t = filter(set);
                        if (t != null)
                        {
                            if (temp.Contains(t))
                            {
                                temp[t].Add(set);
                            }
                            else
                            {
                                temp.Add(t, new List <MissionSet> {
                                    set
                                });
                            }
                        }
                    }
                    catch
                    {
                        errorList.Add(p);
                        continue;
                    }
                }
                catch
                {
                    errorList.Add(p);
                    continue;
                }
            }

            foreach (T t in temp.GetKeys())
            {
                sortedMissions.Put(t, temp[t].ToArray());
            }

            if (errorList.Count > 0)
            {
                return(new MountResult(MountErrorType.PARTIAL_ERROR, Resource.Strings.MountError_PARTIAL_ERROR.F(errorList.Count)));
            }
            return(new MountResult(MountErrorType.SUCCESS));
        }