Esempio n. 1
0
 public static MissionInfo RetrieveInfo(this MapRulesFile rules)
 {
     return(new MissionInfo
            (
                rules.Basic.Name,
                (House)rules.Basic.SideId,
                rules.Basic.MissionNumber
            ));
 }
        private BriefingItem[] GetBriefings()
        {
            string rulesPath = _mission.Source.Rules;

            if (rulesPath != null)
            {
                MapRulesFile rulf = new MapRulesFile();
                rulf.ReadFromFile(rulesPath);

                string prevDir = Directory.GetCurrentDirectory();

                try
                {
                    // Set directory to the rules path, relative paths for images will be resolved from the rules folder path.
                    Directory.SetCurrentDirectory(Path.GetDirectoryName(rulesPath));

                    List <BriefingItem> items = new List <BriefingItem>();
                    // briefing is generated by  Basic.Briefing -> Basic.TextUibBriefingKey -> "No briefing available..."
                    string caption         = rulf.Basic.BriefingCaption;
                    string briefing        = rulf.Basic.Briefing ?? GetText?.Invoke(rulf.Basic.TextUibBriefingKey) ?? "No briefing available...";
                    string briefingImgPath = rulf.Basic.BriefingImage;
                    Image  bImg            = null;
                    try
                    {
                        if (briefingImgPath != null)
                        {
                            bImg = new Bitmap(briefingImgPath);
                        }
                    }
                    catch { } // silent pass for image load failure
                    items.Add(new BriefingItem(caption, briefing, bImg));

                    // Add additional briefings
                    int index = 0;
                    while (index < rulf.AdditionalBriefings.Length)
                    {
                        caption         = rulf.AdditionalBriefings[index].BriefingCaption;
                        briefing        = rulf.AdditionalBriefings[index].Briefing ?? GetText?.Invoke(rulf.AdditionalBriefings[index].TextUibBriefingKey) ?? "No briefing available...";
                        briefingImgPath = rulf.AdditionalBriefings[index].BriefingImage;
                        bImg            = null;
                        try
                        {
                            if (briefingImgPath != null)
                            {
                                bImg = new Bitmap(briefingImgPath);
                            }
                        }
                        catch { } // silent pass for image load failure

                        items.Add(new BriefingItem(caption, briefing, bImg));
                        index++;
                    }

                    // Add unit description items from campaigns
                    if (_unitDesc != null)
                    {
                        foreach (string uD in _unitDesc)
                        {
                            string key = "";
                            if (uD.Contains(":"))
                            {
                                int sep = uD.IndexOf(":");
                                key     = uD.Substring(0, sep);
                                caption = uD.Substring(sep + 1);
                            }
                            else
                            {
                                key     = uD;
                                caption = uD;
                            }
                            string uibkey = "B_" + key;
                            briefing        = GetText?.Invoke(uibkey) ?? "Missing briefing for {0}...".F(caption);
                            briefingImgPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"assets/images", _mission.Info.House.ToString(), "{0}.png".F(key));
                            bImg            = null;
                            try
                            {
                                if (briefingImgPath != null)
                                {
                                    bImg = new Bitmap(briefingImgPath);
                                }
                            }
                            catch { } // silent pass for image load failure

                            items.Add(new BriefingItem(caption, briefing, bImg));
                            index++;
                        }
                    }

                    _briefingItemMax = items.Count;
                    return(items.ToArray());
                }
                catch
                {
                    // ???
                }
                finally
                {
                    Directory.SetCurrentDirectory(prevDir);
                }
            }
            return(null);
        }
Esempio n. 3
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));
        }
Esempio n. 4
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));
        }