diff --git a/SabreTools.Library/DatFiles/DatFile.cs b/SabreTools.Library/DatFiles/DatFile.cs index fe21090c..7fc24aec 100644 --- a/SabreTools.Library/DatFiles/DatFile.cs +++ b/SabreTools.Library/DatFiles/DatFile.cs @@ -451,6 +451,27 @@ namespace SabreTools.Library.DatFiles _datHeader.ExcludeOf = value; } } + public List ExcludeFields + { + get + { + if (_datHeader == null) + { + _datHeader = new DatHeader(); + } + + return _datHeader.ExcludeFields; + } + set + { + if (_datHeader == null) + { + _datHeader = new DatHeader(); + } + + _datHeader.ExcludeFields = value; + } + } public bool OneRom { get diff --git a/SabreTools.Library/DatFiles/DatHeader.cs b/SabreTools.Library/DatFiles/DatHeader.cs index 8aacf401..afa16abf 100644 --- a/SabreTools.Library/DatFiles/DatHeader.cs +++ b/SabreTools.Library/DatFiles/DatHeader.cs @@ -32,6 +32,7 @@ namespace SabreTools.Library.DatFiles private ForcePacking _forcePacking; private DatFormat _datFormat; private bool _excludeOf; + private List _excludeFields; private bool _oneRom; private bool _keepEmptyGames; private bool _sceneDateStrip; @@ -149,6 +150,11 @@ namespace SabreTools.Library.DatFiles get { return _excludeOf; } set { _excludeOf = value; } } + public List ExcludeFields + { + get { return _excludeFields; } + set { _excludeFields = value; } + } public bool OneRom { get { return _oneRom; } @@ -255,6 +261,7 @@ namespace SabreTools.Library.DatFiles _forcePacking = this._forcePacking, _datFormat = this._datFormat, _excludeOf = this._excludeOf, + _excludeFields = this._excludeFields, _oneRom = this._oneRom, _keepEmptyGames = this._keepEmptyGames, _sceneDateStrip = this._sceneDateStrip, diff --git a/SabreTools.Library/Data/Enums.cs b/SabreTools.Library/Data/Enums.cs index e9c303c8..0f741ff8 100644 --- a/SabreTools.Library/Data/Enums.cs +++ b/SabreTools.Library/Data/Enums.cs @@ -357,6 +357,68 @@ #region DatItem related + /// + /// List of valid field types within a DatItem/Machine + /// + public enum Field + { + NULL, + + // Generic DatItem + Name, + PartName, + PartInterface, + Features, + AreaName, + AreaSize, + + // Machine + MachineName, + Comment, + Description, + Year, + Manufacturer, + Publisher, + RomOf, + CloneOf, + SampleOf, + Supported, + SourceFile, + Runnable, + Board, + RebuildTo, + Devices, + SlotOptions, + Infos, + MachineType, + + // BiosSet + Default, + + // Disk + MD5, + SHA1, + SHA256, + SHA384, + SHA512, + Merge, + Region, + Index, + Writable, + Optional, + Status, + + // Release + Language, + Date, + + // Rom + Bios, + Size, + CRC, + Offset, + } + /// /// Determine what type of file an item is /// diff --git a/SabreTools.Library/Tools/Utilities.cs b/SabreTools.Library/Tools/Utilities.cs index 46872a4a..04efd40a 100644 --- a/SabreTools.Library/Tools/Utilities.cs +++ b/SabreTools.Library/Tools/Utilities.cs @@ -786,6 +786,106 @@ namespace SabreTools.Library.Tools } } + /// + /// Get Field value from input string + /// + /// String to get value from + /// Field value corresponding to the string + public static Field GetField(string input) + { + switch (input?.ToLowerInvariant()) + { + case "areaname": + return Field.AreaName; + case "areasize": + return Field.AreaSize; + case "bios": + return Field.Bios; + case "board": + return Field.Board; + case "cloneof": + return Field.CloneOf; + case "comment": + return Field.Comment; + case "crc": + return Field.CRC; + case "default": + return Field.Default; + case "date": + return Field.Date; + case "description": + return Field.Description; + case "devices": + return Field.Devices; + case "features": + return Field.Features; + case "gamename": + case "machinename": + return Field.MachineName; + case "gametype": + case "machinetype": + return Field.MachineType; + case "index": + return Field.Index; + case "infos": + return Field.Infos; + case "language": + return Field.Language; + case "manufacturer": + return Field.Manufacturer; + case "md5": + return Field.MD5; + case "merge": + return Field.Merge; + case "name": + return Field.Name; + case "offset": + return Field.Offset; + case "optional": + return Field.Optional; + case "partinterface": + return Field.PartInterface; + case "partname": + return Field.PartName; + case "publisher": + return Field.Publisher; + case "rebuildto": + return Field.RebuildTo; + case "region": + return Field.Region; + case "romof": + return Field.RomOf; + case "runnable": + return Field.Runnable; + case "sampleof": + return Field.SampleOf; + case "sha1": + return Field.SHA1; + case "sha256": + return Field.SHA256; + case "sha384": + return Field.SHA384; + case "sha512": + return Field.SHA512; + case "size": + return Field.Size; + case "slotoptions": + return Field.SlotOptions; + case "sourcefile": + return Field.SourceFile; + case "status": + return Field.Status; + case "supported": + return Field.Supported; + case "writable": + return Field.Writable; + case "year": + return Field.Year; + default: + return Field.NULL; + } + } + /// /// Get ForceMerging value from input string /// diff --git a/SabreTools/SabreTools.Help.cs b/SabreTools/SabreTools.Help.cs index 09efd6cf..111c60aa 100644 --- a/SabreTools/SabreTools.Help.cs +++ b/SabreTools/SabreTools.Help.cs @@ -1560,6 +1560,18 @@ namespace SabreTools longDescription: "User-supplied DAT for use in all operations. Multiple instances of this flag are allowed."); } } + private static Feature _excludeFieldListInput + { + get + { + return new Feature( + "exclude-field", + new List() { "-ef", "--exclude-field" }, + "Exclude a game/rom field from outputs", + FeatureType.List, + longDescription: "Exclude any valid item or machine field from outputs. Examples include: romof, publisher, and offset."); + } + } // TODO: ADD THIS TO USED FLAGS private static Feature _extaListInput { get @@ -1920,6 +1932,18 @@ Possible values are: Possible values are: None, Good, BadDump, Nodump, Verified"); } } + private static Feature _updateFieldListInput + { + get + { + return new Feature( + "update-field", + new List() { "-uf", "--update-field" }, + "Update a game/rom field from base DAT(s)", + FeatureType.List, + longDescription: "Update any valid item or machine field from base DAT(s). Examples include: romof, publisher, and offset."); + } + } // TODO: ADD THIS TO USED FLAGS #endregion diff --git a/SabreTools/SabreTools.cs b/SabreTools/SabreTools.cs index 6133c594..94b8019f 100644 --- a/SabreTools/SabreTools.cs +++ b/SabreTools/SabreTools.cs @@ -118,6 +118,7 @@ namespace SabreTools List exta = new List(); List extb = new List(); List inputs = new List(); + List updateFields = new List(); // Get the first argument as a feature flag string feature = args[0]; @@ -637,6 +638,12 @@ namespace SabreTools case "dat": datfiles.AddRange((List)feat.Value.GetValue()); break; + case "exclude-field": // TODO: Use this + foreach (string field in (List)feat.Value.GetValue()) + { + datHeader.ExcludeFields.Add(Utilities.GetField(field)); + } + break; case "exta": exta.AddRange((List)feat.Value.GetValue()); break; @@ -741,6 +748,12 @@ namespace SabreTools filter.ItemStatuses |= Utilities.GetItemStatus(stat); } break; + case "update-field": // TODO: Use this + foreach (string field in (List)feat.Value.GetValue()) + { + updateFields.Add(Utilities.GetField(field)); + } + break; #endregion