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)); }
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); }
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)); }