/// <summary> /// Executes the provided <see cref="manip"/> with the provided parameters. /// </summary> /// <param name="manip">Manipulation to perform on the <see cref="SAV"/> box data.</param> /// <param name="box">Single box to modify; if <see cref="allBoxes"/> is set, this param is ignored.</param> /// <param name="allBoxes">Indicates if all boxes are to be manipulated, or just one box.</param> /// <param name="reverse">Manipulation action should be inverted (criteria) or reversed (sort).</param> /// <returns>True if operation succeeded, false if no changes made.</returns> public bool Execute(IBoxManip manip, int box, bool allBoxes, bool reverse = false) { bool usable = manip.Usable.Invoke(SAV); if (!usable) { return(false); } var start = allBoxes ? 0 : box; var stop = allBoxes ? SAV.BoxCount - 1 : box; var param = new BoxManipParam(start, stop, reverse); var prompt = manip.GetPrompt(allBoxes); var fail = manip.GetFail(allBoxes); if (!CanManipulateRegion(param.Start, param.Stop, prompt, fail)) { return(false); } var result = manip.Execute(SAV, param); if (result <= 0) { return(false); } var success = manip.GetSuccess(allBoxes); FinishBoxManipulation(success, allBoxes, result); return(true); }
public abstract int Execute(SaveFile sav, BoxManipParam param);
public bool Equals(BoxManipParam p) => p.Start == Start && p.Stop == Stop && p.Reverse == Reverse;