public static void LoadFiles() { const string searchString = "UCP.AICs."; const string ucpFile = "UCP-Bugfix.aic"; if (loaded) { RefreshLocalFiles(); return; } loaded = true; // load resource files int beforeCount = Version.Changes.Count; Assembly asm = Assembly.GetExecutingAssembly(); var names = asm.GetManifestResourceNames().Where(s => s.StartsWith(searchString)); foreach (string str in names.OrderBy(s => s)) { if (!str.StartsWith(searchString)) { continue; } if (!TryLoadCollection(str, true, out AICCollection collection)) { continue; } string name = str.Substring(searchString.Length); bool isUCPFile = name == ucpFile; AICChange change = new AICChange(name, collection, isUCPFile, true); if (isUCPFile) { Version.Changes.Insert(beforeCount, change); } else { Version.Changes.Add(change); } } LoadLocalFiles(false); }
static void LoadLocalFiles(bool add2UI) { string aicFolder = Path.Combine(Configuration.Path, "aic"); // load files if (Directory.Exists(aicFolder)) { foreach (string filePath in Directory.EnumerateFiles(aicFolder, "*.aic")) { if (!TryLoadCollection(filePath, false, out AICCollection collection)) { continue; } AICChange change = new AICChange(Path.GetFileName(filePath), collection); if (add2UI) { change.InitUI(); View.Items.Add(change.UIElement); } Version.Changes.Add(change); } } }
static void DoBinaryChanges(string filePath, bool xtreme, Percentage perc) { fails.Clear(); SectionEditor.Reset(); // only take binary changes var changes = Version.Changes.Where(c => c.IsChecked && c is Change && !(c is ResourceChange) && !(c is StartTroopChange)); List <Change> todoList = new List <Change>(changes); int todoIndex = 0; double todoCount = 9 + todoList.Count; // +2 for AIprops +3 for read, +1 for version edit, +3 for writing data // read original data & section preparation byte[] oriData = File.ReadAllBytes(filePath); byte[] data = (byte[])oriData.Clone(); SectionEditor.Init(data); todoIndex += 3; perc.Set(todoIndex / todoCount); ChangeArgs args = new ChangeArgs(data, oriData); // change version display in main menu try { (xtreme ? Version.MenuChange_XT : Version.MenuChange).Activate(args); } catch (Exception e) { Debug.Error(e); } perc.Set(++todoIndex / todoCount); // change stuff foreach (Change change in todoList) { change.Activate(args); perc.Set(++todoIndex / todoCount); } AICChange.DoChange(args); StartTroopChange.DoChange(args); ResourceChange.DoChange(args); todoIndex += 2; perc.Set(todoIndex / todoCount); // Write everything to file data = SectionEditor.AttachSection(data); if (filePath.EndsWith(BackupFileEnding)) { filePath = filePath.Remove(filePath.Length - BackupFileEnding.Length); } else { File.WriteAllBytes(filePath + BackupFileEnding, oriData); // create backup } File.WriteAllBytes(filePath, data); perc.Set(1); ShowFailures(filePath); }
static void DoChanges(string filePath, bool xtreme, Percentage perc) { fails.Clear(); SectionEditor.Reset(); // only take binary changes var changes = Version.Changes.Where(c => c.IsChecked && c.GetType() == typeof(Change)); List <Change> todoList = new List <Change>(changes); int todoIndex = 0; double todoCount = 9 + todoList.Count; // +2 for AIprops +3 for read, +1 for version edit, +3 for writing data // read original data & section preparation byte[] oriData = File.ReadAllBytes(filePath); byte[] data = (byte[])oriData.Clone(); SectionEditor.Init(data); todoIndex += 3; perc.Set(todoIndex / todoCount); ChangeArgs args = new ChangeArgs(data, oriData); // change version display in main menu try { (xtreme ? Version.MenuChange_XT : Version.MenuChange).Activate(args); } catch (Exception e) { Debug.Error(e); } perc.Set(++todoIndex / todoCount); // change stuff foreach (Change change in todoList) { change.Activate(args); perc.Set(++todoIndex / todoCount); } // change AI properties AICChange.DoEdit(args); todoIndex += 2; perc.Set(todoIndex / todoCount); // Write everything to file data = SectionEditor.AttachSection(data); if (filePath.EndsWith(BackupFileEnding)) { filePath = filePath.Remove(filePath.Length - BackupFileEnding.Length); } else { File.WriteAllBytes(filePath + BackupFileEnding, oriData); // create backup } File.WriteAllBytes(filePath, data); perc.Set(1); // Show failures if (fails.Count > 0) { StringBuilder sb = new StringBuilder(); sb.Append("Version Differences in "); sb.Append(Path.GetFileName(filePath)); sb.AppendLine(":"); foreach (var f in fails) { sb.AppendLine(f.Ident + " " + f.Type); } fails.Clear(); Debug.Show(sb.ToString()); } }
static void DoBinaryChanges(string filePath, bool xtreme, Percentage perc) { fails.Clear(); SectionEditor.Reset(); string gameSeedsFolder = Path.Combine(Configuration.Path, GAME_SEEDS_FOLDER); if (!Directory.Exists(gameSeedsFolder)) { Directory.CreateDirectory(gameSeedsFolder); } // Retrieve set of selected binary changes var changes = Version.Changes.Where(c => c.IsChecked && c is Change && !(c is ResourceChange) && !(c is StartTroopChange)); List <Change> todoList = new List <Change>(changes); int todoIndex = 0; double todoCount = 9 + todoList.Count; // +2 for AIprops +3 for read, +1 for version edit, +3 for writing data // Read original data & perform section preparation adding .ucp section to binary byte[] oriData = File.ReadAllBytes(filePath); byte[] data = (byte[])oriData.Clone(); SectionEditor.Init(data); todoIndex += 3; perc.Set(todoIndex / todoCount); ChangeArgs args = new ChangeArgs(data, oriData); // Change version display in main menu try { (xtreme ? Version.MenuChange_XT : Version.MenuChange).Activate(args); } catch (Exception e) { Debug.Error(e); } perc.Set(++todoIndex / todoCount); // Apply each selected binary change foreach (Change change in todoList) { change.Activate(args); perc.Set(++todoIndex / todoCount); } // Apply changes handled in their respective submodules AICChange.DoChange(args); StartTroopChange.DoChange(args); ResourceChange.DoChange(args); todoIndex += 2; perc.Set(todoIndex / todoCount); // Write everything to file data = SectionEditor.AttachSection(data); if (filePath.EndsWith(BackupFileEnding)) { filePath = filePath.Remove(filePath.Length - BackupFileEnding.Length); } else { File.WriteAllBytes(filePath + BackupFileEnding, oriData); // create backup } File.WriteAllBytes(filePath, data); perc.Set(1); ShowFailures(filePath); }