public static bool CreateBuildFile(EModType modtype, ref List <ArchiveCommandStruct> archive_commands, string tempFolder, string sourceFolder, string bigFileName) { if (!Directory.Exists(tempFolder)) { ArchiveErrorMessage = string.Format("Can't access TEMP folder: '{0}'", tempFolder); return(false); } if (!Directory.Exists(sourceFolder)) { ArchiveErrorMessage = string.Format("Can't access MOD folder: '{0}'", sourceFolder); return(false); } GetFileList(sourceFolder); if (DirList.Count == 0) { ArchiveErrorMessage = string.Format("No files were found in MOD folder: '{0}'", sourceFolder); return(false); } string configFile = string.Format("{0}\\config.txt", sourceFolder); for (int k = 0; k < DirList.Count; k++) { if (string.Equals(DirList[k], configFile, StringComparison.OrdinalIgnoreCase)) { DirList.RemoveAt(k); break; } } string jpgFile = string.Format("{0}\\preview.jpg", sourceFolder); for (int m = 0; m < DirList.Count; m++) { if (string.Equals(DirList[m], jpgFile, StringComparison.OrdinalIgnoreCase)) { DirList.RemoveAt(m); break; } } string pngFile = string.Format("{0}\\preview.png", sourceFolder); for (int i2 = 0; i2 < DirList.Count; i2++) { if (string.Equals(DirList[i2], pngFile, StringComparison.OrdinalIgnoreCase)) { DirList.RemoveAt(i2); break; } } if (modtype == EModType.MODTYPE_Mod) { string buildfileName4 = tempFolder + "\\buildfile.txt"; try { using (StreamWriter streamWriter = new StreamWriter(buildfileName4)) { streamWriter.WriteLine("Archive name=\"{0}\"", bigFileName); streamWriter.WriteLine("TOCStart name=\"TOC{0}\" alias=\"Data\" relativeroot=\"\"", bigFileName); streamWriter.WriteLine("FileSettingsStart defcompression=\"1\""); streamWriter.WriteLine("Override wildcard=\"*.*\" minsize=\"-1\" maxsize=\"100\" ct=\"0\""); streamWriter.WriteLine("Override wildcard=\"*.mp3\" minsize=\"-1\" maxsize=\"-1\" ct=\"0\""); streamWriter.WriteLine("Override wildcard=\"*.wav\" minsize=\"-1\" maxsize=\"-1\" ct=\"0\""); streamWriter.WriteLine("Override wildcard=\"*.jpg\" minsize=\"-1\" maxsize=\"-1\" ct=\"0\""); streamWriter.WriteLine("Override wildcard=\"*.lua\" minsize=\"-1\" maxsize=\"-1\" ct=\"2\""); streamWriter.WriteLine("Override wildcard=\"*.fda\" minsize=\"-1\" maxsize=\"-1\" ct=\"0\""); streamWriter.WriteLine("Override wildcard=\"*.txt\" minsize=\"-1\" maxsize=\"-1\" ct=\"2\""); streamWriter.WriteLine("Override wildcard=\"*.ship\" minsize=\"-1\" maxsize=\"-1\" ct=\"2\""); streamWriter.WriteLine("Override wildcard=\"*.resource\" minsize=\"-1\" maxsize=\"-1\" ct=\"2\""); streamWriter.WriteLine("Override wildcard=\"*.pebble\" minsize=\"-1\" maxsize=\"-1\" ct=\"2\""); streamWriter.WriteLine("Override wildcard=\"*.level\" minsize=\"-1\" maxsize=\"-1\" ct=\"2\""); streamWriter.WriteLine("Override wildcard=\"*.wepn\" minsize=\"-1\" maxsize=\"-1\" ct=\"2\""); streamWriter.WriteLine("Override wildcard=\"*.subs\" minsize=\"-1\" maxsize=\"-1\" ct=\"2\""); streamWriter.WriteLine("Override wildcard=\"*.miss\" minsize=\"-1\" maxsize=\"-1\" ct=\"2\""); streamWriter.WriteLine("Override wildcard=\"*.events\" minsize=\"-1\" maxsize=\"-1\" ct=\"2\""); streamWriter.WriteLine("Override wildcard=\"*.madstate\" minsize=\"-1\" maxsize=\"-1\" ct=\"2\""); streamWriter.WriteLine("Override wildcard=\"*.script\" minsize=\"-1\" maxsize=\"-1\" ct=\"2\""); streamWriter.WriteLine("Override wildcard=\"*.ti\" minsize=\"-1\" maxsize=\"-1\" ct=\"2\""); streamWriter.WriteLine("Override wildcard=\"*.st\" minsize=\"-1\" maxsize=\"-1\" ct=\"2\""); streamWriter.WriteLine("Override wildcard=\"*.vp\" minsize=\"-1\" maxsize=\"-1\" ct=\"2\""); streamWriter.WriteLine("Override wildcard=\"*.wf\" minsize=\"-1\" maxsize=\"-1\" ct=\"2\""); streamWriter.WriteLine("SkipFile wildcard=\"Keeper.txt\" minsize=\"-1\" maxsize=\"-1\""); streamWriter.WriteLine("SkipFile wildcard=\"*.big\" minsize=\"-1\" maxsize=\"-1\""); streamWriter.WriteLine("SkipFile wildcard=\"*_.*\" minsize=\"-1\" maxsize=\"-1\""); streamWriter.WriteLine("FileSettingsEnd"); for (int n = 0; n < DirList.Count; n++) { streamWriter.WriteLine("{0}", DirList[n]); } streamWriter.WriteLine("TOCEnd"); } ArchiveCommandStruct command_struct = default(ArchiveCommandStruct); command_struct.arg_string = string.Format("-a \"{0}\\{1}.big\" -c \"{2}\" -r \"{3}\" -v", tempFolder, bigFileName, buildfileName4, sourceFolder); command_struct.buildfilename = buildfileName4; archive_commands.Add(command_struct); } catch (Exception ex4) { ArchiveErrorMessage = string.Format("Error writing to 'buildfile.txt' for main TOC in the TEMP folder! {0}", ex4.Message); return(false); } } if (modtype == EModType.MODTYPE_Mod || modtype == EModType.MODTYPE_Locale) { for (int locale_index = 0; locale_index < LocaleList.Count; locale_index++) { string buildfileName = string.Format("{0}\\buildfile_locale_{1}.txt", tempFolder, locale_index); try { using (StreamWriter sw = new StreamWriter(buildfileName)) { sw.WriteLine("Archive name=\"{0}{1}\"", bigFileName, LocaleList[locale_index].LocaleLanguage); sw.WriteLine("TOCStart name=\"TOC{0}{1}\" alias=\"Locale\" relativeroot=\"Locale\\{2}\"", bigFileName, LocaleList[locale_index].LocaleLanguage, LocaleList[locale_index].LocaleLanguage); sw.WriteLine("FileSettingsStart defcompression=\"1\""); sw.WriteLine("Override wildcard=\"*.*\" minsize=\"-1\" maxsize=\"100\" ct=\"0\""); sw.WriteLine("Override wildcard=\"*.lua\" minsize=\"-1\" maxsize=\"-1\" ct=\"2\""); sw.WriteLine("Override wildcard=\"*.dat\" minsize=\"-1\" maxsize=\"-1\" ct=\"2\""); sw.WriteLine("Override wildcard=\"*.ucs\" minsize=\"-1\" maxsize=\"-1\" ct=\"2\""); sw.WriteLine("SkipFile wildcard=\"*.mp3\" minsize=\"-1\" maxsize=\"-1\""); sw.WriteLine("SkipFile wildcard=\"*.wav\" minsize=\"-1\" maxsize=\"-1\""); sw.WriteLine("SkipFile wildcard=\"*.jpg\" minsize=\"-1\" maxsize=\"-1\""); sw.WriteLine("SkipFile wildcard=\"*.fda\" minsize=\"-1\" maxsize=\"-1\""); sw.WriteLine("SkipFile wildcard=\"*.ship\" minsize=\"-1\" maxsize=\"-1\""); sw.WriteLine("SkipFile wildcard=\"*.resource\" minsize=\"-1\" maxsize=\"-1\""); sw.WriteLine("SkipFile wildcard=\"*.pebble\" minsize=\"-1\" maxsize=\"-1\""); sw.WriteLine("SkipFile wildcard=\"*.level\" minsize=\"-1\" maxsize=\"-1\""); sw.WriteLine("SkipFile wildcard=\"*.wepn\" minsize=\"-1\" maxsize=\"-1\""); sw.WriteLine("SkipFile wildcard=\"*.subs\" minsize=\"-1\" maxsize=\"-1\""); sw.WriteLine("SkipFile wildcard=\"*.miss\" minsize=\"-1\" maxsize=\"-1\""); sw.WriteLine("SkipFile wildcard=\"*.events\" minsize=\"-1\" maxsize=\"-1\""); sw.WriteLine("SkipFile wildcard=\"*.madstate\" minsize=\"-1\" maxsize=\"-1\""); sw.WriteLine("SkipFile wildcard=\"*.script\" minsize=\"-1\" maxsize=\"-1\""); sw.WriteLine("SkipFile wildcard=\"*.big\" minsize=\"-1\" maxsize=\"-1\""); sw.WriteLine("SkipFile wildcard=\"*_.*\" minsize=\"-1\" maxsize=\"-1\""); sw.WriteLine("FileSettingsEnd"); for (int i = 0; i < LocaleList[locale_index].LocaleFileList.Count; i++) { sw.WriteLine("{0}", LocaleList[locale_index].LocaleFileList[i]); } sw.WriteLine("TOCEnd"); } ArchiveCommandStruct command_struct2 = default(ArchiveCommandStruct); command_struct2.arg_string = string.Format("-a \"{0}\\{1}.big\" -c \"{2}\" -r \"{3}\" -v", tempFolder, LocaleList[locale_index].LocaleLanguage, buildfileName, sourceFolder); command_struct2.buildfilename = buildfileName; archive_commands.Add(command_struct2); } catch (Exception ex) { ArchiveErrorMessage = string.Format("Error writing to 'buildfile.txt' for Locale TOC in the TEMP folder! {0}", ex.Message); return(false); } } } if (modtype == EModType.MODTYPE_Cursors) { string buildfileName3 = string.Format("{0}\\buildfile_cursors.txt", tempFolder); try { using (StreamWriter streamWriter2 = new StreamWriter(buildfileName3)) { streamWriter2.WriteLine("Archive name=\"{0}\"", bigFileName); streamWriter2.WriteLine("TOCStart name=\"TOC{0}\" alias=\"Data\" relativeroot=\"\"", bigFileName); streamWriter2.WriteLine("FileSettingsStart defcompression=\"1\""); streamWriter2.WriteLine("Override wildcard=\"*.*\" minsize=\"-1\" maxsize=\"100\" ct=\"0\""); streamWriter2.WriteLine("Override wildcard=\"*.lua\" minsize=\"-1\" maxsize=\"-1\" ct=\"2\""); streamWriter2.WriteLine("Override wildcard=\"*.dds\" minsize=\"-1\" maxsize=\"-1\" ct=\"2\""); streamWriter2.WriteLine("Override wildcard=\"*.anim\" minsize=\"-1\" maxsize=\"-1\" ct=\"2\""); streamWriter2.WriteLine("SkipFile wildcard=\"*.mp3\" minsize=\"-1\" maxsize=\"-1\""); streamWriter2.WriteLine("SkipFile wildcard=\"*.wav\" minsize=\"-1\" maxsize=\"-1\""); streamWriter2.WriteLine("SkipFile wildcard=\"*.jpg\" minsize=\"-1\" maxsize=\"-1\""); streamWriter2.WriteLine("SkipFile wildcard=\"*.fda\" minsize=\"-1\" maxsize=\"-1\""); streamWriter2.WriteLine("SkipFile wildcard=\"*.ship\" minsize=\"-1\" maxsize=\"-1\""); streamWriter2.WriteLine("SkipFile wildcard=\"*.resource\" minsize=\"-1\" maxsize=\"-1\""); streamWriter2.WriteLine("SkipFile wildcard=\"*.pebble\" minsize=\"-1\" maxsize=\"-1\""); streamWriter2.WriteLine("SkipFile wildcard=\"*.level\" minsize=\"-1\" maxsize=\"-1\""); streamWriter2.WriteLine("SkipFile wildcard=\"*.wepn\" minsize=\"-1\" maxsize=\"-1\""); streamWriter2.WriteLine("SkipFile wildcard=\"*.subs\" minsize=\"-1\" maxsize=\"-1\""); streamWriter2.WriteLine("SkipFile wildcard=\"*.miss\" minsize=\"-1\" maxsize=\"-1\""); streamWriter2.WriteLine("SkipFile wildcard=\"*.events\" minsize=\"-1\" maxsize=\"-1\""); streamWriter2.WriteLine("SkipFile wildcard=\"*.madstate\" minsize=\"-1\" maxsize=\"-1\""); streamWriter2.WriteLine("SkipFile wildcard=\"*.script\" minsize=\"-1\" maxsize=\"-1\""); streamWriter2.WriteLine("SkipFile wildcard=\"*.big\" minsize=\"-1\" maxsize=\"-1\""); streamWriter2.WriteLine("SkipFile wildcard=\"*_.*\" minsize=\"-1\" maxsize=\"-1\""); streamWriter2.WriteLine("FileSettingsEnd"); for (int l = 0; l < CursorsList.Count; l++) { streamWriter2.WriteLine("{0}", CursorsList[l]); } streamWriter2.WriteLine("TOCEnd"); } ArchiveCommandStruct command_struct3 = default(ArchiveCommandStruct); command_struct3.arg_string = string.Format("-a \"{0}\\{1}.big\" -c \"{2}\" -r \"{3}\" -v", tempFolder, bigFileName, buildfileName3, sourceFolder); command_struct3.buildfilename = buildfileName3; archive_commands.Add(command_struct3); } catch (Exception ex3) { ArchiveErrorMessage = string.Format("Error writing to 'buildfile.txt' for Cursors TOC in the TEMP folder! {0}", ex3.Message); return(false); } } if (modtype == EModType.MODTYPE_Badges) { string buildfileName2 = string.Format("{0}\\buildfile_badges.txt", tempFolder); try { using (StreamWriter streamWriter3 = new StreamWriter(buildfileName2)) { streamWriter3.WriteLine("Archive name=\"{0}\"", bigFileName); streamWriter3.WriteLine("TOCStart name=\"TOC{0}\" alias=\"Badges\" relativeroot=\"\"", bigFileName); streamWriter3.WriteLine("FileSettingsStart defcompression=\"1\""); streamWriter3.WriteLine("Override wildcard=\"*.*\" minsize=\"-1\" maxsize=\"100\" ct=\"0\""); streamWriter3.WriteLine("Override wildcard=\"*.tga\" minsize=\"-1\" maxsize=\"-1\" ct=\"1\""); streamWriter3.WriteLine("SkipFile wildcard=\"*.mp3\" minsize=\"-1\" maxsize=\"-1\""); streamWriter3.WriteLine("SkipFile wildcard=\"*.wav\" minsize=\"-1\" maxsize=\"-1\""); streamWriter3.WriteLine("SkipFile wildcard=\"*.jpg\" minsize=\"-1\" maxsize=\"-1\""); streamWriter3.WriteLine("SkipFile wildcard=\"*.fda\" minsize=\"-1\" maxsize=\"-1\""); streamWriter3.WriteLine("SkipFile wildcard=\"*.ship\" minsize=\"-1\" maxsize=\"-1\""); streamWriter3.WriteLine("SkipFile wildcard=\"*.resource\" minsize=\"-1\" maxsize=\"-1\""); streamWriter3.WriteLine("SkipFile wildcard=\"*.pebble\" minsize=\"-1\" maxsize=\"-1\""); streamWriter3.WriteLine("SkipFile wildcard=\"*.level\" minsize=\"-1\" maxsize=\"-1\""); streamWriter3.WriteLine("SkipFile wildcard=\"*.wepn\" minsize=\"-1\" maxsize=\"-1\""); streamWriter3.WriteLine("SkipFile wildcard=\"*.subs\" minsize=\"-1\" maxsize=\"-1\""); streamWriter3.WriteLine("SkipFile wildcard=\"*.miss\" minsize=\"-1\" maxsize=\"-1\""); streamWriter3.WriteLine("SkipFile wildcard=\"*.events\" minsize=\"-1\" maxsize=\"-1\""); streamWriter3.WriteLine("SkipFile wildcard=\"*.madstate\" minsize=\"-1\" maxsize=\"-1\""); streamWriter3.WriteLine("SkipFile wildcard=\"*.script\" minsize=\"-1\" maxsize=\"-1\""); streamWriter3.WriteLine("SkipFile wildcard=\"*.lua\" minsize=\"-1\" maxsize=\"-1\" ct=\"2\""); streamWriter3.WriteLine("SkipFile wildcard=\"*.dds\" minsize=\"-1\" maxsize=\"-1\" ct=\"2\""); streamWriter3.WriteLine("SkipFile wildcard=\"*.anim\" minsize=\"-1\" maxsize=\"-1\" ct=\"2\""); streamWriter3.WriteLine("SkipFile wildcard=\"*.big\" minsize=\"-1\" maxsize=\"-1\""); streamWriter3.WriteLine("SkipFile wildcard=\"*_.*\" minsize=\"-1\" maxsize=\"-1\""); streamWriter3.WriteLine("FileSettingsEnd"); for (int j = 0; j < BadgesList.Count; j++) { streamWriter3.WriteLine("{0}", BadgesList[j]); } streamWriter3.WriteLine("TOCEnd"); } ArchiveCommandStruct command_struct4 = default(ArchiveCommandStruct); command_struct4.arg_string = string.Format("-a \"{0}\\{1}.big\" -c \"{2}\" -r \"{3}\" -v", tempFolder, bigFileName, buildfileName2, sourceFolder); command_struct4.buildfilename = buildfileName2; archive_commands.Add(command_struct4); } catch (Exception ex2) { ArchiveErrorMessage = string.Format("Error writing to 'buildfile.txt' for Badges TOC in the TEMP folder! {0}", ex2.Message); return(false); } } return(true); }
private static bool ValidateConfigFile(string filename) { bool bHasTitle = false; bool bHasTags = false; bool bHasGameType = false; bool bHasModType = false; bool bHasBigFilename = false; bool bHasWorkshopID = false; bool bHasDescription = false; bool bAreFollowingLinesDescription = false; title = ""; tags = ""; description = ""; line_number = 0; try { File.SetAttributes(filename, File.GetAttributes(filename) & ~FileAttributes.ReadOnly); } catch { ConfigValidationErrorMessage = "Could not set the config.txt file to NOT be read-only. Verify that you have permission to modify the config.txt file."; return(false); } try { StreamReader sr = File.OpenText(filename); string input4; while ((input4 = sr.ReadLine()) != null) { line_number++; string input_trim = input4.Trim(); if (!(input4 == "") && !(input_trim.Substring(0, 2) == "//")) { string input_lower = input_trim.ToLower(); if (bAreFollowingLinesDescription) { description = description + input4 + '\n'; bHasDescription = true; } else if (input_lower.StartsWith("title:")) { if (bHasTitle) { ConfigValidationErrorMessage = "Title appears more than once. You should only provide a single title for the Workshop item."; sr.Close(); return(false); } input4 = input4.Trim(); title = input4.Substring(6).Trim(); if (title.Length > 128) { title = title.Substring(0, 128); } if (title != "") { bHasTitle = true; } } else if (input_lower.StartsWith("tags:")) { if (bHasTags) { ConfigValidationErrorMessage = "Tags appears more than once. You should only provide a single set of tags for the Workshop item."; sr.Close(); return(false); } input4 = input4.Trim(); tags = input4.Substring(5).Trim(); if (tags != "") { bHasTags = true; } } else if (input_lower.StartsWith("gametype:")) { if (bHasGameType) { ConfigValidationErrorMessage = "GameType appears more than once. You should only provide a single game type for the Workshop item."; sr.Close(); return(false); } string gametype = input_lower.Substring(9).Trim().ToLower(); List <string> options = GetListOfOptions(gametype); for (int i = 0; i < options.Count; i++) { if (options[i] != "hw1classic" && options[i] != "hw2classic" && options[i] != "homeworldrm") { ConfigValidationErrorMessage = "Invalid GameType. GameType must be any of 'HW1Classic', 'HW2Classic', or 'HomeworldRM' (without the single quotes) separated by spaces."; sr.Close(); return(false); } } if (options.Count > 0) { bHasGameType = true; } } else if (input_lower.StartsWith("modtype:")) { if (bHasModType) { ConfigValidationErrorMessage = "ModType appears more than once. You should only provide a single mod type for the Workshop item."; sr.Close(); return(false); } string modtype = input_lower.Substring(9).Trim().ToLower(); if (modtype != "mod" && modtype != "badges" && modtype != "locale" && modtype != "cursors") { ConfigValidationErrorMessage = "Invalid ModType. ModType must be one of 'MOD', 'Badges', 'Locale' or 'Cursors' (without the single quotes)."; sr.Close(); return(false); } ModType = EModType.MODTYPE_Unknown; if (modtype == "mod") { ModType = EModType.MODTYPE_Mod; } else if (modtype == "locale") { ModType = EModType.MODTYPE_Locale; } else if (modtype == "badges") { ModType = EModType.MODTYPE_Badges; } else if (modtype == "cursors") { ModType = EModType.MODTYPE_Cursors; } bHasModType = true; } else if (input_lower.StartsWith("bigfilename:")) { if (bHasBigFilename) { ConfigValidationErrorMessage = "BigFilename appears more than once. You should only provide a single .big file name for the Workshop item."; sr.Close(); return(false); } input4 = input4.Trim(); bigfilename = input4.Substring(12).Trim().Replace(" ", string.Empty); string bigfilename_lower = bigfilename.ToLower(); if (bigfilename_lower == "mymodbigfile") { ConfigValidationErrorMessage = "BigFilename not changed (still using the default of 'MyModBigFile'). You should change BigFilename to be specific to your MOD."; sr.Close(); return(false); } if (bigfilename_lower.EndsWith(".big")) { bigfilename = bigfilename.Substring(0, bigfilename.Length - 4); } if (bigfilename != "") { bHasBigFilename = true; } } else if (input_lower.StartsWith("workshopid:")) { if (bHasWorkshopID) { ConfigValidationErrorMessage = "WorkshopID appears more than once. There should only be a single WorkshopID line in the config file."; sr.Close(); return(false); } string workshopId_string = input_lower.Substring(11).Trim(); if (!ulong.TryParse(workshopId_string, out workshopId)) { ConfigValidationErrorMessage = "WorkshopID value is not a number. The value for WorkshopID should be the ID number of the Workshop item you created or 0 if you haven't created the Workshop item yet."; sr.Close(); return(false); } bHasWorkshopID = true; } else if (input_lower.StartsWith("description:")) { bAreFollowingLinesDescription = true; } else if (!bAreFollowingLinesDescription) { ConfigValidationErrorMessage = string.Format("Unrecognized input: {0}", input_trim); sr.Close(); return(false); } } } sr.Close(); } catch (Exception ex) { ConfigValidationErrorMessage = string.Format("Exeception reading config.txt file ({0})", ex.Message); return(false); } line_number = 0; if (!bHasTitle) { ConfigValidationErrorMessage = "Title not found. You must provide a title for the Workshop item."; return(false); } if (!bHasTags) { ConfigValidationErrorMessage = "Tags not found. You must provide at least one tag for the Workshop item."; return(false); } if (!bHasGameType) { ConfigValidationErrorMessage = "GameType not found. You must provide a game type (HW1Classic, HW2Classic, or HomeworldRM)."; return(false); } if (!bHasModType) { ConfigValidationErrorMessage = "ModType not found. You must provide a ModType type (MOD, Locale, Badges, or Cursors)."; return(false); } if (!bHasBigFilename) { ConfigValidationErrorMessage = "BigFilename not found. You must provide a name for your .big file for your MOD."; return(false); } if (!bHasWorkshopID) { ConfigValidationErrorMessage = "WorkshopID not found. Config.txt file must contain a WorkshopID line."; return(false); } if (!bHasDescription) { ConfigValidationErrorMessage = "Description not found. You must provide a description for the Workshop item."; return(false); } return(true); }