using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using static PKHeX.Core.MessageStrings; namespace PKHeX.Core; /// /// Carries out a batch edit and contains information summarizing the results. /// public sealed class BatchEditor { private int Modified { get; set; } private int Iterated { get; set; } private int Failed { get; set; } /// /// Tries to modify the . /// /// Object to modify. /// Filters which must be satisfied prior to any modifications being made. /// Modifications to perform on the . /// Result of the attempted modification. public bool Process(PKM pk, IEnumerable filters, IEnumerable modifications) { if (pk.Species <= 0) return false; if (!pk.Valid) { Iterated++; const string reason = "Not Valid."; Debug.WriteLine($"{MsgBEModifyFailBlocked} {reason}"); return false; } var result = BatchEditing.TryModifyPKM(pk, filters, modifications); if (result != ModifyResult.Invalid) Iterated++; if (result == ModifyResult.Error) Failed++; if (result != ModifyResult.Modified) return false; pk.RefreshChecksum(); Modified++; return true; } /// /// Gets a message indicating the overall result of all modifications performed across multiple Batch Edit jobs. /// /// Collection of modifications. /// Friendly (multi-line) string indicating the result of the batch edits. public string GetEditorResults(ICollection sets) { if (sets.Count == 0) return MsgBEInstructionNone; int ctr = Modified / sets.Count; int len = Iterated / sets.Count; string maybe = sets.Count == 1 ? string.Empty : "~"; string result = string.Format(MsgBEModifySuccess, maybe, ctr, len); if (Failed > 0) result += Environment.NewLine + maybe + string.Format(MsgBEModifyFailError, Failed); return result; } public static BatchEditor Execute(IList lines, IEnumerable data) { var editor = new BatchEditor(); var sets = StringInstructionSet.GetBatchSets(lines).ToArray(); foreach (var pk in data) { foreach (var set in sets) editor.Process(pk, set.Filters, set.Instructions); } return editor; } public void AddSkipped() { ++Iterated; } }